Japan
サイト内の現在位置
NumPy互換数値演算ライブラリNLCPyの新機能SCAインターフェース
no.020ステンシル定義式における係数の取り扱いやステンシル計算式の定義などについて2022.8.11. NLCPy SCAインターフェースの使用方法
前回は「ライフシミュレーション」プログラムをサンプルとして、descriptorやkernelを使ったステンシル計算について説明しました。今回はステンシル定義式の係数の取り扱いや、ループ処理を使ったステンシル計算の定義など、前回触れなかった内容を説明します。
2. ステンシル定義式における係数の取り扱い
以下のステンシル定義式を例に係数について説明します。
dx(0)=c1×dx(-1)-c2×dx(+1)
係数c1とc2において、Figure-1の入力[3]ではステンシル定義式にスカラ値を直接指定しています。この他、係数をndarray配列に収納して式内で参照することもできます(入力[4])。 In [1]:
import nlcpy as vp
import numpy as np
In [2]:
x = vp.arange(10.)
dx = vp.sca.create_descriptor(x)
print(x)
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
In [3]:
desc = 0.5*dx[-1] - 1.5*dx[1] # スカラ値による係数定義
kern = vp.sca.create_kernel(desc)
kern.execute()
Out[3]:
array([ 0., -3., -4., -5., -6., -7., -8., -9., -10., 0.])
In [4]:
coef_vp = vp.array([0.5, 1.5]) # NLCPy ndarray配列を使用した係数定義
desc = coef_vp[0]*dx[-1] - coef_vp[1]*dx[1]
kern = vp.sca.create_kernel(desc)
kern.execute()
Out[4]:
array([ 0., -3., -4., -5., -6., -7., -8., -9., -10., 0.])
In [5]:
vp.sca.destroy_kernel(kern)
Figure-1
なお、NLCPyとNumPyに入れた係数に対して行う変更は異なる結果を返す場合があります。
係数c1及びc2にNLCPyのndarrayを使用する場合には、ステンシル定義式
desc=coef[0]×dx[-1]-coef[1]×dx[1]
の係数の参照先はndarrayのデータ値そのものではなく、ndarray配列のアドレスになります。アドレスを参照先にすることで、NLCPy ndarray配列の係数に対する変更は、SCA kernelを再度定義することなく変更後の係数を使ったkernelの実行が行われます。Figure-2の入力[3]では、NLCPy ndarrayに格納した係数を2倍して、その直後にkernelを実行しています。kernelを改めて定義せずとも出力[3]では2倍された係数が計算に反映されます。