この記事は著者が韓国語で書いた原文の翻訳です。 原文(한국어)を読む
重心が上にあるのに転覆しない — メタセンタ高さ GM と自由表面影響
GM は水線面の慣性モーメントが稼ぐ余裕です。タンク内の自由表面ひとつが、その余裕を丸ごと奪うことがあります。
コンテナ船の重心は、水没部分の中心より数メートル上にあります。重い側が上に載っているのに、船は自分で起き上がります。逆に重心が浮心より下にあるのに転覆する台船(barge)もあります。上下関係だけでは何も決まりません。判定を下す量はメタセンタ高さ で、タンクの液体がその値を丸ごと消すところまで残しておきます。
重心が浮心より上にある
まず記号を揃えます。 は竜骨(keel、船底中心)、 は重心、 は浮心です。浮心は水没体積の図心(centroid)です。アルキメデスが述べたのは大きさだけです。浮力の大きさは押しのけた水の重さに等しく、作用線は水没体積の図心を通ります。
まっすぐ浮いているとき、 と は同じ鉛直線上にあります。重力と浮力は大きさが等しく向きが逆なので、モーメントはゼロです。この状態では が上でも下でも何も起こりません。安定性は静止状態ではなく、わずかに傾けたときに何が生じるかで定義されます。
傾けると事情が変わります。 は水没形状の図心なので、形状が変われば一緒に移動します。 は船と一緒に回転するだけで、船の中では動きません。二つの鉛直線がずれることでモーメントの腕ができます。これを復原挺(righting arm) と呼び、排水量 に対して復原モーメントは です。
傾ければ水没形状が変わる
下のシミュレーションで実際に傾けてみましょう。幅・喫水・重心高さを変え、release at 15 deg を押して戻ってくるかを見ます。
(緑)が傾けた側へ引かれ、(黄)を通る鉛直線との間隔が です。紫の は浮力の作用線が船体中心線と交わる点です。KG スライダを 7.33 m より上に上げると が の下に下がり、船は戻る代わりに片側に倒れたまま止まります。
— 水線面の慣性モーメントがすべて#
小さな傾斜角 では、水没形状の変化はくさび二つに整理されます。片舷で水面上に出たくさびと、反対舷で新たに沈んだくさびです。排水量は変わらないので二つの体積は等しく、左右に離れています。この体積移動が を動かします。
水線面(waterplane、水面が船体を切った断面)の微小帯 が中心線から だけ離れていれば、その帯が生む体積変化は 、モーメントは です。全部足すと断面二次モーメントが出ます。
は中心線まわりの水線面の断面二次モーメント、 は排水体積です。幅 の長方形断面なら単位長さあたり 、 なので
となります。ここで幅が三乗で入り、分母の で一度打ち消されて二乗が残る点が重要です。幅を 20% 広げれば は 44% 大きくなります。カヌーが不安定で筏が安定なのはこのためです。そして判定式は一行で終わります。
は浮心高さ、 は重心高さです。 なら復原、 なら転覆です。幅 m、喫水 m の台船なら m、 m なので m です。 が 6.6 m なら余裕は 0.733 m しかありません。単位長さで を で割ると、その 5.333 m がもう一度出ます。幅を 20% 広げると は 1.44 倍になり、本文の 44% はこの2乗です。 m が にそのまま足されます。 m を固定すれば、余裕 0.733 m はその加算ぶんだけ開きます。薄い船側をシェルで解くと、この余裕が先に固まることがあります。せん断ロッキングがたわみを殺すなら、 を読む前に剛性行列を疑います。
が裏切る角度#
は での傾きです。小角度では がよく合います。問題はこの近似がいつ崩れるかです。
崩れる地点は幾何が決めます。水線面が変わらない間だけ が一定だからです。上の台船は乾舷(freeboard、水面上の船体高さ)が 4 m なので、、つまり 26.6° で甲板端が水に浸かります。その瞬間から水線面はもう広がれず、むしろ縮みます。 が崩れ、 曲線は折れます。
上のシミュレーションで hold heel を押し、角度を 30° 超まで動かすと、緑の実線(厳密値)が紫の点線()から離れていくのが見えます。二つの曲線の符号が分かれる角度が消失角です。
タンクの液体が GM を丸ごと奪う#
次に船内に液体タンクを入れます。バラストタンク、燃料タンク、貨物タンク、消火水で浸かった車両甲板まで、すべて同じ問題です。
液体の重さは傾けても変わりません。移動するだけです。ところがその移動が を低い側の舷へ引っ張ります。計算の構造は とまったく同じです。タンク内の自由表面もひとつの水線面であり、傾けばくさび二つが入れ替わります。
はタンク自由表面の断面二次モーメント、 はタンク液体の密度、 は外の水の密度です。この値は船体から実際に引くのではなく、 がその分だけ上がったものとして扱います(仮想上昇、virtual rise)。**タンクにどれだけ液体が入っているかは式に現れません。**あふれるほど満たして自由表面がなくなるか、完全に空になるかしない限り、20 cm でも 2 m でも損失は同じです。
損失が で減る理由は、次の式の数え方にあります。
隔壁一枚が損失を 1/4 にする#
幅 のタンクを 個に分ければ、各区画の幅は で、区画が 個です。
損失は ではなく で減ります。幅の三乗が個数の一乗に勝つからです。上の台船に幅 12 m のタンクが一つあれば m⁴、 m³/m なので m です。 の 0.733 m はとうに消えています。中央に隔壁を一枚立てるだけで 0.549 m に落ち、船は再び起き上がります。
タンカーの中央に縦隔壁が立っているのはこのためです。積載量も重心高さも変わりません。自由表面の幅だけが半分になります。
Python で描いた GZ 曲線と消失角#
は接線の傾き一つにすぎません。大角度の は、水没多角形を直接切って図心を求めるほうが速いです。船体断面を多角形として置き、水没面積が排水面積と等しくなる水線高さを二分法で探し、その多角形の図心を計算します。
import math
def poly_area_centroid(poly):
a = cx = cy = 0.0
n = len(poly)
for i in range(n):
x0, y0 = poly[i]
x1, y1 = poly[(i + 1) % n]
cr = x0 * y1 - x1 * y0
a += cr
cx += (x0 + x1) * cr
cy += (y0 + y1) * cr
a *= 0.5
if abs(a) < 1e-14:
return 0.0, 0.0, 0.0
return a, cx / (6 * a), cy / (6 * a)
def clip_below(poly, phi, h):
"""傾斜角 phi のとき、地球基準の高さが h 以下の部分だけを残す"""
def f(p):
return p[1] * math.cos(phi) - p[0] * math.sin(phi) - h
out = []
n = len(poly)
for i in range(n):
p, q = poly[i], poly[(i + 1) % n]
fp, fq = f(p), f(q)
if fp <= 0.0:
out.append(p)
if (fp < 0.0) != (fq < 0.0):
t = fp / (fp - fq)
out.append((p[0] + t * (q[0] - p[0]), p[1] + t * (q[1] - p[1])))
return out
def waterline_offset(poly, phi, area0):
"""水没面積が area0 になる水線高さを二分法で探す"""
lo, hi = -60.0, 60.0
for _ in range(80):
mid = 0.5 * (lo + hi)
a, _, _ = poly_area_centroid(clip_below(poly, phi, mid))
if a < area0:
lo = mid
else:
hi = mid
return 0.5 * (lo + hi)
def righting_arm(beam, depth, draft, kg, phi):
hull = [(-beam / 2, 0.0), (beam / 2, 0.0), (beam / 2, depth), (-beam / 2, depth)]
h = waterline_offset(hull, phi, beam * draft)
_, xb, yb = poly_area_centroid(clip_below(hull, phi, h))
return xb * math.cos(phi) + (yb - kg) * math.sin(phi), xb, yb
def gz_curve(beam, depth, draft, kg, deg_max=70, step=1):
return [(d, righting_arm(beam, depth, draft, kg, math.radians(d))[0])
for d in range(0, deg_max + 1, step)]
BEAM, DEPTH, DRAFT = 16.0, 8.0, 4.0
KG = 6.6
KB = DRAFT / 2
BM = BEAM ** 2 / (12 * DRAFT)
GM = KB + BM - KG
print(f"KB={KB:.3f} m BM=B^2/12T={BM:.3f} m KM={KB+BM:.3f} m KG={KG:.3f} m GM={GM:.3f} m")
print(f"deck edge immerses at phi = {math.degrees(math.atan(2*(DEPTH-DRAFT)/BEAM)):.1f} deg")
print()
print(" phi[deg] GZ[m] GM*sin(phi)[m] error[%]")
for d, gz in gz_curve(BEAM, DEPTH, DRAFT, KG, 60, 5):
lin = GM * math.sin(math.radians(d))
err = f"{100 * (lin - gz) / gz:8.1f}" if abs(gz) > 0.01 else " -"
print(f" {d:5.1f} {gz:7.4f} {lin:11.4f} {err}")
curve = gz_curve(BEAM, DEPTH, DRAFT, KG, 70, 1)
dmax, gzmax = max(curve, key=lambda t: t[1])
vanish = next((d for d, g in curve if d > 5 and g <= 0.0), None)
print()
print(f"max GZ = {gzmax:.3f} m at {dmax} deg, vanishing stability at {vanish} deg")KB=2.000 m BM=B^2/12T=5.333 m KM=7.333 m KG=6.600 m GM=0.733 m
deck edge immerses at phi = 26.6 deg
phi[deg] GZ[m] GM*sin(phi)[m] error[%]
0.0 0.0000 0.0000 -
5.0 0.0657 0.0639 -2.7
10.0 0.1417 0.1273 -10.2
15.0 0.2394 0.1898 -20.7
20.0 0.3716 0.2508 -32.5
25.0 0.5550 0.3099 -44.2
30.0 0.7207 0.3667 -49.1
35.0 0.6823 0.4206 -38.4
40.0 0.5196 0.4714 -9.3
45.0 0.2828 0.5185 83.3
50.0 0.0001 0.5618 -
55.0 -0.3116 0.6007 -292.8
60.0 -0.6406 0.6351 -199.1
max GZ = 0.727 m at 31 deg, vanishing stability at 51 deg5° では が 0.0657、 が 0.0639、誤差は −2.7% です。25° では 0.5550 対 0.3099 で、誤差は −44.2% まで開きます。甲板が浸かる 26.6° を過ぎた 30° では、実際の が 0.7207、線形式は 0.3667 です。半分ほどしかありません。甲板が浸かるまで水線面が広がり続け、実際の復原力が線形予測より大きくなるからです。最大復原挺 0.727 m は 31° にあります。45° で誤差の符号が +83.3% にひっくり返り、50° の実際の は 0.0001 なのに線形式は 0.5618 を残します。消失角 51° のあとの 55° と 60° では、実際の値が −0.3116、−0.6406 です。線形式はそのときも +0.6007、+0.6351 です。消失角を越えても正の復原挺を約束する側が、危険側です。
自由表面損失は多角形を切らなくても確認できます。甲板が浸かるまでは舷側が垂直なので、復原挺に閉じた式があるからです。損失は仮想上昇なので、 から を引いて入れるだけです。
import math
BEAM, DRAFT, KG = 16.0, 4.0, 6.6
NABLA = BEAM * DRAFT
BM = BEAM ** 2 / (12 * DRAFT)
GM = DRAFT / 2 + BM - KG
def free_surface_loss(rho_f, rho, b, n, nabla):
"""隔壁 n 枚で分けた幅 b のタンクの自由表面損失 [m]"""
i_free = n * (b / n) ** 3 / 12
return rho_f * i_free / (rho * nabla)
def wall_sided_gz(gm, bm, phi):
"""甲板が浸かる前、舷側が垂直な範囲の復原挺"""
return (gm + 0.5 * bm * math.tan(phi) ** 2) * math.sin(phi)
print(" tanks i[m^4] dGM[m] GM_eff[m] GZ(20deg)[m]")
for n in (1, 2, 3, 4):
d_gm = free_surface_loss(1000.0, 1025.0, 12.0, n, NABLA)
gz20 = wall_sided_gz(GM - d_gm, BM, math.radians(20))
print(f" {n:4d} {n*(12.0/n)**3/12:7.1f} {d_gm:7.3f} {GM-d_gm:8.3f} {gz20:11.3f}") tanks i[m^4] dGM[m] GM_eff[m] GZ(20deg)[m]
1 144.0 2.195 -1.462 -0.379
2 36.0 0.549 0.185 0.184
3 16.0 0.244 0.489 0.288
4 9.0 0.137 0.596 0.325隔壁の枚数 n を 1 から 2 に上げると、赤い損失バーが 1/4 に減り、倒れていた台船が起き上がります。
黄色がタンクの液体です。液面は船体がどう傾いても水平を保ちます。n = 1 で放すと船は戻らず、片側に倒れたまま釣り合います(定傾斜、angle of loll)。隔壁を一枚立てた瞬間に赤い損失バーが 1/4 に減り、船は起き上がります。
隔壁一枚で が 144 から 36 へ、ちょうど 1/4 になります。、、、 なら m です。 なら 、 m、20° の復原挺は 0.325 m です。損失がないときの 0.3716 m には、まだ届きません。20° での復原挺は −0.379 m から +0.184 m へ符号が変わります。ここで使った閉じた式 は、甲板が浸かる前の範囲では多角形計算と一致します。損失がないときの 20° の値 0.3716 m が上の表と同じです。
6-DOF VOF 解析に船を浮かべる前に#
初期喫水を入れる前に m を手で残しておきます。自由横揺れの周期 がこの値とずれれば、格子か慣性の入力を先に疑います。 は横揺れの回転半径です。 は水線面の 重みなので、舷側のセルがほとんどを作ります。自由表面が二、三セルに滲むと有効幅が縮み、復原モーメントは小さく出ます。
タンクを満たした計算では、隔壁なしの m が準静的な基準線です。そのときの有効 は m です。液体が船体と位相がずれると、この損失よりさらに傾くことがあります。自由水面を陰的に解く Casulli–Zanolli の入れ子 Newton 法が要るのは、この地点です。手計算は答えではありません。その横揺れを疑うときに握っておく数字です。
関連記事
役に立ったらシェアしてください。