M1 Silicon MacでFortran moduleをPythonで用いるための方法


<!-- ## **初めに**
f2pyの導入を試みている当初、f2pyがインストールできないと思い込んでいた。原因として、 
- ターミナルでf2pyが見つからない(これによってf2pyがインポートできないと思っていた)
- そもそもターミナルでcondaコマンドが使えなかった 
  
といった理由がある。そこでまずはなぜcondaコマンドが叩けないか調べた。 
<br>
<br>

### **原因はZshとBash**
Mac book proではデフォルトのターミナルがZshに設定されている。そこで、一度Bashに切り替えてみたところcondaコマンドを使用できることが確認できた。ちなみにこの切り替えは
```
chsh -s /bin/bash 
```
というコマンドをターミナルで実行した後再起動することで可能。逆に戻す場合は、
```
chsh -s /bin/zsh
```
で戻すことが可能。 -->


<!-- ## **手法１-  f2pyの利用**
[Qiita:Pythonで簡単にFortranのsubroutineを用いる方法](https://qiita.com/fpy_1000/items/fe13fe4c2df65399d1c2 ) を参考にした。

2021 4/30 11:21 

f2pyがAnacondaにインストール済みであることは確認できた。従来？の方法でfortranをコンパイルしようとしたがうまくいかない。 
```
gfortran: warning: this compiler does not support X86 (arch flags ignored)
```
などというかなり不穏なエラーも出ている。

2021 4/30 12:28

f2pyが動いている模様。.soファイルが作成された。しかし、pythonでimportできない。




## 手法2-  **C経由でpythonに翻訳する**
ISO_C_binding をfortranに導入してfortran -> C言語 -> python に変換することを狙う。
色々な解説をみていると.soファイルが作られるはず？ しかし、いざコンパイルするとなぜか.oファイルが生成される...

2021 5/3 18:23
```
gfortran -shared -fPIC -o test_.so test_.f90 
```
とコンパイルすることで、.soファイルが生成される。これをpython側で呼び出すことができれば目的達成か？参考：
[Fortran,Cとの連携](https://kyotogeopython.zawawahoge.com/html/%E5%BF%9C%E7%94%A8%E7%B7%A8/Fortran,%20C%E8%A8%80%E8%AA%9E%20%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA.html)

ctypesを用いることで読み込めるらしい、早速試すが

```
dlopen(Hydro/MMG/Fortran_module/test_.so, 6): no suitable image found.  Did find:
	Hydro/MMG/Fortran_module/test_.so: mach-o, but wrong architecture
	/Users/koike1/Desktop/M1_reserch/study_makisensei/5thlab_git/5th-Lab-1/Hydro/MMG/Fortran_module/test_.so: mach-o, but wrong architecture 
```
というエラーが発生f2pyでも似たような現象が発生

[mach-o, but wrong architecture なエラー](http://mikiss-street.blogspot.com/2010/10/mach-o-but-wrong-architecture.html)を参考に
architecture系のエラーが原因の様子であるのでターミナルで$File コマンドを実行することでサポートされているarchitectureを見る。

```
(base) MacBook-Pro-2:Fortran_module koike1$  file $(which python)
/opt/anaconda3/bin/python: Mach-O 64-bit executable x86_64
(base) MacBook-Pro-2:Fortran_module koike1$ file test_.so
test_.so: Mach-O 64-bit dynamically linked shared library arm64
```
確かにPythonと.soファイルのarchitectureが異なっていた。
gfortranでarchitectureを明示してコンパイルすることが可能らしいが、gfortranがx86にサポートされていないので次の方法を考える必要がある。

メモ   ーインテルコンパイラのライブラリの位置
```
/opt/intel/oneapi/compiler/2021.2.0/mac/compiler/lib
```

### Pythonの再インストール
[M1 MacにPythonインストールして開発環境構築してみた](https://zenn.dev/osuzuki/articles/380be0f682d72d)の方法に従ってインストールすることでarchitectureをarm64のnativeに出来た。 -->


<!-- ## f2pyをM1Macに導入するための方法 -->
### 0. 前提として...
- gfortranの最新版が使用できるようになっている(arm64版）
- ターミナルから正常にコマンドを実行できる

であるとして以下説明をするので、まずはこの２点に関して確認をしていただきたい。gfortranに関してhomebrewが使用できるなら、
```
＄ brew install gfortran
```
をターミナルで実行すれば問題ない。ただし、ターミナルがRosetta上でないことを確認しておかなければならない。これは、
```
＄ uname -m
```
をターミナルで実行して
```
arm64
```
と表示されればOK。もし、
```
x86_64
```
と表示された場合、Rosetta上で動いているのでその時は
```
＄ arch -arm64 zsh
```
を実行して必ず、armアーキテクチャ上で実行しているかに注意しておきたい。
### 1. miniforgeの導入
私がf2pyを使えなかった主たる原因はf2pyでコンパイルされた.soファイルとPythonのアーキテクチャが異なっていることにあった。そこで、arm64にNativeなPythonをインストールする必要がある。しかもなぜかminiforgeを通す必要がある(Anacondaはまだサポートされていない？)。
結構重要な工程を一つ飛ばしていたので追記しておきます。(追記：2021/12/16)


[conda-forge/miiniforge](https://github.com/conda-forge/miniforge)
からminiforgeをダウンロード。

次のコマンドを実行することでまず、miniforgeをインストールする。

```
$ bash Miniforge3-MacOSX-arm64.sh
```

<br>

PythonをMacで使用するために、「Python Mac インストール」とググると「homebrewでインストールしましょう」や「Anacondaを使うと便利です」など言われると思うが、*決して使ってはいけない！！(2021年５月6日現在）*
特にPyenvを使用している場合はすぐに
```
$ brew uninstall pyenv-virtualenv  
$ brew uninstall pyenv
```
を実行していただきたい(競合が起きる可能性がある）。

### 2. ARM64にNativeなPythonの導入
無事にminiforgeがインストールできたところで、Pythonをインストールする。miniforgeは
```
$ conda
```
コマンドで動かせる。pythonをインストールするために
```
$ conda install python=x.x
```
を実行する。ARM64に対応しているPythonが3.9以降のものなので最新版をインストールする。
以後ライブラリを適宜インストールする。miniforgeでインストールできるものは
```
$ conda install (ライブラリ名)
```
でインストール可能。f2pyを使用するためにnumpyは必須。

### 3. 環境の確認
ターミナルで
```
$ python -V
```
を実行し
```
Python 3.9.2
```
など、バージョン3.9以降になっていればOK.念のために
```
$ file $(which python)
```
を実行して、
```
/Users/(ユーザー名)/miniforge3/bin/python: Mach-O 64-bit executable arm64
```
のようになっていればARM64対応のPythonがインストールできている事が確認できる。これ以降f2pyを使用するための手順は従来の方法と変わらないので、[Qiita:Pythonで簡単にFortranのsubroutineを用いる方法](https://qiita.com/fpy_1000/items/fe13fe4c2df65399d1c2 )などを参考に各自確かめて頂きたい。

### 4. 参考
- [M1 MacにPythonインストールして開発環境構築してみた](https://zenn.dev/osuzuki/articles/380be0f682d72d)
- [mach-o, but wrong architecture なエラー](http://mikiss-street.blogspot.com/2010/10/mach-o-but-wrong-architecture.html)
- [三重大学奥村研究室 M1Mac](https://oku.edu.mie-u.ac.jp/~okumura/macosx/m1.html)
- [fortran66のブログ](https://fortran66.hatenablog.com/entry/2021/02/24/015532)