見出し画像

OceanParcels(2) ~Quickstart to Parcels(2)

引き続きOceanParcelsのQuickstart to Parcelsのページを訳しながら進める

Running particles in backward time

お次は逆輸送を考えるらしい。なんか簡単とか言ってる
dt < 0を考えてやるらしい

まずは同様に、必要なモジュール類をimportする

import math
from datetime import timedelta
from operator import attrgetter

import matplotlib.pyplot as plt
import numpy as np
import trajan as ta
import xarray as xr
from IPython.display import HTML
from matplotlib.animation import FuncAnimation

from parcels import (
    AdvectionRK4,
    FieldSet,
    JITParticle,
    ParticleSet,
    Variable,
    download_example_dataset,
)

particlesetまでの流れは同じ(前回参照

example_dataset_folder = download_example_dataset("MovingEddies_data")
fieldset = FieldSet.from_parcels(f"{example_dataset_folder}/moving_eddies")

fieldset.computeTimeChunk(time=0, dt=1)

##particleset

pset = ParticleSet.from_list(
    fieldset=fieldset,  # particleを投入するfieldの指定
    pclass=JITParticle,  # 粒子の種類 (JITParticle と ScipyParticleの2種類がある)
    lon=[3.3e5, 3.3e5],  
    lat=[1e5, 2.8e5],  
)

##field と particle の図示

###field の図示
#plt.pcolormesh(fieldset.U.grid.lon, fieldset.U.grid.lat, fieldset.U.data[0, :, :])
#plt.xlabel("Zonal distance [m]")
#plt.ylabel("Meridional distance [m]")
#plt.colorbar()

### particle の図示
#plt.plot(pset.lon, pset.lat, "ko") # 粒子を黒い丸い点で示す
#plt.show()

##karnelset

###出力先のファイルを指定する
output_file = pset.ParticleFile(
    name="EddyParticles_Bwd.zarr",  # ファイルの名前
    outputdt=timedelta(hours=1),  # 出力のtime stepを指定
)

###実際に計算する
pset.execute(
    AdvectionRK4,  # 使用するkarnelを指定
    runtime=timedelta(days=6),  # runの長さを指定
    dt=-timedelta(minutes=5),  # kernelのtimestepを指定、ここでマイナスにすることで逆輸送できる
    output_file=output_file,
)

重要なのは最後のブロック4行目の
dt=-timedelta(minutes=5)
においてtimedeltaの前にマイナス記号がついていることだ、これにより逆向きの推定ができるようになる

図の表示は同様

plt.pcolormesh(fieldset.U.grid.lon, fieldset.U.grid.lat, fieldset.U.data[0, :, :])
plt.xlabel("Zonal distance [m]")
plt.ylabel("Meridional distance [m]")
plt.colorbar()

plt.plot(pset.lon, pset.lat, "ko")
plt.show()

OceanParticlesのページはすでに6日の設定で走らせたものを巻き戻しているが、そうではなく初期位置から6日間巻き戻す設定で走らせてみると以下のような図が得られる

Adding a custom behaviour kernel

a simple kernel where particles obtain an extra 2 m/s westward velocity after 1 day
つまり粒子は1日後にさらに2m/sの西向きの速度を得るようなkernelを作成する

def Westvel(particle, fieldset, time):
    if time > 86400: #1日後になったら
    uvel = -2.0, #追加する流速の設定
    particle_dlon += uvel * particle.dt 

ここのparticle_dlonがどういうものなのか…
とりあえずここは私も理解しないまま、後で勉強する…ということにする。

上記コマンドをparticlesetに入れ込んで、再度partclesetを実行する。
そして以下のコマンドを実行する。pset.execute()内のKarnelを指定するところが、[AdvectionRK4, WestVel]となっていてWestVelが入っていることに注意。意外に簡単に加えることができる。

### particle の投入

pset = ParticleSet.from_list(
    fieldset=fieldset,  # particleを投入するfieldの指定
    pclass=JITParticle,  # 粒子の種類 (JITParticle と ScipyParticleの2種類がある)
    lon=[3.3e5, 3.3e5],  
    lat=[1e5, 2.8e5],  
)

##karnelset

###出力先のファイルを指定する
output_file = pset.ParticleFile(
    name="EddyParticles_WestVel.zarr",  # ファイルの名前
    outputdt=timedelta(hours=1),  # 出力のtime stepを指定
)

###実際に計算する

pset.execute(
    [AdvectionRK4, WestVel],  # 使用するkarnelを指定、単純にカーネルをリストにまとめる
    runtime=timedelta(days=2),
    dt=timedelta(minutes=5),
    output_file=output_file,
)

なお、前回の逆輸送のコードを改変して再利用する場合、
dt = -timedelta(minutes=5)
の-を必ず外すこと、外さないと処理が途中で止まってしまう。
またoutputのファイル名は変える

そして以下のコードで図に出力

ds = xr.open_zarr("EddyParticles_WestVel.zarr")

plt.xlabel("Zonal distance [m]")
plt.ylabel("Meridional distance [m]")
plt.plot(pset.lon, pset.lat, ".-")
plt.show()

以下が出力結果

この記事が気に入ったらサポートをしてみませんか?