2023/12/28

JAGURS on (intel) Mac w/ Homebrew

More recent information on June 4, 2024, we need to prepare ourself proj because proj@7 has been disabled. It's still available if you are using MacPorts.

Error: proj@7 has been disabled because it is a versioned formula! It was disabled on 2024-02-12.

(2024.9.6追記)

LIBS=-L$(PROJ4_DIR)/lib -L$(NETCDF)/lib -lnetcdff -lnetcdf -lsz -lproj $(FFTW3_LIB) -lm

のように,homebrew で他のバージョンのprojが /usr/local 等に入っている場合,自分で入れたPROJ4のディレクトリを先にリンカに指定する必要がある.


2023年12月27日現在の macOS Ventura 13.6.3 + Homebrew でのJAGURSのコンパイルについて再整理しておく。


  • gcc ... gfortran を使うので、gcc と gfortran をbrew で入れて、/usr/local/bin/gcc を使う。
    • FC=/usr/local/bin/gfortran
    • CC=/usr/local/bin/gcc
      • /usr/local/bin/gcc は無さそうなので, /usr/local/bin/gcc-14
  • proj ... メインのproj は、9.3.1 なので、おそらく動かない?ので、7.2.1 なproj@7 パッケージを使う。
    •   PROJ4_DIR=/usr/local/opt/proj@7
  • netcdf ... netcdf-fortran パッケージを入れる
  • fftw3 ... Homebrew のパッケージ名が fftw に変わってた
% brew install gcc gfortran proj@7 netcdf-fortran fftw


Makefile.gfortran をベースにして、以下の修正。

-FC=mpif90

+FC=/usr/local/bin/gfortran


-PROJ4_DIR=$(HOME)/local

-CC=gcc

+PROJ4_DIR=/usr/local/opt/proj@7

+CC=/usr/local/bin/gcc-13


-FFTW3_INCLUDE_DIR=$(HOME)/local/include

+FFTW3_INCLUDE_DIR=/usr/local/include


-NETCDF=$(HOME)/local

+NETCDF=/usr/local


-MPI=ON

+MPI=OFF


特殊な手続きは無しでコンパイル出来るようになったな。。。この記事の役割もほぼ終わったな。


input/ の中でそのままテスト計算(MPI部分はtsun.parから削除) on 1.4GHz dual cores Core i7

../src/jagurs par=tsun.par  4113.94s user 52.32s system 120% cpu 57:42.04 total

 

 



2022/02/06

JAGURS on MacOS Monterey with homebrew


 iMac 24" (M1)と iMac 27" (Intel) で改めてJAGURSで計算できる環境を作ったのでそのまとめ.

【訂正】2022.4.23

homebrew で, proj@7 が入っていることを同僚が教えてくれました.ので,proj-4.9.3は必要なく,Makefileで/opt/homebrew/Cellar/proj@7/7.2.1を/opt/homebrew/lib より前に指定すれば大丈夫なようです.かつ,最新版JAGURS(D0516)で,2020年に書いた mapproject.c の対応が本流に入ってるので,proj@7で無修正で動くようになりました.

ライブラリとして,netcdf, fftw3, proj4 が必要だけど,proj4は新しいのだと動かないので古いのを持ってくる.netcdfとfftw3は homebrew ので問題なし.

% brew install netcdf netcdf-fortran fftw3

proj4は,past-release から proj-4.9.3.tar.gz を持ってきました.

% ./configure --prefix=$HOME/local

% make

% make install


JAGURSのコンパイルは,Makefile.gfortran をベースにしました.

% rm Makefile (Makefile.SC_ICEに向いてるので)

% cp Makefile.gfortran Makefile


MPIはなし,とりあえず /usr/bin/gcc

% rcsdiff -u Makefile

===================================================================

RCS file: Makefile,v

retrieving revision 1.1

diff -u -r1.1 Makefile

--- Makefile    2022/02/04 21:52:49     1.1

+++ Makefile    2022/02/04 22:58:07

@@ -1,18 +1,18 @@

 # FC: Specify Fortran90 compiler command.

-FC=mpif90

+FC=gfortran


 # Added for displacement.

 # PRJ4_DIR: Specify PROJ.4 install directory.

 # CC&CFLAGS: Specify C compiler command and flags.

 PROJ4_DIR=$(HOME)/local

-CC=gcc

+CC=/usr/bin/gcc

 CFLAGS=-g -I$(PROJ4_DIR)/include


 # BASE: Specify basic compiler options.

 BASE=-cpp -fconvert=big-endian


 # FFTW3_INCLUDE_DIR: Specify FFTW3 include directory.

-FFTW3_INCLUDE_DIR=$(HOME)/local/include

+FFTW3_INCLUDE_DIR=/opt/homebrew/include


 # FFTW3_LIB: Specify linker options to link FFTW3.

 FFTW3_LIB=-lfftw3

@@ -21,7 +21,7 @@

 OPT=-O2 -fopenmp -I$(FFTW3_INCLUDE_DIR)


 # NETCDF: Specify the path to NetCDF library.

-NETCDF=$(HOME)/local

+NETCDF=/opt/homebrew


 # LIBS: Specify linker options.

 LIBS=-L$(NETCDF)/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lsz -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) -lm

@@ -40,7 +40,7 @@


 # MPI=ON: MPI version is made.

 # Else, serial version is made.

-MPI=ON

+MPI=OFF


 # USE_ALLTOALLV=ON: Use MPI_Alltoallv for inter-nest communications.

 # Else, MPI_Allreduce is used.

 

せっかくなので,inputにあるサンプルをベースにして,ベンチマーク.

Intel ... 3.6GHz 10コア第10世代Intel Core i9プロセッサ

M1 ... 4つの高性能コアと4つの高効率コアを搭載した8コアCPU、8コアGPU、16コアNeural Engineを持つApple M1チップ

% cat gridfile.dat

SD01 SD01 1 bathy.SD01.grd disp.SD01.grd

SD02 SD01 0 bathy.SD02.grd disp.SD02.grd

SD03 SD02 0 bathy.SD03.grd disp.SD03.grd


tsun.par:

dt=0.5

tend=21600

itmap=1200


こんな感じの設定で,M1はフルに8コアなので,Intelもそれに合わせて OMP_NUM_THREADS=8 に制限して実行した.

Intel ... All 5187.004 [s](デフォ20coresで 4823.238[s])

M1 ... All 5174.547 [s]


2020/11/25

JAGURS on MacOS Big Sur with homebrew


自分の環境のパッケージ管理を MacPorts から homebrew に乗り換えたりしたので改めてJAGURS を作り直してみる.ソースコードは,github から latest release になってる V0515a を持ってくる.使う環境は以下の通り:

MacBook Air (13-inch, 2017)

2.2GHz dual core Intel Core i7

8GB 1600MHz DDR3 memory

Big Sur

ライブラリのインストール

% brew install gmt fftw

 どうやら,proj_api.h が標準include pathに入ってくれなくなった?ようです.ので,

% find /usr/local -name proj_api.h

で探して,出てきたディレクトリを 

PROJ4_DIR=/usr/local/Cellar/proj@7/7.2.1

のように設定して下さい.以下のMakefileでは設定されていません (汚い).

Makefileの編集(編集後のファイルをリンク先に置いておきます)

Makefile@ -> Makefile.SC_ICE されてるので,とりあえず解除してから編集しています.編集箇所は,コンパイラを gcc-10, gfortran-10 にして,ライブラリ関係を /usr/local に設定. -lfftw が必要.MPI= なしに設定.-openmp は -o penmp として機能してしまうので, -fopenmp に修正.

% rm Makefile

% cp Makefile.SC_ICE Makefile

% rcsdiff Makefile

===================================================================

RCS file: Makefile,v

retrieving revision 1.1

diff -r1.1 Makefile

2c2

< FC=ifort

---

> FC=/usr/local/bin/gfortran-10

7,9c7,9

< PROJ4_DIR=/home/G10004/t-katou/JAGURS/local

< CC=icc

< CFLAGS=-g -traceback -I$(PROJ4_DIR)/include

---

> PROJ4_DIR=/usr/local

> CC=/usr/local/bin/gcc-10

> CFLAGS=-I$(PROJ4_DIR)/include

12c12

< BASE=-fpp -assume byterecl

---

> BASE=-cpp

18c18

< FFTW3_LIB=-mkl=sequential

---

> FFTW3_LIB=-lfftw3

23c23

< OPT=-O2 -openmp -openmp-report2 -I$(FFTW3_INCLUDE_DIR)

---

> OPT=-O2 -fopenmp

27c27

< NETCDF=/opt/atlocal/netcdf/4.1.3

---

> NETCDF=/usr/local

31c31

< LIBS=-i-dynamic -L$(NETCDF)/lib -lnetcdff -lnetcdf -L/opt/atlocal/supplibs/lib -lhdf5_hl -lhdf5 -lcurl -lsz -L$(PROJ4_DIR)/lib -lproj $(FFTW3_LIB) # for NetCDF4!

---

> LIBS=-L$(NETCDF)/lib -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lcurl -lsz -lproj $(FFTW3_LIB) # for NetCDF4!

47c47

< MPI=ON

---

> MPI=


あと,mapproject.c の修正が必要です.#include <proj_api.h> の前に #define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H を追加します.

% rcsdiff -p mapproject.c

===================================================================

RCS file: mapproject.c,v

retrieving revision 1.1

diff -p -r1.1 mapproject.c

*** mapproject.c        2020/11/25 05:49:41     1.1

--- mapproject.c        2020/11/25 05:50:08

***************

*** 1,6 ****

--- 1,7 ----

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

+ #define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H

  #include <proj_api.h>


  static  projPJ pj_tmerc, pj_latlong;

 

2020/07/24

Postfix on MacOS

なんか試行錯誤してやっとたどり着いたので記録.自宅などで,private net に隠れた Mac から,プロバイダのSMTPサーバ経由で外にメールを送る設定をする手順.

まず,relayhost を main.cf に設定する.
relayhost = smtpserver.example.com:port#

あとは巷にあふれるSMTPの設定."Mac postfix gmail" とかで検索すると情報いっぱいある.
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes

で,最後にやっと解決できたのは,メールの from アドレスの書き換え.SMTP認証が通っても,from が正しくないと通してくれない.うちの場合は, "Sender address rejected: not owned by user xxx@xxxx.example.com" と言われました.ので,これを強制的に書き換えてあげる必要があって,sender_canonical_maps に変換テーブルを作ってあげる.
sender_canonical_maps = hash:/etc/postfix/sender_canonical
local_header_rewrite_clients = static:all

中身↓
naotaka@(hostname).local email-address-in-provider

% sudo postmap /etc/postfix/sasl_passwd
% sudo postmap /etc/postfix/sender_canonical

(余談)
From アドレスの書き換えには, main.cf の myhostname を書き換えることでも対応可能なようにも思えるのですが,そこでは,naotaka@$myhostname になってしまいます.この naotaka がプロバイダのアカウントと一致してないといけないので,弾かれてしまいました.かつ,xxx@$myhostname の xxx が Mac に存在しないと不達になるという罠もあるので, myhostname は無視で,sender_canonical が正解でした.

(残課題)
SMTPUTF8 is required, but was not offered by host [provider-smtp-server] というエラーは出ていて,どうやら subject に日本語が入っていると通らなくて,crontab でディレクトリに日本語が入ってるスクリプトを起動してると subject に日本語が入ってしまって送れないという罠が残ってます.これはsmtp server 側の機能不足?か,client でencode してあげれば良いだけ?

(参考) https://tech-lab.sios.jp/archives/12289

2020/06/08

Matplotlib on Mac

http://ekbo.blogspot.com/2020/02/matplotlib-on-mac-homebrew.html

混沌としてきた.Catalina にアップグレードするタイミングで, Python 3.8 が供給されたのか,タイミングは分からないけど,自分にとっては同時になってしまった.

>>> import matplotlib.pyplot as plt
ImportError: numpy.core.multiarray failed to import
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/homebrew/lib/python3.7/site-packages/matplotlib/__init__.py", line 205, in <module>
    _check_versions()
  File "/opt/homebrew/lib/python3.7/site-packages/matplotlib/__init__.py", line 190, in _check_versions
    from . import ft2font
ImportError: numpy.core.multiarray failed to import

発端はこいつ.Pythonでグラフが書けなくなった.何が起きているのか全く分からなかったのだが,

% brew search python3

で判明.python@3.8 が供給されていて,インストールされている!!何かが起きても仕方がない状況が生じてしまったようだ...諦めて,

% /opt/homebrew/opt/python@3.8/bin/pip3 install matplotlib

で入れ直し.動いた.3.7 の削除をすべきか?

ps.
pipにしようかどうしようかと思っていたところもあったが,brewでpython入れると,

# You can install Python packages with
# /opt/homebrew/opt/python@3.8/bin/pip3 install <package>
って言われてる.従え.