chap. 4...
TRANSCRIPT
![Page 1: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/1.jpg)
地球惑星内部物理学演習B 資料4
27
Chap. 4 数値計算による偏微分方程式の解
1.数値積分の応用: プレートの冷却の数値シミュレーション 数値積分の応用として,プレートの温度を推定する問題を取り上げる。 1.1 プレートの温度のモデル プレートは中央海嶺で生まれ,海溝でマントルの中へ沈み込む。熱いマントル物質がマントル深部から上昇して来て湧き出す場所が中央海嶺である。地表にぶつかり,水平に運動すると,表面から熱伝導により徐々に冷やされる。これによって,冷えた部分が
熱くなり,冷たい岩石は変形しにくいので剛体の板のように振る舞う。これがプレートの熱的進化である。
図 4.1 海洋底の年代
ここで,プレートが海嶺で生まれ,徐々に冷やされて厚くなっていく様子をシミュレートしてみよう。マントルの温度の深さ分布が時間変化するのを計算する。 熱伝導による温度の変化は熱伝導方程式
(1) に支配される。ここで,Tは求める温度(°C),zは深さ(m),tは時間(s)である。ρ は密
プレートの年代 ( 万年 )←新しい 古い→0 2000 4000 6000 8000 10000 12000 14000 16000 18000
ρCp∂T∂t
= k∂2T∂z2
+ ρH
![Page 2: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/2.jpg)
地球惑星内部物理学演習B 資料4
28
度(kg m-3),Cpは定圧比熱(J kg-1),kは熱伝導率(W m-1),Hは単位質量の岩石中にある放射性元素が出す熱発生率(W kg-1)である。 ただし,放射性元素の発熱は,プレートの年齢の1億年程度では無視できるので,ゼロ
とする。熱拡散率κ(m2 s-1)
(2) を用いると,拡散方程式と同じ形,
(3) となる。中央海嶺に上がってきた温度 TMを持つ熱い物質が,温度 T0の冷たい上部から冷やされていくという条件下*2で,この式を解く。Chap. 2 によると
(4) と求められる。ここで,erf は誤差関数である。誤差関数は解析的に求めることができないので,Chap. 3 で説明した数値積分により求める。
時間が経つと深部まで冷却されて,温度の低い部分,すなわちプレートは厚くなる。このモデルは,マントルはプレートよりも十分厚いと考えて,無限遠に境界が取られている。このため,時間が経つとプレートは際限なく厚くなる。このようなモデルをプレ
ートの半無限体冷却モデル(half-space cooling model)と呼ぶ*3。プレートテクトニクスが誕生するよりもずっと昔,William Thomson (Lord Kelvin)は半無限体冷却モデルを地球の冷却に適用し,地球の年代を推定した。このモデルは誤りであったが,物理的手
法から地球の年代を求めようとする初めての試みであった。 *2 解く式は時間に1階,空間に2階の微分方程式なので,解くために時間に対して1
つ,空間に対して2つの条件が必要である。ここでは,時間 t=0と空間 z=0と∞に条件を与える。時間 t=0の時に与える条件を初期条件と呼ぶ。また,空間の端や境界に与える条件を境界条件とよぶ。初期条件として熱いマントル
(5)
と仮定する。境界条件は
(6)
κ =k
ρCp
∂T∂t
=κ ∂2T∂z2
T z,t( ) = T0 + TM −T0( )erf z2 κ t
⎡⎣⎢
⎤⎦⎥
T z,t = 0( ) = TM
T z = 0,t( ) = T0
![Page 3: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/3.jpg)
地球惑星内部物理学演習B 資料4
29
(7)
とする。この条件下で解を解析的に表すことが出来ない。
*3 プレートは際限なく厚くなると考えるより,一定の厚さに近づくと考える方が,年代による海底の水深の変化を説明出来るとするモデルもある。このモデルはプレート冷
却モデルと呼ばれる。その原因はよく分かっていないが,プレート底面の重力不安定による剥離や熱伝導の温度依存性の効果などが考えられる。
1.2 数値積分のプログラムを利用してプレートの温度を計算するプログラム 問題 4-1 にプレートの温度を計算するプログラムを示す。このプログラムではプレートの年代を入力すると温度の深さ分布を計算するようになっている。
このプログラムは,誤差関数計算の部分とその他の部分という2つにプログラムからなっている。誤差関数の計算する部分は,その他の部分から呼び出される。このような,別のプログラムから呼び出されるプログラムをサブルーチンプログラム(あるいは単に
サブルーチン)と呼ぶ。プログラムの一番目に動く部分をメインプログラムあるいはメインルーチンと呼ぶ。2つのプログラムは1つのファイルにしても良いが,サブルーチンごとに別のファイルにすることも出来る。ここでは,2つのファイル(plate_main.f
およびplate_erf.f)とした。サブルーチンを使う時には変数値の受け渡し方や配列の
取り方に決まりがある。特に,変数の受け渡しの所は間違えると実行時エラーになり,エラーの原因が分かりにくいので,注意が必要である。
コンパイルするときには,ファイルの名前を羅列すればよい。つまり f95plate_main.fplate_erf.f
と入力する。1つの実行形式ファイル a.out が作られる。
問題 4-1 1.メインとサブルーチンの2つのプログラムを入力して,コンパイルせよ。
2.プログラムを実行し,1千万年,2千万年,4千万年,8千万年,1億 6千万年のプレートの温度分布を計算せよ。結果をグラフに表し,それぞれの時間においてプレートの厚さ(1200°C 程度の温度になる深さ)を求めよ。プレートの厚さは時間に対し,ど
のような規則で厚くなるのか?(必要なら計算する年代を増やして) その規則性を発見せよ。
T z = ∞,t( ) = TM
![Page 4: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/4.jpg)
地球惑星内部物理学演習B 資料4
30
2.差分法による偏微分方程式の解法 偏微分方程式に出てくる微分係数の計算を有限差分商で置き換えて解く方法を有限差分法(Finite difference method, FDM)という。フーリエ級数を使う方法と比べると,変数分離できない場合や,境界条件が周期的でなく複雑な場合にも利用することができる。 2.2 有限差分方程式の導出 ここでは,熱伝導方程式と同じ形の拡散方程式
(21) を考える。連続した x座標をDx毎に離れた点の集合と考える。連続した座標を点などのの集合で置き換えることを離散化という。テイラー展開を用いると,Dxだけ離れた
点の値は
(22)
(23) と表される。ここで,次のような差を作る。
(22)‒f(x,y):
(24) f(x,y) ‒(23):
(25) (22) ‒(23):
(26) それぞれの式から一回微分を求めると
(27)
(28)
φ x + Δx,t( )−φ x,t( ) = ∂φ∂x
Δx + 12∂2φ∂x2
Δx( )2 +!
φ x,t( )−φ x − Δx,t( ) = ∂φ∂x
Δx − 12∂2φ∂x2
Δx( )2 +!
φ x + Δx,t( )−φ x − Δx,t( ) = 2 ∂φ∂x
Δx + 13∂3φ∂x3
Δx( )3 +!
![Page 5: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/5.jpg)
地球惑星内部物理学演習B 資料4
31
(29) のように偏微分係数を差分商で表すことができる。O(Dx)の項は偏微分係数と差分商の
差を表し,その大きさがDx1乗の大きさであることを表す。この大きさは微分を差分で近似したときの誤差を表し,打ち切り誤差とよばれる。ここで,(27)を前進差分,(28)を後退差分,(29)を中心差分とよぶ。前進差分と後退差分は O(Dx)の打ち切り誤差,中
心差分は O((Dx)2)の打ち切り誤差を持つ。 2階微分は(22)+(23)により得られる。
(30) より,
(31)
となる。これらを組み合わせると拡散方程式の差分方程式が得られる。時間座標もDt
毎の点の集合と考え,時間微分に前進差分,空間微分に(31)を用いると,
(32) となる。この式を変形すると,
(33) を得る。この式はDtだけ未来の時間の値が現在の温度と発熱量から計算できることを表している。このように未来の時間の値を直接得ることができる方法を陽解法とよぶ。この式は時間に対して O(Dt),空間に対して O((Dx)2)の打ち切り誤差を持つ。時間に対して1次の誤差を持つ方法をオイラー法とよぶ。 差分法の式を表すのに( )で引数を表すのは煩雑である。このため,xを i 番目の点,t
を n 番目の時間と考え,
のように添え字で表す。このとき,(33)は
(34) と表すことができる。
∂φ∂x
=φ x + Δx,t( )−φ x − Δx,t( )
2Δx+O Δx( )2( )
φ x + Δx,t( )+φ x − Δx,t( ) = 2φ x,t( )+ ∂2φ∂x2
Δx( )2 + 112
∂4φ∂x4
Δx( )4 +!
φ x,t + Δt( )−φ x,t( )Δt
=κ φ x + Δx,t( )+φ x − Δx,t( )− 2φ x,t( )Δx2
+ H x,t( )
φ x,t + Δt( ) = φ x,t( )+κΔt φ x + Δx,t( )+φ x − Δx,t( )− 2φ x,t( )Δx2
+ ΔtH x,t( )
φ x,t( ) = φin
φin+1 = φi
n +κΔt φi+1n +φi−1
n − 2φin
Δx2+ ΔtHi
n
![Page 6: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/6.jpg)
地球惑星内部物理学演習B 資料4
32
2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えて xの2つの端の値が必要なことが分かる。これは境界条件
とよばれる。熱伝導方程式は時間に1階,空間に2階の偏微分方程式である。従って解を求めるために,時間に対して1つの境界条件,空間に対して2つの境界条件が必要である。時間の境界条件を時間 t=0に対して与える場合,これを初期条件,あるいは初期
値と呼ばれ,初期値から計算を時間進行で行う問題を初期値問題という。 元の微分方程式では,初期値は空間全ての点について与える。すなわち1次元では,
(35)
である。境界条件はすべての時間に対して与える。このとき,次のような組み合わせが考えられる。
・2つの境界の両方に値を与える ・2つの境界の1つに値,1つに勾配を与える ・1つの境界に値と勾配を与える
値そのものを与えるタイプの境界条件をディリクレ型,勾配を与えるものをノイマン型境界条件とよぶことがある。 x=0の境界に温度を与えるには,
(36)
とする。一方,勾配を与える場合は
(37) を用いる。
2.2 境界条件の差分法における扱い 差分法では温度の境界を与えるのは簡単である。境界に点を置き,その点の温度に境
界の値を入れてやればよい。添え字付きの式で表すと,
(38)
と書くことができる。一方,勾配を与える場合は次のように考える。境界には外側はないことに注意する。x=Lの点では,境界の点とその1つ内側の点と2つの点で差分を作る。すなわち,後退差分である。つまり,
φ x,t = 0( ) = φ ini x( )
φ x = 0,t( ) = φ0 t( )
dφdx
= qk
φ0n = φ0
![Page 7: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/7.jpg)
地球惑星内部物理学演習B 資料4
33
(39) となる。境界条件を表すこの差分が,O(Dx)の打ち切り誤差となっていることに注意が
必要である。このとき,境界の値は
(40) と書くことができる。このとき,境界条件を表すこの差分が,O(Dx)の打ち切り誤差を持っていることに注意が必要である。境界を m番目の点と考え,添え字を使うと
(41) と表される。
2.3 数値的安定性 理由は後で説明するが,式(33)(34)は無条件に計算が可能なわけではない。振動や発散が起きて物理的に正しい答えにならなくなったり,計算が不能になったりする。数値
計算の際に起こるこのような現象を数値的不安定とよぶ。数値的不安定を起こさないためには計算に誤差が発生したときに徐々に小さくなる(収束する)ような条件が必要である。この条件を数値的安定性の条件という。1次元の拡散方程式を(33)のようにオイラー法で解く場合は,
(42) が数値的安定性の条件となる。拡散係数kが大きいほど,また,計算点の間隔Dxが小さいほど厳しい条件となる。
3.差分法の応用:プレート冷却のシミュレーション 熱伝導方程式の解を差分法で解くことにより,プレートの冷却をシミュレートする。境界条件の与え方によって,半無限体冷却モデルでもプレート冷却モデルのどちらでも計
算することが可能である。 3.1 基礎方程式と境界条件 基礎方程式は,熱伝導方程式である。1億年程度では放射性元素の影響による内部加熱項は無視できるので,この項を0とした式を用いる。今一度書いておくと,
φ L,t( )−φ L − Δx,t( )Δx
= qk
φ L,t( ) = φ L − Δx,t( )+ Δx qk
φmn = φm−1
n + Δx qk
Δt ≤ Δx2
κ
![Page 8: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/8.jpg)
地球惑星内部物理学演習B 資料4
34
(51) である。境界条件は,表面では温度 Tsで一定である。つまり,
(52)
である。底面の境界条件は,プレートモデルの場合,温度一定である。つまり,
(53)
となる。半無限体冷却モデルの場合は,境界は無限遠にある。しかし,無限遠は表現で
きないので,十分遠いところにあるとする。この場合には,温度一定の(53)で与えることも可能であるし,温度勾配を0とした境界で与えることも可能である。後者の場合は,
(54) より,
(55)
となる。初期条件は表面を除くすべての点に,
(56)
と与える。
3.2 プレート冷却シミュレーションのアルゴリズム 問題 4-2 に実際のプログラムを示す。プログラミングをする際のアルゴリズムは下記のようになる。 (1) 初期条件はタイムステップ0のみ For i=1 to m
(61)
(2) 温度の値をファイルに書き出す (3) 時間進行:オイラー法
For i=1 to m-1
∂T∂t
=κ ∂2T∂z2
T0n = Ts
Tmn = TM
Tmn −Tm−1
n
Δx= 0
Tmn = Tm−1
n
Ti0 = TM
Ti0 = TM
![Page 9: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/9.jpg)
地球惑星内部物理学演習B 資料4
35
(62) (4) 境界条件の設定
(63)
(64)
(5) 新旧変数の入れ替え
(65)
この等号は代入文を意味することに注意せよ。 (6) 必要に応じて温度の値をファイルに書き出す
(7) (3)へ戻る 問題 4-2 1.メインルーチンとサブルーチン2つの計3つのプログラムを入力して,コンパイルせよ。 2.プログラムを実行し,1千万年,2千万年,4千万年,8千万年,1億 6千万年の
プレートの温度分布を計算せよ。結果をグラフに表せ。 3.地殻熱流量がプレートの厚さと同様な時間依存性を持つことを確認せよ。
Tin+1 = Ti
n +κΔt Ti+1n +Ti−1
n − 2Tin
Δx2
T0n = Ts
Tmn = Tm−1
n
Tin = Ti
n+1
![Page 10: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/10.jpg)
地球惑星内部物理学演習B 資料4
36
図 4.2 地殻熱流量の分布(データは Davies, 2013 による)
図 4.3 地殻熱流量(上)と温度(下)の計算値
熱流量 [mW/m ]2
0
100
200
3000 20 40 60 80 100 120 140 160
400800
1200
0
100
200
3000 20 40 60 80 100 120 140 160
温度 (°C)0
100
200
3000 20 40 60 80 100 120 140 160
年代 (Ma)
0
100
200
3000 20 40 60 80 100 120 140 160
0
50
100
150
200
250熱流量 (mW/m )
0
50
100
150
200
250
02004006008001000120014001600
2
![Page 11: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/11.jpg)
地球惑星内部物理学演習B 資料4
37
問題 4-1 プログラム プログラムのほか,パラメータを入力するためのデータファイルが必要である。それぞれのフ
ァイルを同じディレクトリに置いて,コンパイル,実行すること。
メインプログラムファイル plate_main.f90
!**********************************************************************
!**
!*1-DHalf-spacecoolingmodelforplatethermalevolution*
!**
!**********************************************************************
programhcm1_main
implicitnone
real(8)::rho,Cp,ak,D
real(8)::age,T0,TM
real(8)::zk,z,zmax,dz,dzk,t
real(8)::eta1,eta2,erfy,derf
real(8),allocatable::Tmp(:)
integer::nz,j,ntra
character(40)::apara,outfile
!*****readparameters*****
!Openparameterfile
open(10,file='pl_para.dat')
!readfile
read(10,*)apara
![Page 12: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/12.jpg)
地球惑星内部物理学演習B 資料4
38
read(10,*)outfile
write(6,*)apara,'=',outfile
read(10,*)apara
read(10,*)rho
write(6,*)apara,'=',rho
read(10,*)apara
read(10,*)Cp
write(6,*)apara,'=',Cp
read(10,*)apara
read(10,*)ak
write(6,*)apara,'=',ak
read(10,*)apara
read(10,*)age
write(6,*)apara,'=',age
read(10,*)apara
read(10,*)T0
write(6,*)apara,'=',T0
read(10,*)apara
read(10,*)TM
write(6,*)apara,'=',TM
read(10,*)apara
read(10,*)dzk
write(6,*)apara,'=',dzk
read(10,*)apara
read(10,*)zmax
![Page 13: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/13.jpg)
地球惑星内部物理学演習B 資料4
39
write(6,*)apara,'=',zmax
read(10,*)apara
read(10,*)ntra
write(6,*)apara,'=',ntra
!convertunitkm->m,Ma->sec
dz=dzk*1.0d3
t=age*1.0d6*365.2422d0*24.0d0*3600.0d0
!thermaldiffusivity
D=ak/(rho*Cp)
!*****nz:numberofzpoints****
nz=int(zmax/dzk+0.5d0)
!allocatedimensionvariables
allocate(Tmp(0:nz))
!******calculateerrorfunction******
!atthesurface
Tmp(0)=T0
eta1=0.0d0
erfy=0.0d0
!atz=dztozmax
doj=1,nz
![Page 14: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/14.jpg)
地球惑星内部物理学演習B 資料4
40
z=dz*dfloat(j)
!eta=z/2*(D*t)**(1/2)****
eta2=0.5d0*z/sqrt(D*t)
!errorfunction
callderrfunc(eta1,eta2,derf,ntra)
erfy=erfy+derf
!Temperature
Tmp(j)=T0+(TM-T0)*erfy
!write(6,*)z,Tmp(j),erfy
eta1=eta2
enddo
!*****Outputresultstoafile
!Openanewfiletosaveresult
open(20,file=outfile,status='new')
!writetofile
doj=0,nz
zk=dzk*dfloat(j)
write(20,*)zk,Tmp(j)
enddo
![Page 15: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/15.jpg)
地球惑星内部物理学演習B 資料4
41
!closefiles
close(10)
close(20)
stop
endprogramhcm1_main
サブルーチンプログラムファイル plate_derf.f90
!
!*******Errorfunctionsubroutine*******
!Numericalintegrationbytrapezoidmethod
!
subroutinederrfunc(eta1,eta2,derf,n)
implicitnone
real(8),allocatable::f(:)
real(8)::eta1,eta2
real(8)::x,x1,x2,dx
real(8)::s1,sall
real(8)::derf
real(8)::pi,rootpi
integer::i,n
!****integrationsection****
x1=eta1
x2=eta2
dx=(x2-x1)/dfloat(n)
![Page 16: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/16.jpg)
地球惑星内部物理学演習B 資料4
42
!****Valueoffunctiontobeintegrated****
allocate(f(0:n))
doi=0,n
x=x1+dx*dfloat(i)
f(i)=exp(-x**2)
enddo
!****integration****
s1=0.0d0
doi=1,n-1
s1=s1+2.0d0*f(i)
enddo
sall=dx*0.5d0*(f(0)+s1+f(n))
!****errorfunction****
pi=4.0d0*atan(1.0d0)
rootpi=sqrt(pi)
derf=2.0d0/rootpi*sall
return
endsubroutinederrfunc
パラメータファイル pl_para.dat
'outputfilename'
'plate_T_100Ma.data'
'densityofthemantle(kg/m**3)'
3300.0d0
![Page 17: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/17.jpg)
地球惑星内部物理学演習B 資料4
43
'specificheat(J/kg)'
1200.0d0
'thermalconductivity(W/m)'
4.0d0
'ageofplate(Ma)'
20.0d0
'surfacetemperature(deg.C)'
0.0d0
'mantletemperature(deg.C)'
1300.0d0
'depthinterval(km)'
2.0d0
'maximumdepth(km)'
300.0d0
'numberofsub-sectionforintegration'
5
1次元熱伝導方程式の数値解を求めるプログラムである。入力されたインターバルで深さを
変えながら温度を計算する。
プログラムは2つの部分に分けられており,誤差関数の増分を計算する部分をサブルーチン
にしている。それぞれを1つのファイルにしている。サブルーチンは,メインプログラムから,
必要なときに呼び出される(call 文)。サブルーチンを呼び出すときには,処理に必要な変数の値
をサブルーチンに引き渡す。処理が終わったら,今度は結果の変数の値をサブルーチンに引き
渡してもらう。変数の受け渡しは,引数によって行う(common 文を使う方法もある)。サブルー
チンは subroutine 文で始まる。メインプログラムの program 文と異なり,プログラムがサブル
ーチンであることと,引数を記述する。
主プログラム(メインルーチン)
open(10,file='pl_para.dat'):open 文。物理パラメータが書かれたファイルを開く。
t=age*1.0d6*365.2422d0*24.0d0*3600.0d0:代入文。Ma (百万年)を秒に直す
nz=int(zmax/dzk+0.5d0):代入文。温度を計算する最大の深さと深さの間隔から計算
点の数を計算している。最後に 0.5 を足しているのは,次のような理由である。数を2進数に直
![Page 18: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/18.jpg)
地球惑星内部物理学演習B 資料4
44
すときに必ずしも割り切れず,例えば 3.0(0.3×10-1として変数に入っている)が 2.99998 になっ
てしまうことがある。これを整数に変数の型を変換すると,3になってほしいところ,2にな
ってしまう。このため,1以下の数(ここでは 0.5)を足して 3.49998 にしておけば3が得られる
のである。
doj=0,nz〜enddo:do ループ。ループのインデックスとして,jを使用している。深さを
変化させながら温度を計算する。
z=dz*dfloat(j):代入文。インデックス j に対応した深さを計算している。dz は深さの
間隔である。
eta2=z/sqrt(D*t) :代入文。η2=z/√(κt) を計算している。
callderrfunc(eta1,eta2,derf,ntra) :call 文。誤差関数の増分 erf(η2)–erf(η1)を計算
するサブルーチンを呼び出す。( )の中はサブルーチンとの間でローカル変数の値を受け渡すため
の引数が入る。ここでは eta1,eta2,derf,ntraの4つである。eta1,eta2,ntraは前に定義
されいる。つまり,この値をサブルーチンに値を引き継ぐ。derfは前に定義されていない変数
で,サブルーチン derrfuncで計算した結果が返って来る。
erf=erf+derf:代入文。サブルーチンから返ってきた増分 derfを erfに加算する
Tmp(j)=T0+(TM-T0)*erf:代入文。erfの値を使って温度を計算する
副プログラム(サブルーチン)
subroutinederrfunc(eta1,eta2,derf,n) :subroutine 文。サブルーチンの始まりを
表す。( )の中は引数が入る。引数は call 文と数や型が合っていなければならない。ここでは,
コールしたメインルーチンから eta1,eta2,nをもらって,計算結果 derfをメインルーチンに
返している。
return:return 文。サブルーチンから呼び出したプログラムへ復帰する。引数の所に入ってい
る変数の値が呼び出したプログラムへ引き継がれる。
endsubroutinederrfunc:end subroutine 文。副プログラムの終わりを表す。
パラメータファイル
上から,マントルの密度(kg m-3),定圧比熱(J kg-1),熱伝導率(W m-1),プレートの年代(Ma),地
表温度(°C),マントルの温度(°C),計算する深さの間隔(km),計算する最大の深さ(km),誤差関
数の増分を計算する際の積分区間の分割数,である。
![Page 19: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/19.jpg)
地球惑星内部物理学演習B 資料4
45
問題 4-2 プログラム 注意すべきことは問題 4-1と同様である。
メインプログラムファイル pl_main_FDM.f90
!**********************************************************************
!**
!*1-DHalf-spacecoolingmodelforplatethermalevolution*
!*solvedbyfinitedifferencemethod*
!**
!**********************************************************************
programplate_hscm
implicitnone
real(8),parameter::SecY=365.2422d0*24.0d0*3600.0d0
real(8),allocatable::Tmp(:),Tnew(:)
real(8)::rho,Cp,ak,D
real(8)::age,T0,TM
real(8)::z,zk,zmax,zkmax,dz,dzk,dz2
real(8)::t,tmax,tevo,dt,dtmy,dtlim
integer::j,nz
integer::it,ntmax
integer::nf
integer::itskp1,itskp2
character(40)::apara
!*****readparameters*****
!Openfile
![Page 20: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/20.jpg)
地球惑星内部物理学演習B 資料4
46
open(10,file='pl_para_2.dat')
!readparameterfile
read(10,*)apara
read(10,*)rho
write(6,*)apara,'=',rho
read(10,*)apara
read(10,*)Cp
write(6,*)apara,'=',Cp
read(10,*)apara
read(10,*)ak
write(6,*)apara,'=',ak
read(10,*)apara
read(10,*)age
write(6,*)apara,'=',age
read(10,*)apara
read(10,*)T0
write(6,*)apara,'=',T0
read(10,*)apara
read(10,*)TM
write(6,*)apara,'=',TM
read(10,*)apara
read(10,*)nz
write(6,*)apara,'=',nz
read(10,*)apara
![Page 21: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/21.jpg)
地球惑星内部物理学演習B 資料4
47
read(10,*)zkmax
write(6,*)apara,'=',zkmax
read(10,*)apara
read(10,*)dtmy
write(6,*)apara,'=',dtmy
read(10,*)apara
read(10,*)itskp1
write(6,*)apara,'=',itskp1
read(10,*)apara
read(10,*)itskp2
write(6,*)apara,'=',itskp2
!convertunitkm->m,Ma->sec
zmax=zkmax*1.0d3
tmax=age*1.0d6*SecY
dt=dtmy*1.0d6*SecY
!dz:gridsize****
dz=zmax/dfloat(nz)
dz2=dz*dz
!maximumtimestepnumber
ntmax=int(tmax/dt+0.5d0)
!thermaldiffusivity
D=ak/(rho*Cp)
![Page 22: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/22.jpg)
地球惑星内部物理学演習B 資料4
48
!*****checkdtfornumericalstability****
dtlim=0.5d0*dz**2/D
if(dt.gt.dtlim)then
dt=dtlim*0.5d0
write(6,*)'******caution!!timestepischanged******'
endif
!allocatedimensionvariables
allocate(Tmp(0:nz),Tnew(nz))
!****Setinitialcondition****
it=0
t=0.0d0
Tmp(0)=T0
doj=1,nz
Tmp(j)=TM
enddo
!***writeinitialconditiontofile***
nf=0
callwritefile(Tmp,dz,nz,nf)
!***Openfileforhaetflux****
open(20,file='hf2.dat',status='new')
callheatflux(Tmp(0),Tmp(1),t,ak,dz)
![Page 23: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/23.jpg)
地球惑星内部物理学演習B 資料4
49
!==========Loopoftimemarching================================
doit=1,ntmax
!***Time****
t=dt*dfloat(it)
!***TimemarchingbyEulermethod***
doj=1,nz-1
Tnew(j)=Tmp(j)+dt*D/dz2&
*(Tmp(j-1)+Tmp(j+1)-2.0d0*Tmp(j))
enddo
!***Changeoldandnewtemperatures
doj=1,nz-1
Tmp(j)=Tnew(j)
enddo
!***Boundarycondition:dT/dz=0atbottom***
Tmp(nz)=Tmp(nz-1)
!***Writeresultstofileineachitskpstep***
if(mod(it,itskp1).eq.0.or.itskp1.eq.1)then
tevo=t/SecY/1.0d6
write(6,*)it,tevo
nf=nf+1
callwritefile(Tmp,dz,nz,nf)
![Page 24: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/24.jpg)
地球惑星内部物理学演習B 資料4
50
endif
!***calculateheatfluxandwritetofileineachitskp2step***
if(mod(it,itskp2).eq.0.or.itskp2.eq.1)&
callheatflux(Tmp(0),Tmp(1),t,ak,dz)
enddo
!=================Endoftheloop===============================
close(20)
stop
endprogramplate_hscm
サブルーチンプログラムファイル-1 pl_heatflux.f
!*********************************************************************
!*heatfluxsubroutinefor1-Dheatconduction*
!*********************************************************************
subroutineheatflux(Tmp0,Tmp1,t,ak,dz)
implicitnone
real(8),parameter::SecY=365.2422d0*24.0d0*3600.0d0
real(8)::Tmp0,Tmp1,Qsur
real(8)::t,ak,dz
real(4)::ts,Qsurs
integer::nz
!***evolutiontime***
ts=sngl(t/SecY/1.0d6)
![Page 25: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/25.jpg)
地球惑星内部物理学演習B 資料4
51
!***heatfluxatthesurface***
Qsur=ak*(Tmp1-Tmp0)/dz
Qsurs=sngl(Qsur)
write(20,*)ts,Qsurs
return
endsubroutineheatflux
サブルーチンプログラムファイル-2 pl_writefile.f
!*********************************************************************
!*filewritesubroutinefor1-Dheatconduction*
!*********************************************************************
subroutinewritefile(Tmp,dz,nz,nf)
implicitnone
real(8)::Tmp(0:nz)
real(8)::dz
real(4)::Tmps,zs
integer::j,nz
integer::nf
character(1)::cnf1
character(2)::cnf2
character(3)::cnf
character(4)::fname1
!***setnumbertofilename***
if(nf.lt.10)then
![Page 26: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/26.jpg)
地球惑星内部物理学演習B 資料4
52
write(cnf1,'(i1)')nf
cnf='00'//cnf1
elseif(nf.lt.100)then
write(cnf2,'(i2)')nf
cnf='0'//cnf2
else
write(cnf,'(i3)')nf
endif
fname1='t'//cnf
!***opennewfileandwrite***
open(10,file=fname1,status='new')
doj=0,nz
zs=sngl(dz*dfloat(j)/1.0d3)
Tmps=sngl(Tmp(j))
write(10,*)zs,Tmps
enddo
close(10)
return
endsubroutinewritefile
パラメータデータファイル pl_para_2.dat
'densityofthemantle(kg/m**3)'
3300.0d0
'specificheat(J/kg)'
1200.0d0
'thermalconductivity(W/m)'
![Page 27: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/27.jpg)
地球惑星内部物理学演習B 資料4
53
4.0d0
'ageofplate(Ma)'
100.0d0
'surfacetemperature(deg.C)'
0.0d0
'mantletemperature(deg.C)'
1300.0d0
'numberofgridpoints'
150
'maximumdepth(km)'
300.0d0
'timestepinterval(My)'
0.05d0
'intervalforwritingtemperature(itskp1)'
200
'intervalforwritingheatflux(itskp2)'
10
差分法で1次元熱伝導方程式の数値解を求めるプログラムである。入力されたインターバルで
深さを変えながら温度を計算する。
プログラムは3つの部分に分けられており,メインルーチンとサブルーチン2つである。1
つは,地殻熱流量の計算とその値のファイルへの書き込みをするサブルーチンである。もう1
つは,温度のファイルの書き込みを行っている。
メインルーチン pl_main_FDM.f
allocatableTmp(:),Tnew(:):allocatable 文。Tmpと Tnewを動的割り付け配列変数に指定する。
dtlim=0.5d0*dz**2/D:代入文。ここでは,数値安定性の限界となる時間間隔値を計算し
ている。これ以下の if 文で,ユーザーが与えた時間間隔値がこの限界を超えていないかチェッ
クしている。超えた場合は強制的に限界値の半分に変更される。
allocate(Tmp(0:nz),Tnew(nz)) :allocate 文。動的割り付け配列の大きさを決定する。Tmp
は0から nzまで,Tnewは 1から nzまでとする (Tnewは nz-1まででも良いが)。
Tmp(0)=T0:代入文。表面温度を境界条件として与えている。表面温度が配列変数の0番目
の値に代入される。
![Page 28: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/28.jpg)
地球惑星内部物理学演習B 資料4
54
doj=1,nz:do 文。jは空間座標を表す添え字で,1からなので,表面以外の場所である。
Tmp(j)=TM:代入文。表面以外にマントルの温度を初期温度として与える。
open(20,file='hf2.dat',status='new') :open 文。熱流量の値を出力するファイルをオ
ープン(ここでは新規作成)する。
callwritefile(Tmp,dz,nz,nf):call 文。初期温度を保存するため,ファイルに出力する
ためのサブルーチンを呼び出す。nfはファイルの番号である。
callheatflux(Tmp(0),Tmp(1),t,ak,dz):call 文。時間ゼロでの熱流量を計算しファイル
に出力する。
doit=1,ntmax:do 文。時間を進行させるための繰り返し。itはタイムステップ値。
t=dt*dfloat(it):代入文。時間を計算している。dtは時間間隔値,itは時間ステッ
プ数。
doj=1,nz-1:do 文。表面と底を除く点で次の時間ステップでの温度が計算される。
Tnew(j)=Tmp(j)+dt*D/dz2*(Tmp(j-1)+…:代入文。オイラー法による差分方程式で
ある。新しい時間の温度値が計算され,左辺の Tnewに代入される。
Tmp(j)=Tnew(j) :代入文。温度の値を新しい時間ステップの値に更新する。
Tmp(nz)=Tmp(nz-1):代入文。底の境界条件で,温度勾配ゼロ(熱流量ゼロ)を与える。
if(mod(it,itskp1).eq.0.or.itskp1.eq.1)then:if 文。タイムステップ値 itが itskp1
毎(itskp1が1以外の時は割って余り 0)に温度をファイルに出力する。
nf=nf+1:代入文。ファイルの番号を1つ増やす。
callwritefile(Tmp,dz,nz,nf):call 文。温度をファイルに出力するためのサブルーチン
を呼び出す。
if(mod(it,itskp2).eq.0.or.itskp2.eq.1)…:if 文。itが itskp2毎に熱流量を計算する
サブルーチンを呼び出す。
サブルーチン pl_heatflux.f
subroutineheatflux(Tmp0,Tmp1,t,ak,dz):subroutine 文。熱流量の計算をしてフ
ァイルに出力する。ファイル名はメインルーチン内で指定している。装置番号がメインルーチ
ンで指定されたものが,そのまま使われることに注意。メインルーチンの Tmp(0)と Tmp(1)はサ
ブルーチンの(ローカル)変数 Tmp1と Tmp2に渡される。
Qsur=ak*(Tmp1-Tmp0)/dz:代入文。熱流量を計算する。熱伝導率と温度勾配を掛け
ている。温度勾配は前進差分で計算している。
![Page 29: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/29.jpg)
地球惑星内部物理学演習B 資料4
55
サブルーチン pl_heatflux.f
subroutinewritefile(Tmp,dz,nz,nf):subroutine 文。温度の値を保存するため,温度値
をファイルへ出力するサブルーチンである。
dimensionTmp(0:nz):dimension 文。ここで,nzはメインルーチンから渡された変数であるこ
とに注意。サブルーチンでは,dimension 文の指定に変数を使って,その大きさをメインルー
チンと合わせることが出来る。このような配列を整合配列(ajastable dimension)と呼ぶ。メイ
ンルーチンでは数かそれと同等なものであるパラメータしか使えないので注意。後から指定す
るには,動的割り付け配列を使う。
if(nf.lt.10)thenから endifまで: if 文。この if 文では,ファイル名に番号をつけるため,
順番を表す番号 nfを文字変数 cnfに変換している。変換する関数もあるが,変換は1文字ずつ
しか出来ない。そこで,装置番号に変数を置くという変なやり方で変換している。
cnf='00'//cnf1: 代入文。右辺は文字の連結式である。nfが1桁の場合,cnfは1文字に変換
されるので,前に 00をくっけて,003のような文字列を作っている。これが文字変数 cnfに代
入される。
fname1='t'//cnf: 代入文。右辺は文字の連結式である。fname1は出力ファイル名である。nf
が3のとき,t003というファイル名になる。
doj=0,nz:do 文。温度の値を添え字0から nzまで出力するのを繰り返すためである。
zs=sngl(dz*dfloat(j)/1.0d3) : 代入文。深さを kmで計算し,単精度変数に代入する。
write(10,*)zs,Tmps:do 文。深さと温度を装置番号 10のファイルに出力する。Tmpsは温度
を単精度に変換した変数である。
パラメータファイル pl_para_2.dat
上から,マントルの密度(kg m-3),定圧比熱(J kg-1),熱伝導率(W m-1),プレートの年代(Ma),地
表温度(°C),マントルの温度(°C),計算する深さの間隔(km),計算する最大の深さ(km)である。
![Page 30: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/30.jpg)
地球惑星内部物理学演習B 資料4
56
まとめ 副プログラム(サブルーチン)の呼び出し callsubroutine_name(var1,var2,var3,… )
ここで,var1,var2,var3,…は引数である。呼び出す側は,数値またはパラメータであっても,
変数や配列変数であっても良い。変数の名前が違っていたり,配列変数の大きさが違っている
と,メモリ上のアドレスにずれが生じて実行時エラー(すべて segmentation fault error になる)
や誤った処理の原因になる。バグを見つけるのが大変で,頭の痛いところである。対処するに
は,1つ1つの変数に正しい値が入っているのかチェックしていくのが地道だか近道である。
関数との違いはサブルーチン名そのものが値を持たないことである。このため,call 文を使って
サブルーチンを呼び出す
副プログラム(サブルーチン)の始め subroutinesubroutine_name(var1,var2,var3,…)
引数は呼び出される側は基本的に変数である。
副プログラム(サブルーチン)から呼び出したプログラムに復帰 return
だいたいサブルーチン最後にある(if 文の中に書かれる場合などを除き)。returnで,呼
び出したプログラムに戻って処理が継続する。return がないと処理が呼び出したプロ
グラムに復帰しない。復帰するとき,すべての引数が呼び出したプログラム戻される。サブルーチン内で値を変えていると,呼び出したプログラムでも値が変わってしまうの
で注意が必要である。 副プログラム(サブルーチン)の最後 endsubroutinesubroutine_name
subroutine 文から end 文までが1つのサブルーチンのプログラム単位である。1つのファイルの中にメインプログラムや複数のサブルーチンがあっても構わない。
![Page 31: Chap. 4 数値計算による偏微分方程式の解home.hiroshima-u.ac.jp/nakakuki/Lectures/enshu/resume-B...地球惑星内部物理学演習B 資料4 32 2.2 境界条件 式(33)によると,最初の値を与えれば,その後の変化がすべて計算できそうである。計算するには,これに加えてxの2つの端の値が必要なことが分かる。これは境界条件](https://reader034.vdocuments.pub/reader034/viewer/2022042313/5edeb8adad6a402d666a1044/html5/thumbnails/31.jpg)
地球惑星内部物理学演習B 資料4
57
図の描き方 (1) gnuplot を使用する。
gnuplot
gnuplot>plot"t000"withline
gnuplot>replot"t002"withline
gnuplot>quit
グラフは画面キャプチャなどを用いて画像として保存する。
(2) Generic Mapping Tools (GMT)を使用する
psxy-R0/200/0/1500–JX10/8–X2.0–Y2.0-W1.0-Ba50f10/a200f20t001>temp.ps
Postscript file の表示
evincetemp.ps