本日学習したこと。流体力学関連です。(間違っている部分もあるかもです。m(_ _)m

■自由渦の渦度はゼロ。
川を流れる葉っぱがくるくる回転しないで、同じ姿勢のまま流れている様子が、そういう事らしい。

■ポテンシャル流れ。
粘性と密度変化を考えない。
渦度はゼロとして考える。
※ポテンシャル流れという名前がしっくりこなかったので、ChatGPTに聞いてみました。→"ポテンシャル関数に基づく流れモデル"という表現が一番しっくりきました。

■剥離。
流体が物体の表面に沿って流れることが出来なくなる事。

■非ニュートン流体は、せん断速度に応じて粘度が変化する流体です。
例1:ケチャップ。静止している時は粘度が高い。オムライスに載っている時は、流れ落ちにくい。ケチャップの容器を押して、力が加わった時は流れ易くなる。
例2:射出成型のドロドロに溶けたプラスチック。圧力をかけて流速を上げると、粘性が小さくなるのだそうです。

■ベクトル演算子
(超ざっくりですが)以下の様な使われ方をしています。
1) 勾配。関数の変化率を示します。勾配はベクトルの形をとり、関数の最大増加率が向く方向を示します。
2) 発散。ベクトル場に対して定義される演算子で、ベクトル場の収束または発散の度合いを示します。ベクトル場が一点に集中するか、それとは逆に拡散するかを表します。
スカラー場の例: 温度分布を表す関数はスカラー場です。各点に温度というスカラー値を関連付けることで、空間内での温度の変化を表現できます。
ベクトル場の例: 風の流れを表す関数はベクトル場です。各点に風速ベクトルを関連付けることで、空間内で風の強さと方向の変化を表現できます。
3)回転。 ベクトル場に対して定義される演算子で、ベクトル場の渦度の度合いを示します。回転はベクトルの形をとり、ベクトル場が回転する方向や速度を表します。

🔶複素ポテンシャル。Complex Potential。
複素数や複素関数を用いて表現されるポテンシャル関数。

・複素数の説明は下記のサイトが分かりやすかったです。


・ポテンシャル関数
ポテンシャル関数は場の特性を表すための重要な概念であり、圧力や他の物理的な量の分布を理解するために使用されます。ポテンシャル流れを解析する為に使用されます。 

・複素関数は、複素数を含んだ関数と考えていいようです。

■テキストに出ていた式です。
W=(Q/(2π))*log(z)

上記の式を、極形式で表すと、
W=(Q/(2π))*(log(r)+iθ)
という形になります。
19〜20世紀頃に発展した考え方だそうです。ストークスなど沢山の人が研究していた様です。

W: 複素ポテンシャル (Complex Potential)
Q: 特定の物理量(流体力学の文脈ではしばしば流量や流体の特性を表す)
π: 円周率 (Pi)
log(r): r の自然対数 (Natural logarithm of r)
r:原点からある座標までの距離
i: 虚数単位
θ: 角度(位相角)

🔸極形式(Polar Form)は、複素数を極座標形式で表現する方法です。複素数は実数部と虚数部から成りますが、極形式では複素数を極座標上の長さ(半径)と角度(位相角)で表現します。
極形式→z=r*e^(iθ)
極形式でない場合は、直交座標形式(私が最初に習った方)→z=a+bi

🔶速度ポテンシャル(Velocity Potential)は、流体力学の概念の一つで、特定の流体の速度分布を表す関数です。

W=(Q/(2π))*(log(r)+iθ)
上記の式を、実数部分と虚数部分に分けます。
・実数部分→(Q/(2π))*log(r)→これをΦ(ファイ)とします。Φは速度ポテンシャルとされています。
・虚数部分→(Q/(2π))*θ→これをΨ(プサイ)とします。Ψは流れ関数とされています。

速度ポテンシャルは、流体の速度分布や流れの安定性などを評価する為の物らしいです。
速度ポテンシャルの次元は [長さ^2/時間] らしいです。

流れ関数は、”渦が発生しているかどうか”や、流線などを評価する為の物らしいです。
無次元。

共役複素速度(きょうやくふくそそくど)
共役複素速度は、複素ポテンシャルを複素座標 z で微分することで得られます。
共役複素速度は、流れ関数と関連づけて流体の循環や抵抗に関する情報を得るために使用されることがあります。特に、共役複素速度の実部と虚部は、流体の循環と抵抗に関して役に立つことがあります。

・絶対速度
流体中の各点の速度を表すために使用されます。特に、流れの中での速度分布や速度ベクトルの特性を理解するために絶対速度を求めることがあります。これにより、流体中のどの領域で速度が高く、どの領域で低いかを把握し、流れの特性を詳しく分析することができます。

・Φは、速度ポテンシャル。
元々の式は、Φ=(Q/(2π))*log(r)。
酒井先生のプログラムでは、rをr2としており、変数r2はベクトルの2乗。
このままだと、log(r^2)という状態になってしまっている。←log(r)でなく、2*log(r)になっている。
これを調整する為に、分母を2πでなく、4πにしている。(2で割っている)

酒井先生のプログラムは、元々の式を、プログラムのし易さの為か、少し改造している事があるので、注意。

🔹
ここまで学習したところで、”WebGLによる「流れ」と「波」のシミュレーション”という本を、しっかり読んでいきます。
2020年頃に買った本です。ようやく。。。

ここからは、本の中の”PotentialFlow0.html”というプログラムを解読します。

下の図は、この本の、”PotentialFlow0.html”というプログラムを、私が、自分で分かりやすいように改造した物です。



赤色の線=速度ポテンシャルが同じ値の点を結んだ線。
左端の線の速度ポテンシャルは-1、中央の線は0、右端の線は1。



※-1の線の上にある点の速度ポテンシャルは全て-1、
0の線の上にある点の速度ポテンシャルは全て0という事です。



流体は、速度ポテンシャルの勾配が最大になる方へ進むらしいです。
この場合の流線を表示すると下図の青色の線の様になります。



流れの方向は下図の矢印の方向です。




私は、”速度ポテンシャル高い方から低い方へ流れるんじゃないんかい”と勝手に思っていましたが、違うようです。
(流体力学の講義でも、教授はちゃんと説明してくれていたはずですが、すみません。m(_ _)m)


🔸

↑酒井先生のサンプル”PotentialFlow0.html”では、どこがどれくらい値か分からないので、少し機能を追加しました。
※追加機能:マウスカーソルを図の上におくと、その座標のΦとΨの値が表示される。

●以下は、”追加機能”の説明です。
・html側
html側には、下記を追加します。
<span id="phiValueDisplay"></span><br>
<span id="psiValueDisplay"></span>

・JavaScript側
JavaScript側には、下記を追加します。

canvasの設定をした後くらいの行に下記を追加。
canvas.addEventListener('mousemove', onMouseMove);

addEventListenerの引数
element.addEventListener(event, function, useCapture);
今回の場合は、
event → 'mousemove' マウスが移動した時に、onMouseMoveを実行させる。onMouseMoveは自作function。
function → onMouseMove
useCaptureは通常はfalseで、省略してもOK。(第2引数まででもOK)

●function onMouseMove

function onMouseMove(event) {
// マウスの座標を取得
const x = event.clientX - canvas.getBoundingClientRect().left; //canvas.getBoundingClientRect().leftは、Canvas要素の左端のX座標を取得しています。event.clientXは、ブラウザに対するマウスポインタのX座標を取得しています。これらの差は、canvas上のX座標に相当します。(下の方に、これらの位置関係の図を貼り付けました)

const y = event.clientY - canvas.getBoundingClientRect().top;

// Canvas座標からPhiデータの座標に変換
const phiX = (x / canvas.width) * rect.size + rect.left0.x; //上記を基に、phiを計算する為の、Xを計算。
const phiY = (1 - y / canvas.height) * rect.size + rect.left0.y;

// Phiデータの座標を元にPhiの値を取得
const phiValue = Phi[Math.floor((phiX - rect.left0.x) / rect.delta)][Math.floor((phiY - rect.left0.y) / rect.delta)]; //既に計算されているPhi[][]から、上記で計算したX、Yに相当するデータを取り出す。

// Canvas座標からPsiデータの座標に変換
const psiX = (x / canvas.width) * rect.size + rect.left0.x;
const psiY = (1 - y / canvas.height) * rect.size + rect.left0.y;

// Psiデータの座標を元にPsiの値を取得
const psiValue = Psi[Math.floor((psiX - rect.left0.x) / rect.delta)][Math.floor((psiY - rect.left0.y) / rect.delta)];

// HTML内の要素にPhiとPsiの値を表示
const phiValueDisplay = document.getElementById('phiValueDisplay');
phiValueDisplay.textContent = 'Φ(速度ポテンシャル)の値: ' + phiValue.toFixed(2); // 例:値を小数点以下2桁で表示

const psiValueDisplay = document.getElementById('psiValueDisplay');
psiValueDisplay.textContent = 'Ψ(流れ関数)の値: ' + psiValue.toFixed(2); // 例:値を小数点以下2桁で表示
}



ChatGPTに作ってもらいました。

🔶
この記事はここでおしまいです。m(_ _)m

頂戴したサポートは、レンタルサーバーの費用に充てさせて頂きます🙇 心より感謝いたします❤️