diff --git a/RemoteBMI.jl/.github/workflows/Docs.yml b/.github/workflows/julia-docs.yml
similarity index 77%
rename from RemoteBMI.jl/.github/workflows/Docs.yml
rename to .github/workflows/julia-docs.yml
index 85e5d84..7df0ab3 100644
--- a/RemoteBMI.jl/.github/workflows/Docs.yml
+++ b/.github/workflows/julia-docs.yml
@@ -1,21 +1,23 @@
-name: Docs
+name: Julia docs
on:
push:
branches:
- main
paths:
- - "docs/**"
- - "src/**"
- - "*.toml"
+ - "RemoteBMI.jl/docs/**"
+ - "RemoteBMI.jl/src/**"
+ - "RemoteBMI.jl/*.toml"
+ - .github/workflows/julia-docs.yml
tags: ["*"]
pull_request:
branches:
- main
paths:
- - "docs/**"
- - "src/**"
- - "*.toml"
+ - "RemoteBMI.jl/docs/**"
+ - "RemoteBMI.jl/src/**"
+ - "RemoteBMI.jl/*.toml"
+ - .github/workflows/julia-docs.yml
types: [opened, synchronize, reopened]
concurrency:
@@ -33,6 +35,7 @@ jobs:
- uses: julia-actions/setup-julia@v2
with:
version: "1"
+ project: './RemoteBMI.jl'
- name: Use Julia cache
uses: julia-actions/cache@v2
- name: Instantiate environment with development version of the package
@@ -41,6 +44,7 @@ jobs:
using Pkg
Pkg.develop(PackageSpec(path=pwd()))
Pkg.instantiate()'
+ working-directory: RemoteBMI.jl
- name: Run doctest
run: |
julia --project=docs -e '
@@ -48,10 +52,11 @@ jobs:
using RemoteBMI
DocMeta.setdocmeta!(RemoteBMI, :DocTestSetup, :(using RemoteBMI); recursive=true)
doctest(RemoteBMI)'
+ working-directory: RemoteBMI.jl
- name: Generate and deploy documentation
run: julia --project=docs docs/make.jl
+ working-directory: RemoteBMI.jl
env:
JULIA_PKG_SERVER: ""
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }}
GKSwstype: "100" # https://discourse.julialang.org/t/generation-of-documentation-fails-qt-qpa-xcb-could-not-connect-to-display/60988
diff --git a/.github/workflows/julia-test-on-prs.yml b/.github/workflows/julia-test-on-prs.yml
index 0088175..feb7bd7 100644
--- a/.github/workflows/julia-test-on-prs.yml
+++ b/.github/workflows/julia-test-on-prs.yml
@@ -8,6 +8,7 @@ on:
- "RemoteBMI.jl/src/**"
- "RemoteBMI.jl/test/**"
- "RemoteBMI.jl/*.toml"
+ - .github/workflows/julia-test-on-prs.yml
types: [opened, synchronize, reopened]
concurrency:
diff --git a/README.md b/README.md
index ab6a32e..7594e9a 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
The [Basic Model Interface (BMI)](https://bmi.readthedocs.io/en/stable/) is a standard interface for models.
The interface is available in different languages and a [language agnosting version in SIDL](https://github.com/csdms/bmi/blob/stable/bmi.sidl).
-To have a consumer of the model and the provider of the model seperated you can use [grpc4bmi](), but this only works on languages that have a grpc implementation.
+To have a consumer of the model and the provider of the model seperated you can use [grpc4bmi](https://grpc4bmi.readthedocs.io/), but this only works on languages that have a grpc implementation.
This repo replaced the gRPC protocol with an REST API.
The [REST API specification](openapi.yaml) is in the [OpenAPI](https://swagger.io/specification/) format.
diff --git a/RemoteBMI.jl/README.md b/RemoteBMI.jl/README.md
index 3652e53..c0b6d03 100644
--- a/RemoteBMI.jl/README.md
+++ b/RemoteBMI.jl/README.md
@@ -37,5 +37,18 @@ The openapi server stubs where generated using the following command:
wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.9.0/openapi-generator-cli-7.9.0.jar -O openapi-generator-cli.jar
java -jar ./openapi-generator-cli.jar generate -i ./openapi.yaml -g julia-server -o julia-server --additional-properties=packageName=BmiServer --additional-properties=exportModels=true
java -jar ./openapi-generator-cli.jar generate -i ./openapi.yaml -g julia-client -o julia-client --additional-properties=packageName=BmiClient --additional-properties=exportModels=true
-# Copy the generated files to RemoteBMI.jl/src/
+# Copy the generated src
+cp -r julia-client/src/* RemoteBMI.jl/src/client/
+cp -r julia-server/src/* RemoteBMI.jl/src/server/
+# Copy the generated docs
+mkdir -p RemoteBMI.jl/docs/src/client/ RemoteBMI.jl/docs/src/server/
+cp -r julia-client/docs RemoteBMI.jl/docs/src/client/docs
+cp -r julia-server/docs RemoteBMI.jl/docs/src/server/
+cp julia-client/README.md RemoteBMI.jl/docs/src/client/
+cp julia-server/README.md RemoteBMI.jl/docs/src/server/
+# Correct links
+touch RemoteBMI.jl/docs/src/client/docs/Int64.md
+touch RemoteBMI.jl/docs/src/client/docs/Float64.md
+touch RemoteBMI.jl/docs/src/server/docs/Int64.md
+touch RemoteBMI.jl/docs/src/server/docs/Float64.md
```
\ No newline at end of file
diff --git a/RemoteBMI.jl/docs/make.jl b/RemoteBMI.jl/docs/make.jl
index 362117b..d4ad64b 100644
--- a/RemoteBMI.jl/docs/make.jl
+++ b/RemoteBMI.jl/docs/make.jl
@@ -12,10 +12,10 @@ const numbered_pages = [
makedocs(;
modules = [RemoteBMI],
authors = "",
- repo = "https://github.com/eWaterCycle/RemoteBMI.jl/blob/{commit}{path}#{line}",
+ repo = "https://github.com/eWaterCycle/remotebmi/blob/{commit}{path}#{line}",
sitename = "RemoteBMI.jl",
- format = Documenter.HTML(; canonical = "https://eWaterCycle.github.io/RemoteBMI.jl"),
+ format = Documenter.HTML(; canonical = "https://eWaterCycle.github.io/remotebmi/RemoteBMI.jl"),
pages = ["index.md"; numbered_pages],
)
-deploydocs(; repo = "github.com/eWaterCycle/RemoteBMI.jl")
+deploydocs(; repo = "github.com/eWaterCycle/remotebmi", dirname="RemoteBMI.jl")
diff --git a/RemoteBMI.jl/docs/src/91-developer.md b/RemoteBMI.jl/docs/src/91-developer.md
index c9ff3f5..cfb9612 100644
--- a/RemoteBMI.jl/docs/src/91-developer.md
+++ b/RemoteBMI.jl/docs/src/91-developer.md
@@ -112,6 +112,15 @@ Here is how you do it:
1. Run `julia> using LiveServer`
1. Run `julia> servedocs()`
+Or
+
+```shell
+# Once
+julia --project=docs -e ' using Pkg;Pkg.develop(PackageSpec(path=pwd()));Pkg.instantiate()'
+# Every time
+julia --project=docs -e ' using LiveServer; servedocs()'
+```
+
## Making a new release
To create a new release, you can follow these simple steps:
diff --git a/RemoteBMI.jl/docs/src/95-reference.md b/RemoteBMI.jl/docs/src/95-reference.md
index 10df28a..1349e14 100644
--- a/RemoteBMI.jl/docs/src/95-reference.md
+++ b/RemoteBMI.jl/docs/src/95-reference.md
@@ -12,6 +12,26 @@ Pages = ["95-reference.md"]
Pages = ["95-reference.md"]
```
+## Server
+
+```@autodocs
+Modules = [RemoteBMI.Server]
+```
+
+## Server generated code
+
+```@autodocs
+Modules = [RemoteBMI.Server.BmiServer]
+```
+
+## Client
+
+```@autodocs
+Modules = [RemoteBMI.Client]
+```
+
+## Client generated code
+
```@autodocs
-Modules = [RemoteBMI]
+Modules = [RemoteBMI.Client.BmiClient]
```
diff --git a/RemoteBMI.jl/docs/src/client/README.md b/RemoteBMI.jl/docs/src/client/README.md
new file mode 100644
index 0000000..13b7ecd
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/README.md
@@ -0,0 +1,89 @@
+# Julia API client for BmiClient
+
+OpenAPI specification for the Basic Modeling Interface (BMI). All functions are described on the [BMI homepage](https://bmi.readthedocs.io/).
+
+
+## Overview
+This API client was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [openapi-spec](https://openapis.org) from a remote server, you can easily generate an API client.
+
+- API version: 2.0
+- Generator version: 7.9.0
+- Build package: org.openapitools.codegen.languages.JuliaClientCodegen
+For more information, please visit [https://www.ewatercycle.org/contact/](https://www.ewatercycle.org/contact/)
+
+
+## Installation
+Place the Julia files generated under the `src` folder in your Julia project. Include BmiClient.jl in the project code.
+It would include the module named BmiClient.
+
+Documentation is generated as markdown files under the `docs` folder. You can include them in your project documentation.
+Documentation is also embedded in Julia which can be used with a Julia specific documentation generator.
+
+## API Endpoints
+
+Class | Method
+------------ | -------------
+*ExchangeItemsApi* | [**get_component_name**](docs/ExchangeItemsApi.md#get_component_name)
**GET** /get_component_name
+*ExchangeItemsApi* | [**get_input_item_count**](docs/ExchangeItemsApi.md#get_input_item_count)
**GET** /get_input_item_count
+*ExchangeItemsApi* | [**get_input_var_names**](docs/ExchangeItemsApi.md#get_input_var_names)
**GET** /get_input_var_names
+*ExchangeItemsApi* | [**get_output_item_count**](docs/ExchangeItemsApi.md#get_output_item_count)
**GET** /get_output_item_count
+*ExchangeItemsApi* | [**get_output_var_names**](docs/ExchangeItemsApi.md#get_output_var_names)
**GET** /get_output_var_names
+*GettersApi* | [**get_value**](docs/GettersApi.md#get_value)
**GET** /get_value/{name}
+*GettersApi* | [**get_value_at_indices**](docs/GettersApi.md#get_value_at_indices)
**POST** /get_value_at_indices/{name}
+*GridInformationApi* | [**get_grid_rank**](docs/GridInformationApi.md#get_grid_rank)
**GET** /get_grid_rank/{grid}
+*GridInformationApi* | [**get_grid_size**](docs/GridInformationApi.md#get_grid_size)
**GET** /get_grid_size/{grid}
+*GridInformationApi* | [**get_grid_type**](docs/GridInformationApi.md#get_grid_type)
**GET** /get_grid_type/{grid}
+*IRFApi* | [**finalize**](docs/IRFApi.md#finalize)
**DELETE** /finalize
+*IRFApi* | [**initialize**](docs/IRFApi.md#initialize)
**POST** /initialize
+*IRFApi* | [**update**](docs/IRFApi.md#update)
**POST** /update
+*IRFApi* | [**update_until**](docs/IRFApi.md#update_until)
**POST** /update_until
+*NURCApi* | [**get_grid_x**](docs/NURCApi.md#get_grid_x)
**GET** /get_grid_x/{grid}
+*NURCApi* | [**get_grid_y**](docs/NURCApi.md#get_grid_y)
**GET** /get_grid_y/{grid}
+*NURCApi* | [**get_grid_z**](docs/NURCApi.md#get_grid_z)
**GET** /get_grid_z/{grid}
+*SettersApi* | [**set_value**](docs/SettersApi.md#set_value)
**POST** /set_value/{name}
+*SettersApi* | [**set_value_at_indices**](docs/SettersApi.md#set_value_at_indices)
**POST** /set_value_at_indices/{name}
+*TimeInformationApi* | [**get_current_time**](docs/TimeInformationApi.md#get_current_time)
**GET** /get_current_time
+*TimeInformationApi* | [**get_end_time**](docs/TimeInformationApi.md#get_end_time)
**GET** /get_end_time
+*TimeInformationApi* | [**get_start_time**](docs/TimeInformationApi.md#get_start_time)
**GET** /get_start_time
+*TimeInformationApi* | [**get_time_step**](docs/TimeInformationApi.md#get_time_step)
**GET** /get_time_step
+*TimeInformationApi* | [**get_time_units**](docs/TimeInformationApi.md#get_time_units)
**GET** /get_time_units
+*UniformRectilinearApi* | [**get_grid_origin**](docs/UniformRectilinearApi.md#get_grid_origin)
**GET** /get_grid_origin/{grid}
+*UniformRectilinearApi* | [**get_grid_shape**](docs/UniformRectilinearApi.md#get_grid_shape)
**GET** /get_grid_shape/{grid}
+*UniformRectilinearApi* | [**get_grid_spacing**](docs/UniformRectilinearApi.md#get_grid_spacing)
**GET** /get_grid_spacing/{grid}
+*UnstructuredApi* | [**get_grid_edge_count**](docs/UnstructuredApi.md#get_grid_edge_count)
**GET** /get_grid_edge_count/{grid}
+*UnstructuredApi* | [**get_grid_edge_nodes**](docs/UnstructuredApi.md#get_grid_edge_nodes)
**GET** /get_grid_edge_nodes/{grid}
+*UnstructuredApi* | [**get_grid_face_count**](docs/UnstructuredApi.md#get_grid_face_count)
**GET** /get_grid_face_count/{grid}
+*UnstructuredApi* | [**get_grid_face_edges**](docs/UnstructuredApi.md#get_grid_face_edges)
**GET** /get_grid_face_edges/{grid}
+*UnstructuredApi* | [**get_grid_face_nodes**](docs/UnstructuredApi.md#get_grid_face_nodes)
**GET** /get_grid_face_nodes/{grid}
+*UnstructuredApi* | [**get_grid_node_count**](docs/UnstructuredApi.md#get_grid_node_count)
**GET** /get_grid_node_count/{grid}
+*UnstructuredApi* | [**get_grid_nodes_per_face**](docs/UnstructuredApi.md#get_grid_nodes_per_face)
**GET** /get_grid_nodes_per_face/{grid}
+*VariableInformationApi* | [**get_var_grid**](docs/VariableInformationApi.md#get_var_grid)
**GET** /get_var_grid/{name}
+*VariableInformationApi* | [**get_var_itemsize**](docs/VariableInformationApi.md#get_var_itemsize)
**GET** /get_var_itemsize/{name}
+*VariableInformationApi* | [**get_var_location**](docs/VariableInformationApi.md#get_var_location)
**GET** /get_var_location/{name}
+*VariableInformationApi* | [**get_var_nbytes**](docs/VariableInformationApi.md#get_var_nbytes)
**GET** /get_var_nbytes/{name}
+*VariableInformationApi* | [**get_var_type**](docs/VariableInformationApi.md#get_var_type)
**GET** /get_var_type/{name}
+*VariableInformationApi* | [**get_var_units**](docs/VariableInformationApi.md#get_var_units)
**GET** /get_var_units/{name}
+
+
+## Models
+
+ - [GetComponentNameResponse](docs/GetComponentNameResponse.md)
+ - [GetGridTypeResponse](docs/GetGridTypeResponse.md)
+ - [GetTimeUnitsResponse](docs/GetTimeUnitsResponse.md)
+ - [GetVarLocationResponseLocation](docs/GetVarLocationResponseLocation.md)
+ - [GetVarTypeResponse](docs/GetVarTypeResponse.md)
+ - [GetVarUnitsResponse](docs/GetVarUnitsResponse.md)
+ - [InitializeRequest](docs/InitializeRequest.md)
+ - [ProblemDetails](docs/ProblemDetails.md)
+ - [SetValueAtIndicesRequest](docs/SetValueAtIndicesRequest.md)
+
+
+
+## Authorization
+Endpoints do not require authorization.
+
+
+## Author
+
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/ExchangeItemsApi.md b/RemoteBMI.jl/docs/src/client/docs/ExchangeItemsApi.md
new file mode 100644
index 0000000..1579c7f
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/ExchangeItemsApi.md
@@ -0,0 +1,143 @@
+# ExchangeItemsApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_component_name**](ExchangeItemsApi.md#get_component_name) | **GET** /get_component_name |
+[**get_input_item_count**](ExchangeItemsApi.md#get_input_item_count) | **GET** /get_input_item_count |
+[**get_input_var_names**](ExchangeItemsApi.md#get_input_var_names) | **GET** /get_input_var_names |
+[**get_output_item_count**](ExchangeItemsApi.md#get_output_item_count) | **GET** /get_output_item_count |
+[**get_output_var_names**](ExchangeItemsApi.md#get_output_var_names) | **GET** /get_output_var_names |
+
+
+# **get_component_name**
+> get_component_name(_api::ExchangeItemsApi; _mediaType=nothing) -> GetComponentNameResponse, OpenAPI.Clients.ApiResponse
+> get_component_name(_api::ExchangeItemsApi, response_stream::Channel; _mediaType=nothing) -> Channel{ GetComponentNameResponse }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the name of the model component.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+[**GetComponentNameResponse**](GetComponentNameResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_input_item_count**
+> get_input_item_count(_api::ExchangeItemsApi; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_input_item_count(_api::ExchangeItemsApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+The number of variables the model can use from other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_input_var_names**
+> get_input_var_names(_api::ExchangeItemsApi; _mediaType=nothing) -> Vector{String}, OpenAPI.Clients.ApiResponse
+> get_input_var_names(_api::ExchangeItemsApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Vector{String} }, OpenAPI.Clients.ApiResponse
+
+
+
+Gets an array of names for the variables the model can use from other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Vector{String}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_output_item_count**
+> get_output_item_count(_api::ExchangeItemsApi; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_output_item_count(_api::ExchangeItemsApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+The number of variables the model can provide other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_output_var_names**
+> get_output_var_names(_api::ExchangeItemsApi; _mediaType=nothing) -> Vector{String}, OpenAPI.Clients.ApiResponse
+> get_output_var_names(_api::ExchangeItemsApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Vector{String} }, OpenAPI.Clients.ApiResponse
+
+
+
+Gets an array of names for the variables the model can provide to other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Vector{String}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/Float64.md b/RemoteBMI.jl/docs/src/client/docs/Float64.md
new file mode 100644
index 0000000..e69de29
diff --git a/RemoteBMI.jl/docs/src/client/docs/GetComponentNameResponse.md b/RemoteBMI.jl/docs/src/client/docs/GetComponentNameResponse.md
new file mode 100644
index 0000000..f6376fc
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GetComponentNameResponse.md
@@ -0,0 +1,12 @@
+# GetComponentNameResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**name** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/GetGridTypeResponse.md b/RemoteBMI.jl/docs/src/client/docs/GetGridTypeResponse.md
new file mode 100644
index 0000000..5d5c4af
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GetGridTypeResponse.md
@@ -0,0 +1,12 @@
+# GetGridTypeResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**type** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/GetTimeUnitsResponse.md b/RemoteBMI.jl/docs/src/client/docs/GetTimeUnitsResponse.md
new file mode 100644
index 0000000..47d7380
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GetTimeUnitsResponse.md
@@ -0,0 +1,12 @@
+# GetTimeUnitsResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**units** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/GetVarLocationResponseLocation.md b/RemoteBMI.jl/docs/src/client/docs/GetVarLocationResponseLocation.md
new file mode 100644
index 0000000..8e3ea5a
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GetVarLocationResponseLocation.md
@@ -0,0 +1,12 @@
+# GetVarLocationResponseLocation
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**location** | **String** | | [default to "node"]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/GetVarTypeResponse.md b/RemoteBMI.jl/docs/src/client/docs/GetVarTypeResponse.md
new file mode 100644
index 0000000..ab3e1df
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GetVarTypeResponse.md
@@ -0,0 +1,12 @@
+# GetVarTypeResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**type** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/GetVarUnitsResponse.md b/RemoteBMI.jl/docs/src/client/docs/GetVarUnitsResponse.md
new file mode 100644
index 0000000..7b86ada
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GetVarUnitsResponse.md
@@ -0,0 +1,12 @@
+# GetVarUnitsResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**units** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/GettersApi.md b/RemoteBMI.jl/docs/src/client/docs/GettersApi.md
new file mode 100644
index 0000000..604af62
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GettersApi.md
@@ -0,0 +1,71 @@
+# GettersApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_value**](GettersApi.md#get_value) | **GET** /get_value/{name} |
+[**get_value_at_indices**](GettersApi.md#get_value_at_indices) | **POST** /get_value_at_indices/{name} |
+
+
+# **get_value**
+> get_value(_api::GettersApi, name::String; _mediaType=nothing) -> Vector{Float64}, OpenAPI.Clients.ApiResponse
+> get_value(_api::GettersApi, response_stream::Channel, name::String; _mediaType=nothing) -> Channel{ Vector{Float64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the value of a variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **GettersApi** | API context |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_value_at_indices**
+> get_value_at_indices(_api::GettersApi, name::String, request_body::Vector{Int64}; _mediaType=nothing) -> Vector{Float64}, OpenAPI.Clients.ApiResponse
+> get_value_at_indices(_api::GettersApi, response_stream::Channel, name::String, request_body::Vector{Int64}; _mediaType=nothing) -> Channel{ Vector{Float64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the value of a variable at specific indices.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **GettersApi** | API context |
+**name** | **String**| | [default to nothing]
+**request_body** | [**Vector{Int64}**](Int64.md)| |
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/GridInformationApi.md b/RemoteBMI.jl/docs/src/client/docs/GridInformationApi.md
new file mode 100644
index 0000000..601501d
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/GridInformationApi.md
@@ -0,0 +1,101 @@
+# GridInformationApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_rank**](GridInformationApi.md#get_grid_rank) | **GET** /get_grid_rank/{grid} |
+[**get_grid_size**](GridInformationApi.md#get_grid_size) | **GET** /get_grid_size/{grid} |
+[**get_grid_type**](GridInformationApi.md#get_grid_type) | **GET** /get_grid_type/{grid} |
+
+
+# **get_grid_rank**
+> get_grid_rank(_api::GridInformationApi, grid::Int64; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_grid_rank(_api::GridInformationApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Given a grid identifier, get the rank (the number of dimensions) of that grid as an integer.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **GridInformationApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_size**
+> get_grid_size(_api::GridInformationApi, grid::Int64; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_grid_size(_api::GridInformationApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Given a grid identifier, get the total number of elements (or nodes) of that grid as an integer.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **GridInformationApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_type**
+> get_grid_type(_api::GridInformationApi, grid::Int64; _mediaType=nothing) -> GetGridTypeResponse, OpenAPI.Clients.ApiResponse
+> get_grid_type(_api::GridInformationApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ GetGridTypeResponse }, OpenAPI.Clients.ApiResponse
+
+
+
+Given a grid identifier, get the type of that grid as a string.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **GridInformationApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+[**GetGridTypeResponse**](GetGridTypeResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/IRFApi.md b/RemoteBMI.jl/docs/src/client/docs/IRFApi.md
new file mode 100644
index 0000000..7d1495d
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/IRFApi.md
@@ -0,0 +1,124 @@
+# IRFApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**finalize**](IRFApi.md#finalize) | **DELETE** /finalize |
+[**initialize**](IRFApi.md#initialize) | **POST** /initialize |
+[**update**](IRFApi.md#update) | **POST** /update |
+[**update_until**](IRFApi.md#update_until) | **POST** /update_until |
+
+
+# **finalize**
+> finalize(_api::IRFApi; _mediaType=nothing) -> Nothing, OpenAPI.Clients.ApiResponse
+> finalize(_api::IRFApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Nothing }, OpenAPI.Clients.ApiResponse
+
+
+
+Performs all tasks that take place after exiting the model’s time loop.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **initialize**
+> initialize(_api::IRFApi, initialize_request::InitializeRequest; _mediaType=nothing) -> Nothing, OpenAPI.Clients.ApiResponse
+> initialize(_api::IRFApi, response_stream::Channel, initialize_request::InitializeRequest; _mediaType=nothing) -> Channel{ Nothing }, OpenAPI.Clients.ApiResponse
+
+
+
+Performs all tasks that are to take place before entering the model’s time loop.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **IRFApi** | API context |
+**initialize_request** | [**InitializeRequest**](InitializeRequest.md)| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **update**
+> update(_api::IRFApi; _mediaType=nothing) -> Nothing, OpenAPI.Clients.ApiResponse
+> update(_api::IRFApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Nothing }, OpenAPI.Clients.ApiResponse
+
+
+
+Advances the model by a single time step.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **update_until**
+> update_until(_api::IRFApi, body::Float64; _mediaType=nothing) -> Nothing, OpenAPI.Clients.ApiResponse
+> update_until(_api::IRFApi, response_stream::Channel, body::Float64; _mediaType=nothing) -> Channel{ Nothing }, OpenAPI.Clients.ApiResponse
+
+
+
+Updates the model to a particular time
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **IRFApi** | API context |
+**body** | **Float64**| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/InitializeRequest.md b/RemoteBMI.jl/docs/src/client/docs/InitializeRequest.md
new file mode 100644
index 0000000..5d244be
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/InitializeRequest.md
@@ -0,0 +1,12 @@
+# InitializeRequest
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**config_file** | **String** | Path to the configuration file. Should resolvable by web service. | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/Int64.md b/RemoteBMI.jl/docs/src/client/docs/Int64.md
new file mode 100644
index 0000000..e69de29
diff --git a/RemoteBMI.jl/docs/src/client/docs/NURCApi.md b/RemoteBMI.jl/docs/src/client/docs/NURCApi.md
new file mode 100644
index 0000000..19540b4
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/NURCApi.md
@@ -0,0 +1,101 @@
+# NURCApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_x**](NURCApi.md#get_grid_x) | **GET** /get_grid_x/{grid} |
+[**get_grid_y**](NURCApi.md#get_grid_y) | **GET** /get_grid_y/{grid} |
+[**get_grid_z**](NURCApi.md#get_grid_z) | **GET** /get_grid_z/{grid} |
+
+
+# **get_grid_x**
+> get_grid_x(_api::NURCApi, grid::Int64; _mediaType=nothing) -> Vector{Float64}, OpenAPI.Clients.ApiResponse
+> get_grid_x(_api::NURCApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Float64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the locations of the grid nodes in the first coordinate direction.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **NURCApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_y**
+> get_grid_y(_api::NURCApi, grid::Int64; _mediaType=nothing) -> Vector{Float64}, OpenAPI.Clients.ApiResponse
+> get_grid_y(_api::NURCApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Float64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the locations of the grid nodes in the second coordinate direction.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **NURCApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_z**
+> get_grid_z(_api::NURCApi, grid::Int64; _mediaType=nothing) -> Vector{Float64}, OpenAPI.Clients.ApiResponse
+> get_grid_z(_api::NURCApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Float64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the locations of the grid nodes in the third coordinate direction.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **NURCApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/ProblemDetails.md b/RemoteBMI.jl/docs/src/client/docs/ProblemDetails.md
new file mode 100644
index 0000000..08a4b16
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/ProblemDetails.md
@@ -0,0 +1,16 @@
+# ProblemDetails
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**type** | **String** | A URI reference that identifies the problem type. | [optional] [default to nothing]
+**title** | **String** | A short, human-readable summary of the problem type. | [optional] [default to nothing]
+**status** | **Int64** | The HTTP status code generated by the origin server for this occurrence of the problem. | [optional] [default to nothing]
+**detail** | **String** | A human-readable explanation specific to this occurrence of the problem. | [optional] [default to nothing]
+**instance** | **String** | A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced. | [optional] [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/SetValueAtIndicesRequest.md b/RemoteBMI.jl/docs/src/client/docs/SetValueAtIndicesRequest.md
new file mode 100644
index 0000000..6f8903d
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/SetValueAtIndicesRequest.md
@@ -0,0 +1,13 @@
+# SetValueAtIndicesRequest
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**indices** | **Vector{Int64}** | | [default to nothing]
+**values** | **Vector{Float64}** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/SettersApi.md b/RemoteBMI.jl/docs/src/client/docs/SettersApi.md
new file mode 100644
index 0000000..731abe7
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/SettersApi.md
@@ -0,0 +1,72 @@
+# SettersApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**set_value**](SettersApi.md#set_value) | **POST** /set_value/{name} |
+[**set_value_at_indices**](SettersApi.md#set_value_at_indices) | **POST** /set_value_at_indices/{name} |
+
+
+# **set_value**
+> set_value(_api::SettersApi, name::String, request_body::Vector{Float64}; _mediaType=nothing) -> Nothing, OpenAPI.Clients.ApiResponse
+> set_value(_api::SettersApi, response_stream::Channel, name::String, request_body::Vector{Float64}; _mediaType=nothing) -> Channel{ Nothing }, OpenAPI.Clients.ApiResponse
+
+
+
+Set the value of a variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **SettersApi** | API context |
+**name** | **String**| | [default to nothing]
+**request_body** | [**Vector{Float64}**](Float64.md)| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **set_value_at_indices**
+> set_value_at_indices(_api::SettersApi, name::String, set_value_at_indices_request::SetValueAtIndicesRequest; _mediaType=nothing) -> Nothing, OpenAPI.Clients.ApiResponse
+> set_value_at_indices(_api::SettersApi, response_stream::Channel, name::String, set_value_at_indices_request::SetValueAtIndicesRequest; _mediaType=nothing) -> Channel{ Nothing }, OpenAPI.Clients.ApiResponse
+
+
+
+Set the value of a variable at specific indices.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **SettersApi** | API context |
+**name** | **String**| | [default to nothing]
+**set_value_at_indices_request** | [**SetValueAtIndicesRequest**](SetValueAtIndicesRequest.md)| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/TimeInformationApi.md b/RemoteBMI.jl/docs/src/client/docs/TimeInformationApi.md
new file mode 100644
index 0000000..6b7b009
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/TimeInformationApi.md
@@ -0,0 +1,143 @@
+# TimeInformationApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_current_time**](TimeInformationApi.md#get_current_time) | **GET** /get_current_time |
+[**get_end_time**](TimeInformationApi.md#get_end_time) | **GET** /get_end_time |
+[**get_start_time**](TimeInformationApi.md#get_start_time) | **GET** /get_start_time |
+[**get_time_step**](TimeInformationApi.md#get_time_step) | **GET** /get_time_step |
+[**get_time_units**](TimeInformationApi.md#get_time_units) | **GET** /get_time_units |
+
+
+# **get_current_time**
+> get_current_time(_api::TimeInformationApi; _mediaType=nothing) -> Float64, OpenAPI.Clients.ApiResponse
+> get_current_time(_api::TimeInformationApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Float64 }, OpenAPI.Clients.ApiResponse
+
+
+
+The current model time.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_end_time**
+> get_end_time(_api::TimeInformationApi; _mediaType=nothing) -> Float64, OpenAPI.Clients.ApiResponse
+> get_end_time(_api::TimeInformationApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Float64 }, OpenAPI.Clients.ApiResponse
+
+
+
+The end time of the model.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_start_time**
+> get_start_time(_api::TimeInformationApi; _mediaType=nothing) -> Float64, OpenAPI.Clients.ApiResponse
+> get_start_time(_api::TimeInformationApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Float64 }, OpenAPI.Clients.ApiResponse
+
+
+
+The start time of the model.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_time_step**
+> get_time_step(_api::TimeInformationApi; _mediaType=nothing) -> Float64, OpenAPI.Clients.ApiResponse
+> get_time_step(_api::TimeInformationApi, response_stream::Channel; _mediaType=nothing) -> Channel{ Float64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the time step used in the model.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_time_units**
+> get_time_units(_api::TimeInformationApi; _mediaType=nothing) -> GetTimeUnitsResponse, OpenAPI.Clients.ApiResponse
+> get_time_units(_api::TimeInformationApi, response_stream::Channel; _mediaType=nothing) -> Channel{ GetTimeUnitsResponse }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the units of time as reported by the model’s BMI. If model has absolute start time, you can use `since` format, see [cfconventions](https://cfconventions.org/cf-conventions/cf-conventions#time-coordinate).
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+[**GetTimeUnitsResponse**](GetTimeUnitsResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/UniformRectilinearApi.md b/RemoteBMI.jl/docs/src/client/docs/UniformRectilinearApi.md
new file mode 100644
index 0000000..45dd637
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/UniformRectilinearApi.md
@@ -0,0 +1,101 @@
+# UniformRectilinearApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_origin**](UniformRectilinearApi.md#get_grid_origin) | **GET** /get_grid_origin/{grid} |
+[**get_grid_shape**](UniformRectilinearApi.md#get_grid_shape) | **GET** /get_grid_shape/{grid} |
+[**get_grid_spacing**](UniformRectilinearApi.md#get_grid_spacing) | **GET** /get_grid_spacing/{grid} |
+
+
+# **get_grid_origin**
+> get_grid_origin(_api::UniformRectilinearApi, grid::Int64; _mediaType=nothing) -> Vector{Float64}, OpenAPI.Clients.ApiResponse
+> get_grid_origin(_api::UniformRectilinearApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Float64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the coordinates of the lower-left corner of the model grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UniformRectilinearApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_shape**
+> get_grid_shape(_api::UniformRectilinearApi, grid::Int64; _mediaType=nothing) -> Vector{Int64}, OpenAPI.Clients.ApiResponse
+> get_grid_shape(_api::UniformRectilinearApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Int64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the dimensions of the model grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UniformRectilinearApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_spacing**
+> get_grid_spacing(_api::UniformRectilinearApi, grid::Int64; _mediaType=nothing) -> Vector{Float64}, OpenAPI.Clients.ApiResponse
+> get_grid_spacing(_api::UniformRectilinearApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Float64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the distance between the nodes of the model grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UniformRectilinearApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/UnstructuredApi.md b/RemoteBMI.jl/docs/src/client/docs/UnstructuredApi.md
new file mode 100644
index 0000000..97aa4b6
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/UnstructuredApi.md
@@ -0,0 +1,225 @@
+# UnstructuredApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_edge_count**](UnstructuredApi.md#get_grid_edge_count) | **GET** /get_grid_edge_count/{grid} |
+[**get_grid_edge_nodes**](UnstructuredApi.md#get_grid_edge_nodes) | **GET** /get_grid_edge_nodes/{grid} |
+[**get_grid_face_count**](UnstructuredApi.md#get_grid_face_count) | **GET** /get_grid_face_count/{grid} |
+[**get_grid_face_edges**](UnstructuredApi.md#get_grid_face_edges) | **GET** /get_grid_face_edges/{grid} |
+[**get_grid_face_nodes**](UnstructuredApi.md#get_grid_face_nodes) | **GET** /get_grid_face_nodes/{grid} |
+[**get_grid_node_count**](UnstructuredApi.md#get_grid_node_count) | **GET** /get_grid_node_count/{grid} |
+[**get_grid_nodes_per_face**](UnstructuredApi.md#get_grid_nodes_per_face) | **GET** /get_grid_nodes_per_face/{grid} |
+
+
+# **get_grid_edge_count**
+> get_grid_edge_count(_api::UnstructuredApi, grid::Int64; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_grid_edge_count(_api::UnstructuredApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the number of edges in the grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UnstructuredApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_edge_nodes**
+> get_grid_edge_nodes(_api::UnstructuredApi, grid::Int64; _mediaType=nothing) -> Vector{Int64}, OpenAPI.Clients.ApiResponse
+> get_grid_edge_nodes(_api::UnstructuredApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Int64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the edge-node connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UnstructuredApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_face_count**
+> get_grid_face_count(_api::UnstructuredApi, grid::Int64; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_grid_face_count(_api::UnstructuredApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the face-node connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UnstructuredApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_face_edges**
+> get_grid_face_edges(_api::UnstructuredApi, grid::Int64; _mediaType=nothing) -> Vector{Int64}, OpenAPI.Clients.ApiResponse
+> get_grid_face_edges(_api::UnstructuredApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Int64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the face-edge connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UnstructuredApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_face_nodes**
+> get_grid_face_nodes(_api::UnstructuredApi, grid::Int64; _mediaType=nothing) -> Vector{Int64}, OpenAPI.Clients.ApiResponse
+> get_grid_face_nodes(_api::UnstructuredApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Int64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the face-node connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UnstructuredApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_node_count**
+> get_grid_node_count(_api::UnstructuredApi, grid::Int64; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_grid_node_count(_api::UnstructuredApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the number of nodes in the grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UnstructuredApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_grid_nodes_per_face**
+> get_grid_nodes_per_face(_api::UnstructuredApi, grid::Int64; _mediaType=nothing) -> Vector{Int64}, OpenAPI.Clients.ApiResponse
+> get_grid_nodes_per_face(_api::UnstructuredApi, response_stream::Channel, grid::Int64; _mediaType=nothing) -> Channel{ Vector{Int64} }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the number of nodes for each face.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **UnstructuredApi** | API context |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/client/docs/VariableInformationApi.md b/RemoteBMI.jl/docs/src/client/docs/VariableInformationApi.md
new file mode 100644
index 0000000..ac6eed2
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/client/docs/VariableInformationApi.md
@@ -0,0 +1,194 @@
+# VariableInformationApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_var_grid**](VariableInformationApi.md#get_var_grid) | **GET** /get_var_grid/{name} |
+[**get_var_itemsize**](VariableInformationApi.md#get_var_itemsize) | **GET** /get_var_itemsize/{name} |
+[**get_var_location**](VariableInformationApi.md#get_var_location) | **GET** /get_var_location/{name} |
+[**get_var_nbytes**](VariableInformationApi.md#get_var_nbytes) | **GET** /get_var_nbytes/{name} |
+[**get_var_type**](VariableInformationApi.md#get_var_type) | **GET** /get_var_type/{name} |
+[**get_var_units**](VariableInformationApi.md#get_var_units) | **GET** /get_var_units/{name} |
+
+
+# **get_var_grid**
+> get_var_grid(_api::VariableInformationApi, name::String; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_var_grid(_api::VariableInformationApi, response_stream::Channel, name::String; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Each input and output variable is defined on a grid. This function returns the grid identifier for a given variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **VariableInformationApi** | API context |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_var_itemsize**
+> get_var_itemsize(_api::VariableInformationApi, name::String; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_var_itemsize(_api::VariableInformationApi, response_stream::Channel, name::String; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Provides the size, in bytes, of a single element of the variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **VariableInformationApi** | API context |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_var_location**
+> get_var_location(_api::VariableInformationApi, name::String; _mediaType=nothing) -> GetVarLocationResponseLocation, OpenAPI.Clients.ApiResponse
+> get_var_location(_api::VariableInformationApi, response_stream::Channel, name::String; _mediaType=nothing) -> Channel{ GetVarLocationResponseLocation }, OpenAPI.Clients.ApiResponse
+
+
+
+Indicates on what grid element the variable is defined.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **VariableInformationApi** | API context |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+[**GetVarLocationResponseLocation**](GetVarLocationResponseLocation.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_var_nbytes**
+> get_var_nbytes(_api::VariableInformationApi, name::String; _mediaType=nothing) -> Int64, OpenAPI.Clients.ApiResponse
+> get_var_nbytes(_api::VariableInformationApi, response_stream::Channel, name::String; _mediaType=nothing) -> Channel{ Int64 }, OpenAPI.Clients.ApiResponse
+
+
+
+Provides the total amount of memory used to store a variable; i.e., the number of items multiplied by the size of each item.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **VariableInformationApi** | API context |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_var_type**
+> get_var_type(_api::VariableInformationApi, name::String; _mediaType=nothing) -> GetVarTypeResponse, OpenAPI.Clients.ApiResponse
+> get_var_type(_api::VariableInformationApi, response_stream::Channel, name::String; _mediaType=nothing) -> Channel{ GetVarTypeResponse }, OpenAPI.Clients.ApiResponse
+
+
+
+Provides the data type of the variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **VariableInformationApi** | API context |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+[**GetVarTypeResponse**](GetVarTypeResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
+# **get_var_units**
+> get_var_units(_api::VariableInformationApi, name::String; _mediaType=nothing) -> GetVarUnitsResponse, OpenAPI.Clients.ApiResponse
+> get_var_units(_api::VariableInformationApi, response_stream::Channel, name::String; _mediaType=nothing) -> Channel{ GetVarUnitsResponse }, OpenAPI.Clients.ApiResponse
+
+
+
+Get the units of the given variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **_api** | **VariableInformationApi** | API context |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+[**GetVarUnitsResponse**](GetVarUnitsResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/generated.md b/RemoteBMI.jl/docs/src/generated.md
new file mode 100644
index 0000000..ba55184
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/generated.md
@@ -0,0 +1,7 @@
+# OpenAPI
+
+Documentation generated by OpenAPI Generator.
+
+```@contents
+Pages = ["client/README.md", "server/README.md"]
+```
\ No newline at end of file
diff --git a/RemoteBMI.jl/docs/src/index.md b/RemoteBMI.jl/docs/src/index.md
index 33388cb..1349853 100644
--- a/RemoteBMI.jl/docs/src/index.md
+++ b/RemoteBMI.jl/docs/src/index.md
@@ -2,7 +2,13 @@
CurrentModule = RemoteBMI
```
-# RemoteBMI
+# RemoteBMI.jl Documentation
-Documentation for [RemoteBMI](https://github.com/eWaterCycle/RemoteBMI.jl).
+The [Basic Model Interface (BMI)](https://bmi.readthedocs.io/en/stable/) is a standard interface for models.
+To have a consumer of the model and the provider of the model seperated you can use REST API.
+This package provides a BMI http client and server.
+
+```@autodocs
+Modules = [RemoteBMI]
+```
diff --git a/RemoteBMI.jl/docs/src/server/README.md b/RemoteBMI.jl/docs/src/server/README.md
new file mode 100644
index 0000000..59fd1ef
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/README.md
@@ -0,0 +1,107 @@
+# Julia API server for BmiServer
+
+OpenAPI specification for the Basic Modeling Interface (BMI). All functions are described on the [BMI homepage](https://bmi.readthedocs.io/).
+
+
+## Overview
+This API server was generated by the [OpenAPI Generator](https://openapi-generator.tech) project. By using the [openapi-spec](https://openapis.org) from a remote server, you can easily generate an API client.
+
+- API version: 2.0
+- Generator version: 7.9.0
+- Build package: org.openapitools.codegen.languages.JuliaServerCodegen
+For more information, please visit [https://www.ewatercycle.org/contact/](https://www.ewatercycle.org/contact/)
+
+
+## Installation
+Place the Julia files generated under the `src` folder in your Julia project. Include BmiServer.jl in the project code.
+It would include the module named BmiServer.
+
+Implement the server methods as listed below. They are also documented with the BmiServer module.
+Launch a HTTP server with a router that has all handlers registered. A `register` method is provided in BmiServer module for convenience.
+
+```julia
+register(
+ router::HTTP.Router, # Router to register handlers in
+ impl; # Module that implements the server methods
+ path_prefix::String="", # Prefix to be applied to all paths
+ optional_middlewares... # Optional middlewares to be applied to all handlers
+)
+```
+
+Optional middlewares can be one or more of:
+- `init`: called before the request is processed
+- `pre_validation`: called after the request is parsed but before validation
+- `pre_invoke`: called after validation but before the handler is invoked
+- `post_invoke`: called after the handler is invoked but before the response is sent
+
+The order in which middlewares are invoked are:
+`init |> read |> pre_validation |> validate |> pre_invoke |> invoke |> post_invoke`
+
+
+## API Endpoints
+
+The following server methods must be implemented:
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*ExchangeItemsApi* | [**get_component_name**](docs/ExchangeItemsApi.md#get_component_name) | **GET** /get_component_name |
+*ExchangeItemsApi* | [**get_input_item_count**](docs/ExchangeItemsApi.md#get_input_item_count) | **GET** /get_input_item_count |
+*ExchangeItemsApi* | [**get_input_var_names**](docs/ExchangeItemsApi.md#get_input_var_names) | **GET** /get_input_var_names |
+*ExchangeItemsApi* | [**get_output_item_count**](docs/ExchangeItemsApi.md#get_output_item_count) | **GET** /get_output_item_count |
+*ExchangeItemsApi* | [**get_output_var_names**](docs/ExchangeItemsApi.md#get_output_var_names) | **GET** /get_output_var_names |
+*GettersApi* | [**get_value**](docs/GettersApi.md#get_value) | **GET** /get_value/{name} |
+*GettersApi* | [**get_value_at_indices**](docs/GettersApi.md#get_value_at_indices) | **POST** /get_value_at_indices/{name} |
+*GridInformationApi* | [**get_grid_rank**](docs/GridInformationApi.md#get_grid_rank) | **GET** /get_grid_rank/{grid} |
+*GridInformationApi* | [**get_grid_size**](docs/GridInformationApi.md#get_grid_size) | **GET** /get_grid_size/{grid} |
+*GridInformationApi* | [**get_grid_type**](docs/GridInformationApi.md#get_grid_type) | **GET** /get_grid_type/{grid} |
+*IRFApi* | [**finalize**](docs/IRFApi.md#finalize) | **DELETE** /finalize |
+*IRFApi* | [**initialize**](docs/IRFApi.md#initialize) | **POST** /initialize |
+*IRFApi* | [**update**](docs/IRFApi.md#update) | **POST** /update |
+*IRFApi* | [**update_until**](docs/IRFApi.md#update_until) | **POST** /update_until |
+*NURCApi* | [**get_grid_x**](docs/NURCApi.md#get_grid_x) | **GET** /get_grid_x/{grid} |
+*NURCApi* | [**get_grid_y**](docs/NURCApi.md#get_grid_y) | **GET** /get_grid_y/{grid} |
+*NURCApi* | [**get_grid_z**](docs/NURCApi.md#get_grid_z) | **GET** /get_grid_z/{grid} |
+*SettersApi* | [**set_value**](docs/SettersApi.md#set_value) | **POST** /set_value/{name} |
+*SettersApi* | [**set_value_at_indices**](docs/SettersApi.md#set_value_at_indices) | **POST** /set_value_at_indices/{name} |
+*TimeInformationApi* | [**get_current_time**](docs/TimeInformationApi.md#get_current_time) | **GET** /get_current_time |
+*TimeInformationApi* | [**get_end_time**](docs/TimeInformationApi.md#get_end_time) | **GET** /get_end_time |
+*TimeInformationApi* | [**get_start_time**](docs/TimeInformationApi.md#get_start_time) | **GET** /get_start_time |
+*TimeInformationApi* | [**get_time_step**](docs/TimeInformationApi.md#get_time_step) | **GET** /get_time_step |
+*TimeInformationApi* | [**get_time_units**](docs/TimeInformationApi.md#get_time_units) | **GET** /get_time_units |
+*UniformRectilinearApi* | [**get_grid_origin**](docs/UniformRectilinearApi.md#get_grid_origin) | **GET** /get_grid_origin/{grid} |
+*UniformRectilinearApi* | [**get_grid_shape**](docs/UniformRectilinearApi.md#get_grid_shape) | **GET** /get_grid_shape/{grid} |
+*UniformRectilinearApi* | [**get_grid_spacing**](docs/UniformRectilinearApi.md#get_grid_spacing) | **GET** /get_grid_spacing/{grid} |
+*UnstructuredApi* | [**get_grid_edge_count**](docs/UnstructuredApi.md#get_grid_edge_count) | **GET** /get_grid_edge_count/{grid} |
+*UnstructuredApi* | [**get_grid_edge_nodes**](docs/UnstructuredApi.md#get_grid_edge_nodes) | **GET** /get_grid_edge_nodes/{grid} |
+*UnstructuredApi* | [**get_grid_face_count**](docs/UnstructuredApi.md#get_grid_face_count) | **GET** /get_grid_face_count/{grid} |
+*UnstructuredApi* | [**get_grid_face_edges**](docs/UnstructuredApi.md#get_grid_face_edges) | **GET** /get_grid_face_edges/{grid} |
+*UnstructuredApi* | [**get_grid_face_nodes**](docs/UnstructuredApi.md#get_grid_face_nodes) | **GET** /get_grid_face_nodes/{grid} |
+*UnstructuredApi* | [**get_grid_node_count**](docs/UnstructuredApi.md#get_grid_node_count) | **GET** /get_grid_node_count/{grid} |
+*UnstructuredApi* | [**get_grid_nodes_per_face**](docs/UnstructuredApi.md#get_grid_nodes_per_face) | **GET** /get_grid_nodes_per_face/{grid} |
+*VariableInformationApi* | [**get_var_grid**](docs/VariableInformationApi.md#get_var_grid) | **GET** /get_var_grid/{name} |
+*VariableInformationApi* | [**get_var_itemsize**](docs/VariableInformationApi.md#get_var_itemsize) | **GET** /get_var_itemsize/{name} |
+*VariableInformationApi* | [**get_var_location**](docs/VariableInformationApi.md#get_var_location) | **GET** /get_var_location/{name} |
+*VariableInformationApi* | [**get_var_nbytes**](docs/VariableInformationApi.md#get_var_nbytes) | **GET** /get_var_nbytes/{name} |
+*VariableInformationApi* | [**get_var_type**](docs/VariableInformationApi.md#get_var_type) | **GET** /get_var_type/{name} |
+*VariableInformationApi* | [**get_var_units**](docs/VariableInformationApi.md#get_var_units) | **GET** /get_var_units/{name} |
+
+
+
+## Models
+
+ - [GetComponentNameResponse](docs/GetComponentNameResponse.md)
+ - [GetGridTypeResponse](docs/GetGridTypeResponse.md)
+ - [GetTimeUnitsResponse](docs/GetTimeUnitsResponse.md)
+ - [GetVarLocationResponseLocation](docs/GetVarLocationResponseLocation.md)
+ - [GetVarTypeResponse](docs/GetVarTypeResponse.md)
+ - [GetVarUnitsResponse](docs/GetVarUnitsResponse.md)
+ - [InitializeRequest](docs/InitializeRequest.md)
+ - [ProblemDetails](docs/ProblemDetails.md)
+ - [SetValueAtIndicesRequest](docs/SetValueAtIndicesRequest.md)
+
+
+
+## Author
+
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/ExchangeItemsApi.md b/RemoteBMI.jl/docs/src/server/docs/ExchangeItemsApi.md
new file mode 100644
index 0000000..b397bc7
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/ExchangeItemsApi.md
@@ -0,0 +1,138 @@
+# ExchangeItemsApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_component_name**](ExchangeItemsApi.md#get_component_name) | **GET** /get_component_name |
+[**get_input_item_count**](ExchangeItemsApi.md#get_input_item_count) | **GET** /get_input_item_count |
+[**get_input_var_names**](ExchangeItemsApi.md#get_input_var_names) | **GET** /get_input_var_names |
+[**get_output_item_count**](ExchangeItemsApi.md#get_output_item_count) | **GET** /get_output_item_count |
+[**get_output_var_names**](ExchangeItemsApi.md#get_output_var_names) | **GET** /get_output_var_names |
+
+
+# **get_component_name**
+> get_component_name(req::HTTP.Request;) -> GetComponentNameResponse
+
+
+
+Get the name of the model component.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+[**GetComponentNameResponse**](GetComponentNameResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_input_item_count**
+> get_input_item_count(req::HTTP.Request;) -> Int64
+
+
+
+The number of variables the model can use from other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_input_var_names**
+> get_input_var_names(req::HTTP.Request;) -> Vector{String}
+
+
+
+Gets an array of names for the variables the model can use from other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Vector{String}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_output_item_count**
+> get_output_item_count(req::HTTP.Request;) -> Int64
+
+
+
+The number of variables the model can provide other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_output_var_names**
+> get_output_var_names(req::HTTP.Request;) -> Vector{String}
+
+
+
+Gets an array of names for the variables the model can provide to other models implementing a BMI.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Vector{String}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/Float64.md b/RemoteBMI.jl/docs/src/server/docs/Float64.md
new file mode 100644
index 0000000..e69de29
diff --git a/RemoteBMI.jl/docs/src/server/docs/GetComponentNameResponse.md b/RemoteBMI.jl/docs/src/server/docs/GetComponentNameResponse.md
new file mode 100644
index 0000000..f6376fc
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GetComponentNameResponse.md
@@ -0,0 +1,12 @@
+# GetComponentNameResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**name** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/GetGridTypeResponse.md b/RemoteBMI.jl/docs/src/server/docs/GetGridTypeResponse.md
new file mode 100644
index 0000000..5d5c4af
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GetGridTypeResponse.md
@@ -0,0 +1,12 @@
+# GetGridTypeResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**type** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/GetTimeUnitsResponse.md b/RemoteBMI.jl/docs/src/server/docs/GetTimeUnitsResponse.md
new file mode 100644
index 0000000..47d7380
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GetTimeUnitsResponse.md
@@ -0,0 +1,12 @@
+# GetTimeUnitsResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**units** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/GetVarLocationResponseLocation.md b/RemoteBMI.jl/docs/src/server/docs/GetVarLocationResponseLocation.md
new file mode 100644
index 0000000..8e3ea5a
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GetVarLocationResponseLocation.md
@@ -0,0 +1,12 @@
+# GetVarLocationResponseLocation
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**location** | **String** | | [default to "node"]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/GetVarTypeResponse.md b/RemoteBMI.jl/docs/src/server/docs/GetVarTypeResponse.md
new file mode 100644
index 0000000..ab3e1df
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GetVarTypeResponse.md
@@ -0,0 +1,12 @@
+# GetVarTypeResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**type** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/GetVarUnitsResponse.md b/RemoteBMI.jl/docs/src/server/docs/GetVarUnitsResponse.md
new file mode 100644
index 0000000..7b86ada
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GetVarUnitsResponse.md
@@ -0,0 +1,12 @@
+# GetVarUnitsResponse
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**units** | **String** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/GettersApi.md b/RemoteBMI.jl/docs/src/server/docs/GettersApi.md
new file mode 100644
index 0000000..20972fb
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GettersApi.md
@@ -0,0 +1,69 @@
+# GettersApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_value**](GettersApi.md#get_value) | **GET** /get_value/{name} |
+[**get_value_at_indices**](GettersApi.md#get_value_at_indices) | **POST** /get_value_at_indices/{name} |
+
+
+# **get_value**
+> get_value(req::HTTP.Request, name::String;) -> Vector{Float64}
+
+
+
+Get the value of a variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_value_at_indices**
+> get_value_at_indices(req::HTTP.Request, name::String, request_body::Vector{Int64};) -> Vector{Float64}
+
+
+
+Get the value of a variable at specific indices.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+**request_body** | [**Vector{Int64}**](Int64.md)| |
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/GridInformationApi.md b/RemoteBMI.jl/docs/src/server/docs/GridInformationApi.md
new file mode 100644
index 0000000..e97d3ac
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/GridInformationApi.md
@@ -0,0 +1,98 @@
+# GridInformationApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_rank**](GridInformationApi.md#get_grid_rank) | **GET** /get_grid_rank/{grid} |
+[**get_grid_size**](GridInformationApi.md#get_grid_size) | **GET** /get_grid_size/{grid} |
+[**get_grid_type**](GridInformationApi.md#get_grid_type) | **GET** /get_grid_type/{grid} |
+
+
+# **get_grid_rank**
+> get_grid_rank(req::HTTP.Request, grid::Int64;) -> Int64
+
+
+
+Given a grid identifier, get the rank (the number of dimensions) of that grid as an integer.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_size**
+> get_grid_size(req::HTTP.Request, grid::Int64;) -> Int64
+
+
+
+Given a grid identifier, get the total number of elements (or nodes) of that grid as an integer.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_type**
+> get_grid_type(req::HTTP.Request, grid::Int64;) -> GetGridTypeResponse
+
+
+
+Given a grid identifier, get the type of that grid as a string.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+[**GetGridTypeResponse**](GetGridTypeResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/IRFApi.md b/RemoteBMI.jl/docs/src/server/docs/IRFApi.md
new file mode 100644
index 0000000..218d5aa
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/IRFApi.md
@@ -0,0 +1,120 @@
+# IRFApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**finalize**](IRFApi.md#finalize) | **DELETE** /finalize |
+[**initialize**](IRFApi.md#initialize) | **POST** /initialize |
+[**update**](IRFApi.md#update) | **POST** /update |
+[**update_until**](IRFApi.md#update_until) | **POST** /update_until |
+
+
+# **finalize**
+> finalize(req::HTTP.Request;) -> Nothing
+
+
+
+Performs all tasks that take place after exiting the model’s time loop.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **initialize**
+> initialize(req::HTTP.Request, initialize_request::InitializeRequest;) -> Nothing
+
+
+
+Performs all tasks that are to take place before entering the model’s time loop.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**initialize_request** | [**InitializeRequest**](InitializeRequest.md)| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **update**
+> update(req::HTTP.Request;) -> Nothing
+
+
+
+Advances the model by a single time step.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **update_until**
+> update_until(req::HTTP.Request, body::Float64;) -> Nothing
+
+
+
+Updates the model to a particular time
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**body** | **Float64**| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/InitializeRequest.md b/RemoteBMI.jl/docs/src/server/docs/InitializeRequest.md
new file mode 100644
index 0000000..5d244be
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/InitializeRequest.md
@@ -0,0 +1,12 @@
+# InitializeRequest
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**config_file** | **String** | Path to the configuration file. Should resolvable by web service. | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/Int64.md b/RemoteBMI.jl/docs/src/server/docs/Int64.md
new file mode 100644
index 0000000..e69de29
diff --git a/RemoteBMI.jl/docs/src/server/docs/NURCApi.md b/RemoteBMI.jl/docs/src/server/docs/NURCApi.md
new file mode 100644
index 0000000..c380ffa
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/NURCApi.md
@@ -0,0 +1,98 @@
+# NURCApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_x**](NURCApi.md#get_grid_x) | **GET** /get_grid_x/{grid} |
+[**get_grid_y**](NURCApi.md#get_grid_y) | **GET** /get_grid_y/{grid} |
+[**get_grid_z**](NURCApi.md#get_grid_z) | **GET** /get_grid_z/{grid} |
+
+
+# **get_grid_x**
+> get_grid_x(req::HTTP.Request, grid::Int64;) -> Vector{Float64}
+
+
+
+Get the locations of the grid nodes in the first coordinate direction.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_y**
+> get_grid_y(req::HTTP.Request, grid::Int64;) -> Vector{Float64}
+
+
+
+Get the locations of the grid nodes in the second coordinate direction.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_z**
+> get_grid_z(req::HTTP.Request, grid::Int64;) -> Vector{Float64}
+
+
+
+Get the locations of the grid nodes in the third coordinate direction.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/ProblemDetails.md b/RemoteBMI.jl/docs/src/server/docs/ProblemDetails.md
new file mode 100644
index 0000000..08a4b16
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/ProblemDetails.md
@@ -0,0 +1,16 @@
+# ProblemDetails
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**type** | **String** | A URI reference that identifies the problem type. | [optional] [default to nothing]
+**title** | **String** | A short, human-readable summary of the problem type. | [optional] [default to nothing]
+**status** | **Int64** | The HTTP status code generated by the origin server for this occurrence of the problem. | [optional] [default to nothing]
+**detail** | **String** | A human-readable explanation specific to this occurrence of the problem. | [optional] [default to nothing]
+**instance** | **String** | A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced. | [optional] [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/SetValueAtIndicesRequest.md b/RemoteBMI.jl/docs/src/server/docs/SetValueAtIndicesRequest.md
new file mode 100644
index 0000000..6f8903d
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/SetValueAtIndicesRequest.md
@@ -0,0 +1,13 @@
+# SetValueAtIndicesRequest
+
+
+## Properties
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**indices** | **Vector{Int64}** | | [default to nothing]
+**values** | **Vector{Float64}** | | [default to nothing]
+
+
+[[Back to Model list]](../README.md#models) [[Back to API list]](../README.md#api-endpoints) [[Back to README]](../README.md)
+
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/SettersApi.md b/RemoteBMI.jl/docs/src/server/docs/SettersApi.md
new file mode 100644
index 0000000..d5c1b71
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/SettersApi.md
@@ -0,0 +1,70 @@
+# SettersApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**set_value**](SettersApi.md#set_value) | **POST** /set_value/{name} |
+[**set_value_at_indices**](SettersApi.md#set_value_at_indices) | **POST** /set_value_at_indices/{name} |
+
+
+# **set_value**
+> set_value(req::HTTP.Request, name::String, request_body::Vector{Float64};) -> Nothing
+
+
+
+Set the value of a variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+**request_body** | [**Vector{Float64}**](Float64.md)| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **set_value_at_indices**
+> set_value_at_indices(req::HTTP.Request, name::String, set_value_at_indices_request::SetValueAtIndicesRequest;) -> Nothing
+
+
+
+Set the value of a variable at specific indices.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+**set_value_at_indices_request** | [**SetValueAtIndicesRequest**](SetValueAtIndicesRequest.md)| |
+
+### Return type
+
+Nothing
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/TimeInformationApi.md b/RemoteBMI.jl/docs/src/server/docs/TimeInformationApi.md
new file mode 100644
index 0000000..1a50daf
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/TimeInformationApi.md
@@ -0,0 +1,138 @@
+# TimeInformationApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_current_time**](TimeInformationApi.md#get_current_time) | **GET** /get_current_time |
+[**get_end_time**](TimeInformationApi.md#get_end_time) | **GET** /get_end_time |
+[**get_start_time**](TimeInformationApi.md#get_start_time) | **GET** /get_start_time |
+[**get_time_step**](TimeInformationApi.md#get_time_step) | **GET** /get_time_step |
+[**get_time_units**](TimeInformationApi.md#get_time_units) | **GET** /get_time_units |
+
+
+# **get_current_time**
+> get_current_time(req::HTTP.Request;) -> Float64
+
+
+
+The current model time.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_end_time**
+> get_end_time(req::HTTP.Request;) -> Float64
+
+
+
+The end time of the model.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_start_time**
+> get_start_time(req::HTTP.Request;) -> Float64
+
+
+
+The start time of the model.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_time_step**
+> get_time_step(req::HTTP.Request;) -> Float64
+
+
+
+Get the time step used in the model.
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+**Float64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_time_units**
+> get_time_units(req::HTTP.Request;) -> GetTimeUnitsResponse
+
+
+
+Get the units of time as reported by the model’s BMI. If model has absolute start time, you can use `since` format, see [cfconventions](https://cfconventions.org/cf-conventions/cf-conventions#time-coordinate).
+
+### Required Parameters
+This endpoint does not need any parameter.
+
+### Return type
+
+[**GetTimeUnitsResponse**](GetTimeUnitsResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/UniformRectilinearApi.md b/RemoteBMI.jl/docs/src/server/docs/UniformRectilinearApi.md
new file mode 100644
index 0000000..39c600a
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/UniformRectilinearApi.md
@@ -0,0 +1,98 @@
+# UniformRectilinearApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_origin**](UniformRectilinearApi.md#get_grid_origin) | **GET** /get_grid_origin/{grid} |
+[**get_grid_shape**](UniformRectilinearApi.md#get_grid_shape) | **GET** /get_grid_shape/{grid} |
+[**get_grid_spacing**](UniformRectilinearApi.md#get_grid_spacing) | **GET** /get_grid_spacing/{grid} |
+
+
+# **get_grid_origin**
+> get_grid_origin(req::HTTP.Request, grid::Int64;) -> Vector{Float64}
+
+
+
+Get the coordinates of the lower-left corner of the model grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_shape**
+> get_grid_shape(req::HTTP.Request, grid::Int64;) -> Vector{Int64}
+
+
+
+Get the dimensions of the model grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_spacing**
+> get_grid_spacing(req::HTTP.Request, grid::Int64;) -> Vector{Float64}
+
+
+
+Get the distance between the nodes of the model grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Float64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/UnstructuredApi.md b/RemoteBMI.jl/docs/src/server/docs/UnstructuredApi.md
new file mode 100644
index 0000000..b872731
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/UnstructuredApi.md
@@ -0,0 +1,218 @@
+# UnstructuredApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_grid_edge_count**](UnstructuredApi.md#get_grid_edge_count) | **GET** /get_grid_edge_count/{grid} |
+[**get_grid_edge_nodes**](UnstructuredApi.md#get_grid_edge_nodes) | **GET** /get_grid_edge_nodes/{grid} |
+[**get_grid_face_count**](UnstructuredApi.md#get_grid_face_count) | **GET** /get_grid_face_count/{grid} |
+[**get_grid_face_edges**](UnstructuredApi.md#get_grid_face_edges) | **GET** /get_grid_face_edges/{grid} |
+[**get_grid_face_nodes**](UnstructuredApi.md#get_grid_face_nodes) | **GET** /get_grid_face_nodes/{grid} |
+[**get_grid_node_count**](UnstructuredApi.md#get_grid_node_count) | **GET** /get_grid_node_count/{grid} |
+[**get_grid_nodes_per_face**](UnstructuredApi.md#get_grid_nodes_per_face) | **GET** /get_grid_nodes_per_face/{grid} |
+
+
+# **get_grid_edge_count**
+> get_grid_edge_count(req::HTTP.Request, grid::Int64;) -> Int64
+
+
+
+Get the number of edges in the grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_edge_nodes**
+> get_grid_edge_nodes(req::HTTP.Request, grid::Int64;) -> Vector{Int64}
+
+
+
+Get the edge-node connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_face_count**
+> get_grid_face_count(req::HTTP.Request, grid::Int64;) -> Int64
+
+
+
+Get the face-node connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_face_edges**
+> get_grid_face_edges(req::HTTP.Request, grid::Int64;) -> Vector{Int64}
+
+
+
+Get the face-edge connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_face_nodes**
+> get_grid_face_nodes(req::HTTP.Request, grid::Int64;) -> Vector{Int64}
+
+
+
+Get the face-node connectivity.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_node_count**
+> get_grid_node_count(req::HTTP.Request, grid::Int64;) -> Int64
+
+
+
+Get the number of nodes in the grid.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_grid_nodes_per_face**
+> get_grid_nodes_per_face(req::HTTP.Request, grid::Int64;) -> Vector{Int64}
+
+
+
+Get the number of nodes for each face.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**grid** | **Int64**| | [default to nothing]
+
+### Return type
+
+**Vector{Int64}**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/docs/src/server/docs/VariableInformationApi.md b/RemoteBMI.jl/docs/src/server/docs/VariableInformationApi.md
new file mode 100644
index 0000000..a93ea38
--- /dev/null
+++ b/RemoteBMI.jl/docs/src/server/docs/VariableInformationApi.md
@@ -0,0 +1,188 @@
+# VariableInformationApi
+
+All URIs are relative to *http://localhost:50051*
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**get_var_grid**](VariableInformationApi.md#get_var_grid) | **GET** /get_var_grid/{name} |
+[**get_var_itemsize**](VariableInformationApi.md#get_var_itemsize) | **GET** /get_var_itemsize/{name} |
+[**get_var_location**](VariableInformationApi.md#get_var_location) | **GET** /get_var_location/{name} |
+[**get_var_nbytes**](VariableInformationApi.md#get_var_nbytes) | **GET** /get_var_nbytes/{name} |
+[**get_var_type**](VariableInformationApi.md#get_var_type) | **GET** /get_var_type/{name} |
+[**get_var_units**](VariableInformationApi.md#get_var_units) | **GET** /get_var_units/{name} |
+
+
+# **get_var_grid**
+> get_var_grid(req::HTTP.Request, name::String;) -> Int64
+
+
+
+Each input and output variable is defined on a grid. This function returns the grid identifier for a given variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_var_itemsize**
+> get_var_itemsize(req::HTTP.Request, name::String;) -> Int64
+
+
+
+Provides the size, in bytes, of a single element of the variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_var_location**
+> get_var_location(req::HTTP.Request, name::String;) -> GetVarLocationResponseLocation
+
+
+
+Indicates on what grid element the variable is defined.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+[**GetVarLocationResponseLocation**](GetVarLocationResponseLocation.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_var_nbytes**
+> get_var_nbytes(req::HTTP.Request, name::String;) -> Int64
+
+
+
+Provides the total amount of memory used to store a variable; i.e., the number of items multiplied by the size of each item.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+**Int64**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_var_type**
+> get_var_type(req::HTTP.Request, name::String;) -> GetVarTypeResponse
+
+
+
+Provides the data type of the variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+[**GetVarTypeResponse**](GetVarTypeResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
+# **get_var_units**
+> get_var_units(req::HTTP.Request, name::String;) -> GetVarUnitsResponse
+
+
+
+Get the units of the given variable.
+
+### Required Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **req** | **HTTP.Request** | The HTTP Request object |
+**name** | **String**| | [default to nothing]
+
+### Return type
+
+[**GetVarUnitsResponse**](GetVarUnitsResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+ - **Content-Type**: Not defined
+ - **Accept**: application/json
+
+[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
+
diff --git a/RemoteBMI.jl/src/Client.jl b/RemoteBMI.jl/src/Client.jl
index 1daf8fd..a6832d6 100644
--- a/RemoteBMI.jl/src/Client.jl
+++ b/RemoteBMI.jl/src/Client.jl
@@ -9,6 +9,8 @@ using .BmiClient
import BasicModelInterface as BMI
+# TODO document BMIClient in doc site
+
Base.@kwdef mutable struct BMIClient
base_url::String
end
diff --git a/RemoteBMI.jl/src/Server.jl b/RemoteBMI.jl/src/Server.jl
index a4be26e..8220b3e 100644
--- a/RemoteBMI.jl/src/Server.jl
+++ b/RemoteBMI.jl/src/Server.jl
@@ -146,6 +146,7 @@ end
function set_value(req::HTTP.Request, name::String, request_body::Vector{Float64};)::Nothing
BMI.set_value(m, name, request_body)
+ return nothing
end
function set_value_at_indices(
@@ -156,7 +157,8 @@ function set_value_at_indices(
# OpenAPI request is zero-based, while Julia is one-based
jindexes = set_value_at_indices_request.indices .+ 1
src = set_value_at_indices_request.values
- BMI.set_value_at_indices(m, name, src, jindexes)
+ BMI.set_value_at_indices(m, name, jindexes, src)
+ return Nothing
end
function get_current_time(req::HTTP.Request;)::Float64
diff --git a/RemoteBMI.jl/test/fake.jl b/RemoteBMI.jl/test/fake.jl
index 56ea212..e19a3a7 100644
--- a/RemoteBMI.jl/test/fake.jl
+++ b/RemoteBMI.jl/test/fake.jl
@@ -65,8 +65,8 @@ end
function BMI.set_value_at_indices(
m::Model,
name::String,
- src::Vector{T},
indices::Vector{Int},
+ src::Vector{T},
) where {T <: AbstractFloat}
m.values[indices] .= src
return nothing
diff --git a/python/remotebmi/client/client.py b/python/remotebmi/client/client.py
index 3355bd2..e4c4406 100644
--- a/python/remotebmi/client/client.py
+++ b/python/remotebmi/client/client.py
@@ -1,3 +1,5 @@
+from urllib.parse import urlparse
+
import numpy as np
from bmipy import Bmi
from httpx import Client, Limits
@@ -13,7 +15,20 @@ def __init__(self, base_url, timeout=60 * 60 * 24, max_keepalive_connections=0):
timeout: How long a response can take.
Defaults to 1 day. Set to None to disable timeout.
max_keepalive_connections: How many connections to keep alive.
+
+ Raises:
+ ValueError: If the base_url is invalid.
"""
+ parsed_url = urlparse(base_url)
+ if not all(
+ [
+ parsed_url.scheme,
+ parsed_url.netloc,
+ parsed_url.scheme in ["http", "https"],
+ ]
+ ):
+ msg = f"Invalid base_url: {base_url}"
+ raise ValueError(msg)
# In some Python environments the reusing connection causes `illegal status line: bytesarray(b'14')` error
# So we need to disable keepalive connections to be more reliable, but less efficient
limits = Limits(max_keepalive_connections=max_keepalive_connections)