https://github.com/csdms/bmi-example-java
An example of wrapping a model written in Java with a BMI
https://github.com/csdms/bmi-example-java
bmi csdms java maven
Last synced: 11 months ago
JSON representation
An example of wrapping a model written in Java with a BMI
- Host: GitHub
- URL: https://github.com/csdms/bmi-example-java
- Owner: csdms
- License: mit
- Created: 2021-11-18T23:02:45.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2022-02-22T00:41:14.000Z (almost 4 years ago)
- Last Synced: 2025-01-02T14:17:01.833Z (about 1 year ago)
- Topics: bmi, csdms, java, maven
- Language: Java
- Homepage: https://bmi.csdms.io
- Size: 51.8 KB
- Stars: 0
- Watchers: 6
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://bmi.readthedocs.io/)
[](https://github.com/csdms/bmi-example-java/actions/workflows/build.yml)
# bmi-example-java
An example of implementing the [Java specification][bmi-java]
for the CSDMS [Basic Model Interface][bmi] (BMI).
## Overview
This is an example of implementing a BMI
for a simple model that solves the diffusion equation
on a uniform rectangular plate
with Dirichlet boundary conditions.
Tests and examples of using the BMI are provided.
The model and its BMI are written in Java.
This project is organized as follows:
- src/main/java
-
edu.colorado.csdms.heat: Holds the model and a sample main program -
edu.colorado.csdms.bmiheat: Holds the BMI for the model and a main program to run the model through its BMI -
edu.colorado.csdms.example: A helper to hold the main programs - src/test/java
-
edu.colorado.csdms.heat: Unit tests for the model -
edu.colorado.csdms.bmiheat: Unit tests for the model BMI
## Build/Install
This example can be built on Linux, macOS, and Windows.
**Prerequisites:**
* A Java compiler
* [Maven](http://maven.apache.org)
* The Java BMI specification. The `pom.xml` in this project is configured to automatically download the `bmi` package from the [CSDMS Apache Maven Repository][csdms-maven-repo]
To compile and package the BMI Java bindings, run
$ mvn clean verify
This will generate files in the project directory `target`.
The result will look like
```bash
target
|-- bmi-example-java.jar
|-- classes
| `-- edu
| `-- colorado
| `-- csdms
| |-- bmiheat
| | `-- BmiHeat.class
| |-- example
| | `-- Examples.class
| `-- heat
| |-- Heat.class
| |-- HeatConfigFile.class
| `-- Solve2D.class
|-- generated-sources
| `-- annotations
|-- generated-test-sources
| `-- test-annotations
|-- maven-archiver
| `-- pom.properties
|-- maven-status
| `-- maven-compiler-plugin
| |-- compile
| | `-- default-compile
| | |-- createdFiles.lst
| | `-- inputFiles.lst
| `-- testCompile
| `-- default-testCompile
| |-- createdFiles.lst
| `-- inputFiles.lst
|-- surefire-reports
| |-- TEST-edu.colorado.csdms.bmiheat.TestGetAndSetValue.xml
| |-- TEST-edu.colorado.csdms.bmiheat.TestGridMethods.xml
| |-- TEST-edu.colorado.csdms.bmiheat.TestIRF.xml
| |-- TEST-edu.colorado.csdms.bmiheat.TestVarMethods.xml
| |-- TEST-edu.colorado.csdms.heat.HeatTest.xml
| |-- edu.colorado.csdms.bmiheat.TestGetAndSetValue.txt
| |-- edu.colorado.csdms.bmiheat.TestGridMethods.txt
| |-- edu.colorado.csdms.bmiheat.TestIRF.txt
| |-- edu.colorado.csdms.bmiheat.TestVarMethods.txt
| `-- edu.colorado.csdms.heat.HeatTest.txt
`-- test-classes
|-- data
| `-- heat.xml
`-- edu
`-- colorado
`-- csdms
|-- bmiheat
| |-- TestGetAndSetValue.class
| |-- TestGridMethods.class
| |-- TestIRF.class
| `-- TestVarMethods.class
`-- heat
`-- HeatTest.class
26 directories, 27 files
```
To install the jar file to your local Maven repository
(typically `~/.m2/repository`), run
$ mvn install
The result in the local repository will look like
```bash
edu
`-- colorado
`-- csdms
|-- bmi
| |-- 2.0
| | |-- _remote.repositories
| | |-- bmi-2.0.jar
| | |-- bmi-2.0.jar.md5
| | |-- bmi-2.0.jar.sha1
| | |-- bmi-2.0.pom
| | |-- bmi-2.0.pom.md5
| | `-- bmi-2.0.pom.sha1
| |-- maven-metadata-local.xml
| |-- maven-metadata-local.xml.md5
| `-- maven-metadata-local.xml.sha1
`-- bmi-example-java
|-- 1.0
| |-- _remote.repositories
| |-- bmi-example-java-1.0.jar
| `-- bmi-example-java-1.0.pom
`-- maven-metadata-local.xml
6 directories, 14 files
```
Note that the `bmi` package is also present.
## Use
Run the Heat model through its BMI with
$ mvn exec:java
Both the Heat and the BmiHeat examples are run, with output
```
*
* Example: Heat Model
*
shape: [8, 6]
spacing: [1.0, 1.0]
origin: [0.0, 0.0]
time = 0.0
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 100.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
time = 0.25
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 12.50 0.00 0.00 0.00
0.00 12.50 50.00 12.50 0.00 0.00
0.00 0.00 12.50 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
time = 0.5
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 1.56 0.00 0.00 0.00
0.00 3.13 12.50 3.13 0.00 0.00
0.00 12.50 31.25 12.50 1.56 0.00
0.00 3.13 12.50 3.13 0.00 0.00
0.00 0.00 1.56 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
time = 0.75
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.59 2.34 0.59 0.00 0.00
0.00 4.69 11.13 4.69 0.59 0.00
0.00 10.94 21.88 11.13 2.34 0.00
0.00 4.69 11.13 4.69 0.59 0.00
0.00 0.59 2.34 0.59 0.00 0.00
0.00 0.00 0.20 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
*
* Example: Heat Model run through its BMI
*
Model name: Heat
Start time: 0.0
End time: 1.7976931348623157E308
Current time: 0.0
Time step: 0.25
Time unit: null
Input variables:
- plate_surface__temperature
Output variables:
- plate_surface__temperature
Variable: plate_surface__temperature
- grid_id: 0
- grid type: uniform_rectilinear
- grid rank: 2
- grid size: 48
- grid shape:
- 8
- 6
- grid spacing:
- 1.0
- 1.0
- grid origin:
- 0.0
- 0.0
- var type: double
- var units: K
- var itemsize: 8
- var nbytes: 384
time = 0.0
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 100.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
time = 0.25
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 12.50 0.00 0.00 0.00
0.00 12.50 50.00 12.50 0.00 0.00
0.00 0.00 12.50 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
time = 0.5
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 1.56 0.00 0.00 0.00
0.00 3.13 12.50 3.13 0.00 0.00
0.00 12.50 31.25 12.50 1.56 0.00
0.00 3.13 12.50 3.13 0.00 0.00
0.00 0.00 1.56 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
time = 0.75
temperature =
0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.59 2.34 0.59 0.00 0.00
0.00 4.69 11.13 4.69 0.59 0.00
0.00 10.94 21.88 11.13 2.34 0.00
0.00 4.69 11.13 4.69 0.59 0.00
0.00 0.59 2.34 0.59 0.00 0.00
0.00 0.00 0.20 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00
```
If you'd like to experiment,
try changing the model parameter values in the file
`src/test/resources/data/heat.xml`,
then recompiling and running the examples again.
Is temperature on the plate conserved?
[bmi]: https://bmi-spec.readthedocs.io
[bmi-java]: https://github.com/csdms/bmi-java
[csdms-maven-repo]: https://csdms.colorado.edu/repository