空力弾性計算プログラムSHARPyをWindows 10 + WSL (Ubuntu 22)にインストールする

# はじめに
この記事では柔軟構造の航空機の非定常空力弾性計算が可能なプログラムSHARPyをWindows10のWSL環境に導入し，テストケースの実行までを行います．
本文にはないですが，付属のテストケースsimple_HALEを実行し，その結果をparaviewで可視化するとこのような動画ができます．フゴイド的な動きが見られますね．

![flight0to100_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/2a6b0416-59d8-5385-0a36-33a45cf4ad3f.gif)



SHARPyはCやFortranで書かれたプログラムをPythonで動かすという仕組みになっているため，CとFortranのコンパイル環境とPythonの環境が必要です．ここではその環境構築から順に行います．
なお，公式のインストレーションが十分優しいので補足情報が主です．

# WSLのアンインストール（必要な人のみ）
:::note warn
注意：以下のアンインストールを実行すると既存のWSL環境は破壊されます．
:::
WSLのインストール（筆者の場合再インストール）は以下の記事を参考に行いました．
https://gist.github.com/4wk-/889b26043f519259ab60386ca13ba91b
基本的に従えばできますので，以下には補足情報を書きます．

提示したサイトにおけるA-2は具体的には以下のような状態になります．

![アプリと機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/fc7f8b3c-38fe-9da3-7023-2eecdbbb3d57.png)

A-3における「Turn Windows Features on or off」は日本語では以下の「Windowsの機能の有効化または無効化」のことを指します．

![機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/dd51d79a-cc3c-108e-2590-89a77b89227d.png)

「Virtual Machine Platform」と「Windows Subsystem for Linux」は以下の２つです．

![機能の有効化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/0def91d6-f5b5-1d6e-b709-4b77ff262c3d.png)

これらを実行した後，再起動を要求されますので再起動してください．

# WSLのインストール

再起動の後，続いてWSLのインストールを行います．インストール自体はコマンド一つでできますので簡単です．
```
 wsl --install
```
このインストールを終えるとまた再起動を要求されますので，再起動を行ってください．再起動すると自動的にWSLのターミナルが開くと思います．開かない場合はスタートメニューから開いてください．

![wsl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/2aac074e-5bd8-caba-b7c8-617a7854ae9c.png)

最初に数分のUbuntuのインストールが行われ，ユーザーネームとパスワードの設定が要求されます．ユーザーネームは必ず半角英語で入力してください．
それが終わればこういった画面が開いているはずです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/e623bd3b-9198-f5da-8f54-132dd8ca319b.png)
以上でWSLのインストールは完了です．

:::note
WSLを起動するとカレントディレクトリがcドライブ直下の場合があります．この場合はcd ~でWSLのホームに行くことができます．
:::

# CとFortranのコンパイラと補助機能のインストール

続いてWSLにC言語とFortranのコンパイラのインストールを行います．このインストールにはパッケージ管理ツールaptを使用します．aptは多くのソフトウェアをワンコマンドでインストール・アンインストールする事ができる便利なツールです．

まずaptを最新の状態にします．
```
 sudo apt update
```
これを行うことでaptでインストール可能なソフトウェアの一覧を更新することができます．

また，初回起動なので一応以下のコマンドで今現在入っているすべてのaptで管理されるソフトを最新にしておきます．
```
 sudo apt upgrade
```

:::note warn
複雑な環境では下手にupgradeすると動かなくなるプログラムがあったりするので，インストール直後以外は適当なタイミングで行いましょう．
:::
コンパイラのインストールは以下のコマンド一つで解決します．
```
 sudo apt install gcc g++ gfortran cmake make
```
これはaptでgcc，g++，gfortran，cmake，makeをインストールするということです．

# Miniconda3のインストール
SHARPyは何故かvenvではなくanacondaの仮想環境を使用しています．そのためanacondaをインストールする必要があります．
ここではMinicondaという最小機能のanacondaをインストールします．

Minicondaのインストールにはインストール用のシェルスクリプトを使用します．このシェルスクリプトは以下の公式サイトからダウンロードできます．
https://docs.anaconda.com/free/miniconda/
ダウンロードをブラウザ上で行うとわざわざWSLにいれる必要が出て手間なので，wgetを使用してコマンドラインでダウンロードしてみます．

まずは公式サイト上で必要なシェルスクリプトを探します．以下の画像の赤四角で囲んだものになります．

![miniconda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/a87eb857-6be9-bae6-67f5-900588ed19e8.png)

この緑で表示されているURLを右クリックし，URLをコピーします．このコピーしたURLを以下のコマンドの\<コピーしたURL\>に入れて実行します．
```
 wget -v <コピーしたURL>
```
これを実行するとシェルスクリプトがダウンロードできるはずです．
```
ls
```
で確認することができます．

次にこのシェルスクリプトを実行します．実行はbashコマンドで行います．

:::note warn
sudoするとインストール先がrootになって不便なのでsudoしないでください．
:::
```
 bash <ダウンロードしたシェルスクリプト.sh>
```
実行するとまずはライセンスに関する文書が出てきます．これ文章が終わったあとに「yes」を入力するところがあります．勢いよくEnterで読み飛ばしているとプリセットのnoが入力されて再度読み直しになります．
次にインストール先が確認されます．ここでrootではなくユーザーネームの下にインストールされることを確認してください．
最後にconda initする？みたいなことが聞かれます．これはyesで問題ないです．
ここまでが終わったらWSLを再起動してください．
```
 sudo reboot
```
ウインドウが閉じますので，適当な時間がたったあとに再度ウインドウを開いてください．
再度ウインドウを開くと以下のように名前の前に(base)がついた状態になっていると思います．この状態になっていればMInicondaのインストールはほぼできていると考えられます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/447277b4-1e30-438e-2a39-86a126326d45.png)

最後にcondaのバージョンチェックを実行して成功しているか確認しましょう．
```
 conda --version
```
成功していれば以下のように表示されるはずです．バージョンはインストール用のシェルスクリプトによって異なります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/522ef5a6-b3b8-8f73-d3c0-a80ab0864869.png)

# SHARPyのインストール
ここまでにSHARPyをインストールするための環境は整ったため，SHARPyのインストールを行います．
インストールは公式のインストレーションが優秀であるため，基本的に以下に従ってください．
https://ic-sharpy.readthedocs.io/en/latest/content/installation.html
ここでは筆者の環境で生じたエラーの対策や，間違いやすいところの注意点を述べます．

## condaの仮想環境に入っていない
インストレーションに従うと自動的に切り替わっていると思いますが，ユーザーネームの前に(sharpy)が表示されている状態でないとインストールできません．
これはcondaによって作られた仮想環境のうち，どの仮想環境に入っているかを示しています．
例えばターミナルを立ち上げた直後は(base)という基本環境にいます．ここではsharpyは使えませんので，
```
conda activate sharpy
```
でsharpyの仮想環境に入りましょう．もし仮想環境から出たい場合は
```
conda deactivate
```
でできます．

## condaのpythonバージョン追加が一生終わらない
当初筆者はMinicondaではなくAnacondaを使用してcondaまでは実行できるようにしたのですが，以下の赤四角で表示するcondaのコマンドを実行した際に「Solving environment:」のくるくるが一生終わりませんでした．対照実験できてなくて申し訳ないのですが，WSL入れ直してMinicondaにしたら解決しました．

![condamiss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/b1112506-ee44-4b52-0773-06460b79e5c1.png)

## libGL.so.1がない
SHARPyのmake installが完了したと意気揚々と
```
 sharpy --version
```
を実行したところ，長文の最後に
```
Do you have vtk installed properly?
VTK (and build instructions) can be obtained from http://www.vtk.org
```
ようなエラーが出ました．これはChatGPTに聞いたところ
```
 sudo apt-get install libgl1-mesa-glx
```
でインストールすれば良いとのことだったので実行したところ，エラーはなくなりました．
エラーの仕組みは知りません．

## 仮想環境にパッケージが不足している
さて気を取り直して
```
 sharpy --version
```
を実行したところ，scipyが不足しているとのエラーが出ました．これは「conda env create -f environment.yml」の際におもらししたと考えられます．そこで再インストールを行いました．
```
 conda uninstall scipy
 conda install scipy
```
これによってscipyの不足は解決しましたが，次にcontrolの不足が指摘されました．
これは
```
 conda install control
```
のみで解決しました．

ついでに導入するモジュールを記述したenvironment.ymlを見てみましょう．ここでかなり古いpandasを使用していることがわかります．これによってデータの読み込みに不具合が生じる場合があります．（X-HALEのサンプルプログラム）
```
name: sharpy
channels:
  - conda-forge
  - defaults
dependencies:
  - asn1crypto>=1.2.0      
  - colorama>=0.4.1        
  - control>=0.8.4         
  - dill>=0.3.1.1          
  - h5py>=2.9.0            
  - jupyterlab>=1.2.3      
  - lxml>=4.4.1            
  - mayavi>=4.7.1          
  - nbsphinx>=0.4.3        
  - pandas>=0.25.3         
  - pyOpenSSL>=19.0.0      
  - PySocks>=1.7.1         
  - PyYAML>=5.1.2          
  - recommonmark>=0.6.0    
  - slycot>=0.4.0
  - sphinx_rtd_theme>=0.4.3
  - wheel>=0.33.6          
  - xlrd>=1.2.0            
  - python=3.10
  - openpyxl>=3.0.10
  - cmake>=3.19.0
```

# テストケースの実行
インストールがうまくいくと
```
 sharpy --version
```
で以下のようにバージョン表示がされます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/ad5806ba-57a4-4552-d18b-e2a2465ea551.png)

テストケースの実行はインストールガイドをかなり下まで行くとあります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/40ca5266-0a30-f4d7-985c-a98f1dd8ae7c.png)

この画像で1. This command....でpythonを実行している場所はgit cloneしたsharpyです．コンパイル後現れるsharpyの中のsharpyではありません．

また，1. Run itにある\<path to solver file\>は./tests/xbeam/geradin/にある.sharpyという拡張子のファイルを指します．
実行すると
```
fatal: not a git repository (or any of the parent directories): .git
```
と出ますが，実は一切問題ありません．計算結果はソルバーと同じディレクトリのoutputにあります．

このあとプログラムの書き換えなどをするチュートリアルに入りますが，Windowsの方にVSCodeが入っているなら
```
 code .
```
でカレントディレクトリを中心にVSCode上でファイルを見て編集することができます．非常に便利なのでぜひご活用ください．

# おわりに
公式サイト頼りな説明でしたが，以上で環境構築から実行までできます．
~~今後はこれを用いて主翼の空力弾性モードの抽出に挑戦したいです．~~
空力弾性モードの抽出はできない（かつ一般的でない）ようなので構造のみのモード抽出を行います．
間違いや疑問などあればでXでなくQiita側でコメントをお願いします．履歴が残って便利です．

# おまけ：実際に実行したコマンド履歴（一部）
historyコマンドで得られた履歴を示しておきます．

下準備
```
    9  sudo apt update
   10  sudo apt upgrade
```
Minicondaのインストール
```
   12  mkdir Download #ダウンロードしたものを置くところを作成
   13  cd Download/ #移動
   14  wget -v https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh #Minicondaのシェルスクリプトをダウンロード
   15  ls #確認
   16  bash Miniconda3-latest-Linux-x86_64.sh #Minicondaのインストール 
   18  sudo reboot #再起動
```
SHARPyのインストール（途中でコンパイラをインストールしている）
```
   20  cd ~ #再起動したらC直下にいたのでWSLのホームに移動
   23  git clone --recursive http://github.com/ImperialCollegeLondon/sharpy #SHARPyのダウンロード
   25  python --version #pythonのバージョン確認
   26  conda install python=3.10 #pythonが3.11だったので使用するバージョンをインストール
   27  cd sharpy/utils #conda仮想環境の構築ファイルが有る場所に移動
   28  conda env create -f environment.yml #condaの仮想環境を構築
   29  cd ../.. #ガイドに従ってsharpyの上に戻る
   31  conda activate sharpy #仮想環境を有効化
   33  cd sharpy/ #sharpyに入る
   35  mkdir build #ビルド用のディレクトリを作成
   36  cd build #ビルド用ディレクトリに移動
   38  cmake .. #コンパイル準備失敗
   40  sudo apt install gcc g++ gfortran cmake make #コンパイラを忘れていたので入れた
   42  cmake .. #コンパイル準備成功
   43  make install -j 4 #コンパイル成功
   44  cd .. #sharpyに戻る
   45  pip install . #コンパイルした結果からpipでインストール
   46  sharpy --version #SHARPyの動作確認
   47  sudo apt-get install libgl1-mesa-glx #エラー出たので追加
   48  sharpy --version #再度確認
   52  conda uninstall scipy #エラー出たので追加
   53  conda install scipy
   55  sharpy --version #再度確認
   56  conda install control #追加
   57  sharpy --version #完了
```
テストケースの実行
```
   62  python ./tests/xbeam/geradin/generate_geradin.py #ソルバーを作成するためのpythonプログラムの実行
   64  sharpy tests/xbeam/geradin/geradin.sharpy #ソルバの実行
   69  code . #generate_geradin.pyを編集
   70  python ./tests/xbeam/geradin/generate_geradin.py #編集を反映するために再度
   71  sharpy tests/xbeam/geradin/geradin.sharpy #ソルバの実行
```