plantFEMでサーバーを立てて動かしてみる。

plantFEMでは、node.js風（あくまで、風です）に簡単にサーバーを立てることができます。
今回は、plantFEMで簡単なサーバーを立てて動かしてみます。
環境はUbuntu 18.04LTS or laterを想定しています。（Windows or macOS用に、dockerを使った起動方法も記載しています。）

### plantFEMのインストール

plantFEMは以下のgithubにおいて公開されています。

https://github.com/kazulagi/plantFEM

README.mdの通り、ターミナルに以下のコマンドを打ち込むことで一発でダウンロードとセットアップが完了します。


```{.copy}
git clone https://github.com/kazulagi/plantFEM.git && cd plantFEM && ./plantfem setup
```

次に、インストールを行います。


```{.copy}
./plantfem install
```

### Step1: サンプル用のサーバーを立てる

まず、サーバーを初期化します。



```{.copy}
./plantfem init
```

これで、サンプル用のサーバースクリプトがserver.f90にリンクされました。サーバーの中身は以下のような簡単なFortranスクリプトになっています。

```Fortran
program main
    use plantFEM
    implicit none

    print *, "This is a plain script"
    
end program main
```

以下のコマンドでサーバーを起動します。

```{.copy}
./plantfem run
```

すると、サーバープログラムが走ります。

```
 This is a plain script
```

### テンプレートを利用してサーバーを立てる。

次に、FortranとplantFEMライブラリを使ったテンプレート集がTutorial/の中にありますので、それらのうちいくつかを利用してサーバーを立てます。

```{.copy}
./plantfem new
```
このコマンドにより、サーバーを新規作成します。
すると、プロジェクト名、プロジェクトの保存先パスを聞かれます。今回はエンターを押してデフォルト名にします。
デフォルトでは、home/untitled/main.f90にスクリプトが生成されます。
最後に、テンプレートの種類を聞かれます。ここでは、1のFile-IOを選択してみます。

```
>>> new
[Your project name:  (default=untitled), if OK, press ENTER]
>>> 
[Path of the project (default=/home/username/plantFEM/home/), if OK, press ENTER ]
>>> 

Which template do you want to use?
1 : File-IO (std)
2 : Linear solvers (std)
3 ; MPI computing (std)
4 : Array operation (std)
5 : Create Mesh (fem)
6 : Diffusion-1D simulation (sim)
7 : Create soybean (obj)
For more detail, please check ./Tutorial/*
>>> 1
```
以上により、サーバースクリプトが生成され、かつserver.f90が正常にリンクされました。
以降、home/untitled/main.f90のスクリプトを変更して

```
./plantfem run
```

を実行すると、サーバーが走ります。
また、server.f90のリンク先を変更するには、

```
./plantfem ./your_fortran_script.f90
```

のように、サーバーに実行させたいスクリプトを./plantfemで呼び出すことでリンク先が変更され、その後実行されます。
なお、サーバープログラムをrunコマンドで実行するためには、Fortran90/95以降の形式でserver.f90にリンクまたはコピーされている必要があります。

ここで、サーバースクリプトは以下のようになっており、hello1.txtからhello10.txtまでの連番ファイルが生成されます。

```Fortran
program main
    use std ! standard package of SiCroF library
    implicit none

    ! This example utilizes Input-Output Class, where
    ! You can handle external files.

    ! How to use:

    ! First, create the instance

    type(IO_) :: f ! file-IO instance
    integer(int32) :: i, num ! int i and int num
    

    ! #1 create, edit and close files.
    ! ----> open file(filepath, filename, extention)
    call f%open("./","test",".txt")
    ! write something
    call f%write(str(100.0d0) )
    write(f%fh,*) 100.0d0
    ! and close it
    call f%close()



    ! ----> create sequential files (filepath, filename, extention)
    ! it creates
    ! ./hello1.txt
    ! ./hello2.txt
    ! ./hello3.txt
    ! ...
    ! ./hello10.txt

    ! for i=1; i<11;i++
    do i=1,10
        !    f.open(filepath, filename, extention)
        !    str(int) => string
        call f%open("./","hello"//trim(str(i)),".txt")
        
        ! This
        call f%write(str(i))
        ! and this
        write(f%fh,*) str(i)
        ! are same 

        call f%close()

        call f%open("./","hello"//trim(str(i)),".txt")        
        ! read a line
        read(f%fh,*) num
        ! print(num)
        print *, num

        call f%close()
    enddo

    ! Importance Index 7 / 10 : [*******   ]

    
end program %  
```

また、サーバーを実行する際に、実行可能ファイル（./a.out）が生成されます。
この実行可能ファイルを走らせることもできます。

```
./a.out
```

### Dockerを利用したサーバーの実行

Ubuntu意外のOSでは、Dockerを利用してサーバーを立てることができます。

まず、
https://github.com/kazulagi/plantFEM

より、レポジトリをクローンしてきます。

次に、plantFEM/docker/に入ると、Dockerfile等が置かれています。

ここで、windowsであれば、コマンドプロンプト(or powershell)から

```powershell
build.bat
```
を実行、Windows意外のosであれば、

```
./build
```

を実行します。（注：管理者権限が必要な場合があります。）
その後、docker cpコマンドで手元のサーバースクリプトをplantfem/server.f90として送り込み、docker runコマンドでコンテナを走らせることができます。

また、dockerコンテナ内に入りたい場合、

windowsであれば、コマンドプロンプト(or powershell)から

```powershell
run.bat
```
を実行、Windows意外のosであれば、

```
./run
```

を実行します。（注：同様に、管理者権限が必要な場合があります。）

### まとめ

plantFEMでサーバーを作成し、起動した。
また、Dockerを用いてサーバーを起動した。