## Simput

### Goal

To provide a simple way to write input simpulation files.

## Installation

```sh
$ npm install -g simput
```

## Usage

After installing the package you will get one executable **Simput** with
the following set of options:

```sh
$ Simput

  Usage: Simput [options]

  Options:

    -h, --help                    output usage information
    -V, --version                 output the version number

    -i, --input [file|directory]  Input file or directory
    -o, --output [directory]      Output directory to output to
    -t, --type [type]             Type of input

    --no-gui                      Just generate output
    -s, --silent                  Do not open the browser

    -c, --compile [directory]     Directory to compile files
    -m, --minify                  Minify compiled file
    -a, --add [file]              Add model to list of available inputs
    -l, --list                    List model types of available as inputs
    -r, --remove [type]           Remove model to list of available inputs

```

## Examples

```sh
$ Simput -t pyfr -o ~/pyfr/example
```

Starts a server and opens your web browser, an empty PyFR model is loaded which you can modify. The _Save_ button will export a pyfr.json file (model) which you can then be loaded later on. The _Convert_ button will export a `pyfr.ini` file for PyFR execution.

As no initial model was provided, the boundary names will be autogenerated.
In order to pre-define those boundary names, you can either edit the generated model (`pyfr.json`) or start with an empty model you've created like the following one.

my-pyfr-model.json
```js
{
    "type": "pyfr",
    "data": {},
    "external": {
        "boundary-names": {
            "User friendly name": "value-expected-by-code",
            "Inlet": "inlet",
            "Outlet": "outlet",
            "External walls": "external-wall"
        }
    }
}
```

Then loading it back for further edits can be performed with the following command line:


```sh
$ Simput -i my-pyfr-model.json -o ~/pyfr/example
```

## Demos

There are a few supplied demos in the folder `types`, each have their own README.

## Development

```sh
$ git clone --recursive https://github.com/Kitware/simput.git
$ cd simput
$ npm install
$ npm run build
$ npm link
$ Simput

  Usage: Simput [options]

  Options:

    -h, --help                    output usage information
    -V, --version                 output the version number

    -i, --input [file|directory]  Input file or directory
    -o, --output [directory]      Output directory to output to
    -t, --type [type]             Type of input

    --no-gui                      Just generate output
    -s, --silent                  Do not open the browser

    -c, --compile [directory]     Directory to compile files
    -m, --minify                  Minify compiled file
    -a, --add [file]              Add model to list of available inputs
    -l, --list                    List model types of available as inputs
    -r, --remove [type]           Remove model to list of available inputs

```

Then to compile pyfr and publish it:

```sh
$ Simput -mc types/pyfr/src/ -t pyfr -o dist/types/
```

### Degbugging

A recent version Firefox is preferred for debugging. Errors in Chrome do not always point to [the exact line](https://github.com/altano/handlebars-loader/issues/67#issuecomment-171128403) where the error is happening.

## Creating a new simulation type

In a separate location create a folder for your type:

```sh
mkdir mytype
cd mytype
git init
```

Create the folder and file structure: 

- `/src`
    - `/lang`
        - `/[language]` e.g. "en", "fr"
            - `label.json`, attribute and property labels.
            - `/help`, help dialogs, _recommended, not required_
                - `/[folders for each attribute]`
                    - `[file for each property, contents are html]`
    - `/templates`
        - [template file and helpers]
    - `model.json`, primary data structure.
    - `convert.js`, converts the model into the simulation deck format.
    - `parse.js`, converts a complete input file to the simput model; _recommended, not required_.
- `/samples`, empty or partially full sample datasets; _recommended, not required_.
- `/versions`, an output folder for your compiled type; _recommended, not required_.
- `README.md`, a description of your type; _recommended, not required_.

For examples of each take a look at `types/demo`

### **Optional**: Add the type as a submodule to this repository
__It's critical that these are executed in order__

```sh
git checkout -b type-[mytype] #replace 'mytype' with the name of the new type
git commit -m "initial commit"
git remote add origin https://github.com/Kitware/simput.git
git push origin [mytype-branch] # where 'mytype-branch' is the current branch name
cd [your simput repo]
git submodule add -b [mytype-branch] https://github.com/kitware/simput types/[mytype]
git add .gitmodules types/
git commit -m "added [mytype]"
git push
```

## Licensing

**Simput** is licensed under [BSD Clause 3](LICENSE).

## Getting Involved

Fork our repository and do great things. At [Kitware](http://www.kitware.com), we've been contributing to open-source software for 15 years and counting, and want to make **Simput** useful to as many people as possible.
