以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
まず、第1の実施の形態について説明する。第1の実施の形態は、構造体が変形しても流脈線の追跡が可能な流脈線表示装置である。
構造体が変形する場合は、流脈線を正確に追跡することが困難である。その原因の1つに、構造体が変形することによって、計算上、移動境界問題によるグリッド点の運動に伴う見かけの力が生じることにある。
見かけの力とは、卑近な例を出せば、コリオリの力がある。地球上で静止している観測者から砲弾を打つと、遠心力だけでは説明できない力が弾道の軌道を曲げているように見える。これは、宇宙から見れば、観測者自身も地球と共に運動しているため、観測者自身の加速度が生じており、それが見かけの力を生むからである。このように、本質的な力ではないが、観測者の運動(座標系と取り方)に起因して働くかのように見える力を“見かけの力”と呼ぶ。
すなわち、構造体が変形する場合、流体の運動の計算に、構造体の変形の影響を反映させることになる。このとき、構造体の形状を定義するためのグリッド点の移動に併せて、流体の運動を計算することになる。グリッド点が加速度運動をしていれば、その点に基づく流体の運動の計算には、見かけの力が生じる。このような見かけの力を反映させて流体の運動を計算しないと、流脈線を正しく算出することができない。例えば、流体の速度を表す速度場の計算精度が低いと、流脈線が心筋の中にめり込むようなあり得ない挙動を示し、計算が破たんしてしまう。
そこで、第1の実施の形態では、グリッド点の加速度運動によって生じる見かけの力を補正することで、流体の速度場を高精度に計算できるようにする。その結果、心筋付近での流脈線の挙動を正確に導き出すことができる。その結果、流脈線が心筋の中にめり込む現象を抑制することができる。これにより計算の安定性が上がり、流脈線が心筋中にめり込み、計算不能になるエラーを回避することができる。
図1は、第1の実施の形態に係る流脈線可視化装置の一例を示す図である。流脈線可視化装置10は、記憶部11、処理部12、および表示部13を有する。記憶部11は、例えば流脈線可視化装置10が有するメモリまたはストレージ装置である。処理部12は、例えば流脈線可視化装置10が有するプロセッサまたは演算回路である。表示部13は、例えば流脈線可視化装置10が有するグラフィック回路である。
記憶部11は、例えば構造体情報11aと流体情報11bとを有する。構造体情報11aは、流体シミュレーション上の解析空間内の構造体の形状の時間変化を示す情報である。流体情報11bは、グリッド点V1〜V4の位置情報とグリッド点V1〜V4上での流体の速度情報とを含む。例えば位置情報は、複数のグリッド点V1〜V4の第1時間間隔の複数の第1時刻(T0,T1,・・・)それぞれでの位置を示している。また速度情報は、複数のグリッド点V1〜V4上の流体の複数の第1時刻(T0,T1,・・・)それぞれでの速度を示している。複数のグリッド点は、流体シミュレーション上の解析時間の進行に伴い解析空間内を加速度運動する。なお図1には、4つのグリッド点V1〜V4を示しているが、解析空間内には図示していない他の多数のグリッド点があるものとする。また図1において、各グリッド点での流体の速度を、矢印で示している。
処理部12は、流体情報11bに基づいて、流脈線5a,5bを計算する。例えば処理部12は、位置情報に表される複数のグリッド点の加速度運動に起因する誤差を補正する補正値を含む計算式により、複数のグリッド点V1〜V4上の流体の複数の第1時刻それぞれでの速度の時間微分値を算出する。具体的には、例えば処理部12は、位置情報に基づいて、複数のグリッド点V1〜V4それぞれの複数の第1時刻(T0,T1,・・・)それぞれでの速度と加速度とを算出する。そして処理部12は、算出した速度と加速度とを変数として含む計算式により、複数のグリッド点V1〜V4上での流体の複数の第1時刻(T0,T1,・・・)それぞれでの速度の時間微分値を算出する。なお、速度と加速度の算出式の一例を、後述の式(6)、式(7)に示す。そして、速度と加速度とを変数として含む、速度の時間微分値の計算式の一例を、後述の式(4)、(5)に示す。
次に処理部12は、解析時間の進行に伴い粒子発生源から順番に出力される複数の粒子を定義する。そして処理部12は、複数のグリッド点V1〜V4上の流体の複数の第1時刻(T0,T1,・・・)それぞれでの速度と速度の時間微分値とに基づいて、複数の粒子の複数の第2時刻(t0,t1,・・・)それぞれでの位置を算出する。なお複数の第2時刻(t0,t1,・・・)は、第1時間間隔より短い第2時間間隔の時刻である。例えば処理部12は、複数のグリッド点V1〜V4それぞれについて、グリッド点の複数の第1時刻(T1,T2,・・・)それぞれにおける速度を示す点を滑らかに接続する、流体の速度の時間変化を表す補間曲線を生成する。補間曲線は、1つの第1時刻に対応する点を通るとき、対応する第1時刻での流体の速度の時間微分値に応じた傾きとなる。そして処理部12は、複数のグリッド点V1〜V4それぞれの補間曲線に基づいて、複数の粒子の複数の第2時刻それぞれでの位置を算出する。この補間曲線の一例を、後述の式(20)に示す。
また処理部12は、構造体情報11aに基づいて、構造体2の形状の時間変化を再現する。そして処理部12は、粒子発生源4から出力された複数の粒子の連なりを示す流脈線5a,5bの表示情報を生成する。
表示部13は、処理部12が生成した表示情報に基づいて、流脈線5a,5bを表示画面1に表示する。例えば表示部13は、表示画面1に、構造体2の画像に重ねて、流体が存在する流体領域3a,3b内に流脈線5a,5bを表示する。図1において、流脈線5aは第2時刻「t0」における流脈線であり、流脈線5bは第2時刻「t1」における流脈線である。
このようにして、グリッド点の加速度運動に起因する見かけの力を反映させて、複数の粒子の位置を高精度に算出し、正確な流脈線の表示情報を生成することにより、正確な流脈線を表示することができる。
さらに処理部12は、流脈線5a,5bが構造体に侵入するか否かを判定し、侵入しない場合にのみ流脈線5a,5bを表示させることもできる。その際、処理部12は、処理の効率化のため、第1解析時刻における第1流脈線に基づいて第2解析時刻における第2流脈線を計算する際に、以下のような処理を実行することができる。
例えば処理部12は、第1流脈線上の第1の位置にある離散点を含む、解析空間内の部分領域を、離散点についての解析対象領域に決定する。解析対象領域は、例えば球形の領域である。次に処理部12は、流体情報に示される解析対象領域内の流体の速度に基づいて、第2解析時刻における離散点上の粒子の移動先を示す第2の位置を計算する。次に処理部12は、構造体情報に示される解析対象領域内に存在する構造体の情報に基づいて、第2解析時刻における解析対象領域内の構造体の占有領域を特定する。次に処理部12は、第1の位置と第2の位置とに基づいて、第2流脈線の占有領域への侵入の有無を判定する。そして処理部12は、第2流脈線が占有領域に侵入しないと判定したとき、第2の位置を通過する第2流脈線の表示情報を生成することにより、第2流脈線を表示する。
このように、解析範囲を解析対象領域内に限定して、流脈線が構造体の占有領域に侵入したか否かを判定することで、処理量が削減され、効率的な処理が可能となる。
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態は、心臓の動きと共に、心臓内の血流の流脈線を可視化する可視化装置である。
例えば数値流体解析を用いれば、心臓中の血流輸送など技術的、倫理的観点から測定が困難である系についても流体の振る舞いを模擬することが可能である。そのため、心臓中での血流輸送の不全が問題となる先天性心疾患などでは治療法の検討に数値流体解析が使用されており、数値流体解析は重要な技術である。そして可視化装置により、このような数値流体解析の結果を可視化することで、医者などの医療関係者が解析結果を容易に把握することができ、治療方針を立てやすくなる。
図2は、第2の実施の形態のシステム構成例を示す図である。可視化装置100は、ネットワーク20を介して心臓シミュレータ200に接続されている。心臓シミュレータ200は、心筋の運動と冠循環とのシミュレーションを行うコンピュータである。可視化装置100は、心臓シミュレータ200からシミュレーション結果を取得する。そして可視化装置100は、シミュレーション結果に基づいて流脈線の表示情報を生成し、生成した流脈線を表示する。シミュレーション結果には、例えば各時刻における心臓の形状を示す3次元モデル、血管中の血液の速度、心筋または血液の物性値などの情報が含まれる。
図3は、可視化装置のハードウェアの一構成例を示す図である。可視化装置100は、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してメモリ102と複数の周辺機器が接続されている。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU(Central Processing Unit)、MPU(Micro Processing Unit)、またはDSP(Digital Signal Processor)などの演算処理装置である。プロセッサ101がプログラムを実行することで実現する機能の少なくとも一部を、ASIC(Application Specific Integrated Circuit)、PLD(Programmable Logic Device)などの電子回路で実現してもよい。
メモリ102は、可視化装置100の主記憶装置として使用される。メモリ102には、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ102には、プロセッサ101による処理に必要な各種データが格納される。メモリ102としては、例えばRAM(Random Access Memory)などの揮発性の半導体記憶装置が使用される。
バス109に接続されている周辺機器としては、ストレージ装置103、グラフィック処理装置104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108がある。
ストレージ装置103は、内蔵した記録媒体に対して、電気的または磁気的にデータの書き込みおよび読み出しを行う。ストレージ装置103は、コンピュータの補助記憶装置として使用される。ストレージ装置103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、ストレージ装置103としては、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)を使用することができる。
グラフィック処理装置104には、モニタ21が接続されている。グラフィック処理装置104は、プロセッサ101からの命令に従って、画像をモニタ21の画面に表示させる。モニタ21としては、CRT(Cathode Ray Tube)を用いた表示装置や液晶表示装置などがある。
入力インタフェース105には、キーボード22とマウス23とが接続されている。入力インタフェース105は、キーボード22やマウス23から送られてくる信号をプロセッサ101に送信する。なお、マウス23は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置106は、レーザ光などを利用して、光ディスク24に記録されたデータの読み取りを行う。光ディスク24は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク24には、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。
機器接続インタフェース107は、可視化装置100に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置25やメモリリーダライタ26を接続することができる。メモリ装置25は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ26は、メモリカード27へのデータの書き込み、またはメモリカード27からのデータの読み出しを行う装置である。メモリカード27は、カード型の記録媒体である。
ネットワークインタフェース108は、ネットワーク20に接続されている。ネットワークインタフェース108は、ネットワーク20を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
以上のようなハードウェア構成によって、第2の実施の形態の処理機能を実現することができる。なお、第1の実施の形態に示した装置も、図3に示した可視化装置100と同様のハードウェアにより実現することができる。
可視化装置100は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。可視化装置100に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、可視化装置100に実行させるプログラムをストレージ装置103に格納しておくことができる。プロセッサ101は、ストレージ装置103内のプログラムの少なくとも一部をメモリ102にロードし、プログラムを実行する。また可視化装置100に実行させるプログラムを、光ディスク24、メモリ装置25、メモリカード27などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、ストレージ装置103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
次に流脈線について説明する。
図4は、流脈線の計算例を示す図である。可視化装置100は、解析対象の空間中に粒子発生源30を定義する。解析が始まると、粒子群33が粒子発生源30から連続的に射出される。粒子群33は流れ場が時間に対して不変であれば、一定の曲線(流線)になる。流れ場が時間依存して変化すると、粒子群33が作り出す曲線も時々刻々と変化していく。この曲線が流脈線31,32である。図4では、時刻t0における粒子群33の連なりを示す流脈線31と時刻t1における粒子群33の連なりを示す流脈線32とが示されている。流脈線31,32は、障害物35の影響で複雑な曲線となる。
流脈線31,32は時間変動する流れ場に沿って、どのように粒子群33が輸送されていくかを可視化する有力な方法である。例えば障害物35を自動車とした場合を考える。開発した自動車の空気抵抗を可視化するため、自動車前方から空気を送ると共に、自動車の前方に粒子発生源30を配置する。そして可視化装置100内での流体シミュレーションにおいて、粒子群33を連続的に射出し、粒子群33の軌跡が流脈線31,32として測定される。流脈線31,32は流体の輸送を直接記述し、可視化できるため、様々な分野に応用可能である。
流脈線の計算や、可視化の研究は多数行われており、乱流や不安定流などを対象とした研究は多数ある。しかし、心臓のように流体から見て壁面になるような弾性体が大きく変形を起こす場合の流脈線の可視化については先行研究があまりない。心臓は周期的に拍動し、拡張と収縮を繰り返すため、大変形を起こす系の典型例である。そして、心臓のポンプ作用はこの周期的な運動が重要な役割を果たしているため、弾性体が周期的に大変形を起こす系における血流の輸送を評価することは、心疾患の治療法を考慮するうえで重要になる。
生体シミュレーションの研究では、心臓の挙動をコンピュータ上でシミュレートすることも行われている。コンピュータ上でシミュレーションを行うことで、実際に手術を実行しなくても、手術を実行した場合の治療効果を評価できる。そのため生体シミュレーションを用いれば、医師は実際に手術をする前に、最もよい治療法を検討することが可能である。特に、心臓シミュレーションは、3次元的に複雑な構造を持つ心臓が対象である。そして、心臓の挙動も動的に変化する。心臓の挙動に合わせて、心臓内の血流の輸送を表す流脈線が可視化できれば、心臓の状態を視覚的に容易に把握することができる。視覚的に分かりやすく表示することは、判断の間違いを防ぐためにも有用である。
心臓内の血流の流脈線を可視化する際に障害となるのは以下の点である。
1.心筋(弾性体)が大きく変形するとき、心筋付近で流跡線、流脈線の挙動を正確に追跡することが困難なことである。
2.流跡線が常に1点のみ計算すればよいのに対して、流脈線は線分を構成するN点全てを計算しなければならず、計算量が非常に多いことである。
3.有限要素モデルの一部の品質の悪いメッシュが、全体の計算量を増加させてしまうことである。
そこで、第2の実施の形態の可視化装置100は、以下の機能により、実現可能な計算量で高精度の流脈線を可視化できるようにしている。
1−1:可視化装置100は、流脈線の各点が可動領域外の心筋に入り込んだり、シミュレーション対象の系の外に出したりしたかどうかを正確に判定する。
1−2:可視化装置100は、流脈線上の点が可動領域外にある場合、流線の微分方程式のパラメータの時間刻み幅を調節し、可動領域外に出ないように制御する。
1−3:可視化装置100は、任意の時刻における場の情報を推定するため、補間法を用いて場を補間する。
1−4:可視化装置100は、流脈線の動きの精度を高めるため、見かけの力を反映させた計算式により、流脈線を計算する。
2−1:1−3の機能を適用すると計算量が増加するため、可視化装置100は、流脈線の点が動く最大距離を計算し、その距離を半径とする予測球内部の場の情報のみを計算することでデータ容量に関係なく計算量を一定にする。
2−2:可視化装置100は、時間刻み幅を分割することで予測球半径を小さくし、予測球を使用しない場合より計算量を減らすと共に、同時に精度も向上させる。
3−1:大部分の計算は品質のよいメッシュに対して行われるのを利用し、可視化装置100は、品質のよいメッシュと決めて投機的に計算を実行し、失敗した場合には高精度計算を行うことで、計算量を削減する。投機的な計算とは、流脈線を構成する点の移動先が予測球の外部になる可能性があることを許容して、予測球の半径を小さくすることである。計算に失敗する場合とは、流脈線を構成する点の移動先が予測球内に存在しない場合である。
3−2:3−1にて投機的に実行するため、可視化装置100は確率モデルを用意し、失敗時のペナルティまで含めて計算量が最小になるようなパラメータセットを決定する。
4−1:見かけの力を反映させた流脈線の計算を効率的に実施するため、見かけの力に応じた係数を事前に計算し、時間ステップごとに、その計算結果を参照して流脈線を計算する。
これらの機能が可視化装置100に実装されていることで、以下の効果が得られている。
1.心筋(弾性体)が大きく変形をする場合にも心筋(弾性体)の運動を考慮して流脈線を計算できる。
2.流脈線の各点を、予測球を用いて、見かけの力を反映させた計算式で高速・高精度に計算ができる。
3.確率モデルを用い、計算コストを最小化する予測球半径の決定ができる。
以下、可視化装置100の機能を詳細に説明する。
図5は、可視化装置の機能を示すブロック図である。可視化装置100は、情報の記憶機能として、シミュレーション結果記憶部110と、事前解析結果記憶部120とを有する。シミュレーション結果記憶部110は、心臓シミュレータ200から取得したシミュレーション結果を記憶する。例えば数値流体力学シミュレーションが心臓シミュレータ200で実施され、動的に変化する弾性体と流体の場のシミュレーション結果がL個(Lは1以上の整数)の時刻t0,t1,・・・,tLでファイルに保存される。例えば心筋の情報と血流の情報が別々のファイルとして、シミュレーション結果記憶部110に保存される。図5の例では、時刻ごとの心筋の情報が弾性体情報ファイル群111として保存され、時刻ごとの血流の情報が流体情報ファイル群112として保存されている。
事前解析結果記憶部120は、見かけの力の事前解析によって算出される、見かけの力に応じた係数を記憶する。以下、事前解析によって算出された係数群を、事前解析結果Ωと呼ぶ。例えば事前解析結果記憶部120は、事前解析結果Ωを含む事前解析ファイル121を記憶する。
可視化装置100は、シミュレーション結果記憶部110に記憶されたシミュレーション結果を分析することで、血流の輸送情報を記述する流脈線を計算することができる。なお、シミュレーション結果として出力される時間間隔Δti=ti+1−tiは心臓シミュレータ200が微分方程式を解く場合の時間間隔と一致していなくてもよい。情報量を削減するため、間引かれたシミュレーション結果が出力されることが一般的である。そこで可視化装置100は、流脈線を高精度に求めるため、複数の時刻での出力ファイルを用いてターゲットとなる時刻での種々の物理量を、補間法などを用いて推定する。
次に可視化装置100の処理機能について説明する。可視化装置100は、情報読み込み部130、事前解析部140、流脈線計算部150、表示処理部160、および解析部170を有する。
情報読み込み部130は、流体解析の結果を示すファイルをシミュレーション結果記憶部110から読み込む。事前解析部140は、情報読み込み部130が読み込んだ情報を用いて、流脈線計算用の係数を算出する。事前解析部140は、事前解析結果Ωを含む事前解析ファイル121を、事前解析結果記憶部120に格納する。流脈線計算部150は、情報読み込み部130が読み込んだ情報と、事前解析部140が算出して係数とを用いて流脈線を計算する。表示処理部160は、得られた結果を可視化する。
解析部170は、情報読み込み部130、事前解析部140、流脈線計算部150、および表示処理部160が共通に使用する機能をまとめたものである。情報読み込み部130、事前解析部140、流脈線計算部150、および表示処理部160は、具体的な解析処理を実行する際に、解析部170に実行する処理を依頼して、結果を得る。
解析部170は、係数計算部171、流体情報解析部172、弾性体情報解析部173、予測球半径計算部174、予測球内部計算部175、移動境界衝突判定部176、および表示様式決定部177を有する。係数計算部171は、見かけの力を反映させた補間多項式に含まれる係数を計算する。流体情報解析部172は、流体の速度場や離散点の位置、境界面の解析などを行う。弾性体情報解析部173は、心筋など流体ではない弾性体の離散点の位置や境界面の解析を行う。予測球半径計算部174は、流脈線の計算時の計算速度と計算精度の向上のために用いる予測球の半径を決定する。予測球内部計算部175は、予測球内部の速度場、心筋位置などを計算する。移動境界衝突判定部176は、流脈線上の点が計算上の誤差のため、心筋内部に入り込んだかどうかを判定する。表示様式決定部177は、得られた流脈線の表示の仕方を決定する。
なお、図5に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをコンピュータに実行させることで実現することができる。
次に、シミュレーション結果として得られる情報について詳細に説明する。
図6は、弾性体情報ファイル群の一例を示す図である。弾性体情報ファイル群111は、シミュレーションの時刻ごとの弾性体情報ファイル111a,111b,・・・の集合である。各弾性体情報ファイル111a,111b,・・・には、例えば「stru(X).inp」というファイル名が付与される。ファイル名中の「X」は、シミュレーションの時刻が古い順に付与された昇順の番号である。
弾性体情報ファイル111a,111b,・・・内には、対応する時刻における心臓の形状を表す心筋データが含まれている。心筋データには、グリッド(3次元空間内に配置された頂点)のx、y、zの座標値、心筋に含まれる4面体の要素(TETRA)の4つの頂点を示すグリッドのID、各要素に加わる力などの情報が含まれる。
図7は、流体情報ファイル群の一例を示す図である。流体情報ファイル群112は、シミュレーションの時刻ごとの流体情報ファイル112a,112b,・・・の集合である。各流体情報ファイル112a,112b,・・・には、例えば「flui(Y).inp」というファイル名が付与される。ファイル名中の「Y」は、シミュレーションの時刻が古い順に付与された昇順の番号である。
流体情報ファイル112a,112b,・・・内には、対応する時刻における血液の流れを表す血流データが含まれている。血流データには、グリッド(3次元空間内に配置された頂点)のx、y、zの座標値、血管内の4面体の要素(TETRA)の4つの頂点を示すグリッドのID、各グリッド上での血液の流れる方向と速さを示す速度場ベクトルが含まれる。
図8は、事前解析ファイルの一例を示す図である。事前解析ファイル121には、すべての時刻における、すべてのグリッド点の補間多項式(後述の式(2))を再現できるように、グリッド番号、時刻、位置座標、速度場(血流のみ)、補間多項式係数が記録される。例えば事前解析ファイル121には、出力時刻インデックステーブル121a、心筋側補間多項式係数テーブル121b、および流体側補間多項式係数テーブル121cが含まれる。
出力時刻インデックステーブル121aには、時刻のインデックス(Time Index)に対応付けて、流体解析のシミュレーション上での時刻(Time)が設定されている。
心筋側補間多項式係数テーブル121bには、グリッドのID(GRID ID)と時刻のインデックス(Time Index)と軸のインデックス(Direction Index)の組に対応付けて、軸方向の位置(Position)、心筋側補間多項式に用いる各係数(係数a、係数b、係数c、係数d)の値が設定されている。
流体側補間多項式係数テーブル121cには、グリッドのID(GRID ID)と時刻のインデックス(Time Index)と軸のインデックス(Direction Index)の組に対応付けて、軸方向の位置(Position)、軸方向の速さ(Velocity)、流体側補間多項式に用いる各係数(係数a、係数b、係数c、係数d)の値が設定されている。
なお流体側補間多項式係数テーブル121cには、各グリッドにおける流体の速度場の時間微分の計算結果を含めることもできる。
可視化装置100は、図6と図7に示したシミュレーション結果と、図8に示した事前解析結果Ωとに基づいて、流脈線を計算し可視化する。以下、流脈線の可視化処理について詳細に説明する。
図9は、流脈線可視化処理の手順の一例を示すフローチャートである。以下、図9に示す処理をステップ番号に沿って説明する。
[ステップS101]流脈線計算部150は、事前解析結果記憶部120に事前解析ファイル121が格納されているか否かを判断する。流脈線計算部150は、事前解析ファイル121が格納されている場合、処理をステップS102に進める。また流脈線計算部150は、事前解析ファイル121が格納されていない場合、処理をステップS103に進める。
[ステップS102]流脈線計算部150は、事前解析結果記憶部120から事前解析ファイル121を読み込む。その後、流脈線計算部150は、処理をステップS105に進める。
[ステップS103]事前解析部140は、補間多項式の係数を算出するための事前解析処理を行う。事前解析処理の詳細は後述する(図10参照)。
[ステップS104]事前解析部140は、事前解析処理によって算出された係数の値を含む事前解析ファイル121を生成し、事前解析ファイル121を事前解析結果記憶部120に格納する。
次に、流脈線計算部150は、ステップS105〜S108において、流脈線の初期設定を行う。
[ステップS105]流脈線計算部150は、計算する流脈線の本数M(Mは1以上の整数)を決定する。例えば流脈線計算部150は、ユーザから入力された値を、流脈線の本数Mとする。
[ステップS106]流脈線計算部150は、流脈線の計算回数N(Nは1以上の整数)を決定する。以下、流脈線の計算回数Nを「時間発展回数」と呼ぶ。例えば流脈線計算部150は、ユーザから入力された値を、時間発展回数Nとする。
流脈線は時間と共に変化するので、時間発展回数Nを決定することで、流脈線の結果が出力される時刻列t0,t1,・・・,tNが決定される。指定された時間発展回数Nがファイルの個数L(Lは1以上の整数)より大きい場合は、流脈線計算部150は、L+1番目を心臓の2周期目の拍動として扱い、t0でのファイルを使用する。時刻列は、例えば0.01秒間隔の等間隔に設定される。ただし、時刻列の時間間隔は、等間隔でなくてもよい。
[ステップS107]流脈線計算部150は、流脈線の粒子発生源の座標を決定する。例えば流脈線計算部150は、ユーザから指定された解析空間上の点を、粒子発生源の座標とする。ユーザは、例えば心筋情報と血流情報を参照しながら、空間の一点を指定する。流脈線計算部150は、指定された点の座標を、座標ベクトルX0として読み込む。流脈線の本数が1本の場合は、流脈線の粒子発生源は座標ベクトルX0に設定される。流脈線の本数が複数本ある場合、流脈線計算部150は、座標ベクトルX0を中心とした半径r(rは正の実数)の球の中から流脈線ljの粒子発生源をランダムに決定する。なお流脈線の粒子発生源は、血流中の座標から選ばれる。流脈線計算部150は、決定した粒子発生源の座標ベクトルXjを流脈線の粒子発生源として設定する。
その後、流脈線計算部150は、j番目(j=1,2,・・・,M)の流脈線ljの初期設定を以下のようにして行う。
j番目の流脈線ljは時間発展回数Nと同じ分だけの離散点で構成される。そこで流脈線計算部150は、流脈線ljに含まれる各離散点を示す点Pij(i=0,1,2,・・・,N)を生成する。流脈線計算部150は、各離散点の初期値の座標を、粒子発生源の座標とする。
なお、時刻t=tiにおける流脈線ljの計算では、点Pij(i=0,1,2,・・・,i)が、発生源から射出された流脈線粒子の位置として、時間発展計算の対象になる。点Pij(i=i+1,・・・,N)に対応する流脈線粒子はまだ発生源から射出されていないと考えるため、時刻t=tiにおける流脈線ljの計算では計算対象とはならない。そして流脈線計算部150は、離散点のうちiの値が小さい順に計算をする。そのため、先に計算される離散点ほど、粒子発生源から射出されてからの時間は長くなる。
[ステップS108]流脈線計算部150は、流脈線ljの点が大動脈など、系の流体境界から出た場合のための設定を行う。流脈線lj上の点Pijが大動脈など流体境界から系外に出た場合、系外では流体の速度場が定義されていないため、次の時刻でのPijの計算を実行することはできない。そこで流脈線計算部150は、すべての点Pijに領域内判定フラグを、各離散点のパラメータとして設定する。領域内判定フラグは、領域内にある場合を「T」とし、大動脈など流体の流れに従い領域外に出た場合を「F」とする。初期状態では流体内部に点Pijが存在しているため、流脈線計算部150は、すべての離散点の領域判定フラグにTをセットする。
[ステップS109]流脈線計算部150は、インデックスi=1から順番に、インデックスi=1,2,・・・,N−1について、ステップS110〜S114のループ処理を繰り返し実行する。
[ステップS110]流脈線計算部150は、インデックスj=1から順番に、インデックスj=1,2,・・・,Mについて、ステップS111〜S113のループ処理を繰り返し実行する。
[ステップS111]流脈線計算部150は、時間発展の起点になる時刻を決定し、メモリ102に保持する。計算開始時刻は第i回目の計算ではt=tiに設定される。時間発展の終端時刻はt=ti+1に設定される。
[ステップS112]流脈線計算部150は、時間ti≦t≦ti+1における時間発展計算を行う。時間発展計算により、各時刻t=tiにおいて、流脈線ljの粒子発生源から射出されたすべての点Pij(i=0,1,2,・・・,i)が時間発展の対象となり、線分上のすべての点が時々刻々と更新されていく。流脈線lj上の点Pijの時間[ti,ti+1]の時間発展計算の結果、座標値が返される。これが次の時刻t=ti+1での座標Pi+1,jとして設定される。
[ステップS113]流脈線計算部150は、得られた計算結果をメモリ上に保存する。計算結果は、表示処理部160によって流脈線ljが描画される。また流脈線計算部150は、ファイルに流脈線ljの座標値を出力することもできる。
[ステップS114]流脈線計算部150は、ステップS111〜S113の処理を1回実行するごとにインデックスjに1を加算し、インデックスj=Mの処理が終了したら、処理をステップS115に進める。
[ステップS115]流脈線計算部150は、ステップS110〜S114の処理を1回実行するごとにインデックスiに1を加算し、インデックスi=N−1の処理が終了したら、流脈線可視化処理を終了する。
次に、事前解析処理(ステップS103)の詳細について説明する。事前解析処理は、任意時刻tにおける心筋の構造情報の推定と血流部分の速度場の推定に使用する係数を生成する処理である。
初めに前提になる出力データについて説明する。出力データには、シミュレーション上の時刻t=tiが付与されている。ここで、心筋の構造情報をベクトルM(ベクトルr,ti)とする。このとき心筋上には、有限個の離散点ベクトルrkが与えられている。これは、図6に示すように心筋の弾性体情報ファイル111a,111b,・・・に出力されており、離散点はGRID IDで一意に識別され、座標が保存されている。軸ごとの座標の値が、GRID IDに対応する離散点を示す離散点ベクトルrkの要素である。
有限要素法では、これらの離散点を頂点とした図形(例えば四面体)を要素として、計算が行われる。要素は図6の弾性体情報ファイル111a,111b,・・・のTETRA IDで一意に識別され、要素を構成する離散点のGRID IDが保存されている。図6の例では四面体要素を用いているが、要素は四面体以外の形状でもよい。これらの離散点の位置と有限要素の配置により心筋の形状が決定される。
流体部分の構造情報も心筋と同様である。流体部分の構造情報をベクトルB(ベクトルr,ti)とする。このとき、流体部分も有限個の離散点と有限要素で構成され、図7に示すような流体情報ファイル112a,112b,・・・に出力されている。流体に関して、心筋との違いは、流体情報として、離散グリッド点(ベクトルrk)上での流体の速度場を示す速度場情報(速度ベクトルv(ベクトルrk,ti))も出力されていることである。事前解析部140は、すべての時刻t0,t1,・・・,tLの心筋の構造、血流の構造および速度場情報を用いて、事前解析を実行する。
図10は、事前解析処理の手順の一例を示すフローチャートである。以下、図10に示す処理をステップ番号に沿って説明する。
[ステップS121]事前解析部140は、インデックスi=1から順番に、インデックスi=1,2,・・・,N−1について、ステップS122のループ処理を繰り返し実行する。
[ステップS122]事前解析部140は、情報読み込み部130を介して、時刻tiのベクトルB(ベクトルr,ti)、ベクトルv(ベクトルr,ti)、ベクトルM(ベクトルr,ti)を、シミュレーション結果記憶部110から読み込む。
[ステップS123]事前解析部140は、ステップS122の処理を1回実行するごとにインデックスiに1を加算し、インデックスi=N−1の処理が終了したら、処理をステップS124に進める。
[ステップS124]事前解析部140は、心筋の構造情報であるベクトルM(ベクトルr,ti)を構成する時刻tiにおけるグリッド座標ベクトルrlの時間微分ベクトルdrl/dtの値を、すべての時刻、すべてのグリッド点について算出する。
[ステップS125]事前解析部140は、血流の構造情報であるベクトルB(ベクトルr,ti)を構成する時刻tiにおけるグリッド座標ベクトルrlの時間微分ベクトルdrl/dtの値を、すべての時刻、すべてのグリッド点について算出する。
[ステップS126]事前解析部140は、血流の時刻tiにおけるグリッド座標ベクトルrl上での速度場ベクトルv(ベクトルrl,ti)の時間微分ベクトルdv(ベクトルrl,ti)/dtを、すべての時刻、すべてのグリッド点について計算する。
なおステップS124〜S126に示したインデックスlは、グリッド番号を示す。また、心筋についてはグリッド座標の総数はNM,elem個存在し、血流についてはグリッド座標の総数はNB,elem個存在するものとする。
次に、心筋、血流部分のグリッド座標ベクトルrlにおける時刻tiでの時間微分ベクトルdrl/dtの値を計算方法について詳細に説明する。時間微分ベクトルdrl/dtの値は、すべてのグリッド点について同じ方法で計算できる。
まず事前解析部140は、グリッド番号lを指定し、位置ベクトル列rk(ti)(i=0,1,2,・・・,n−1)の情報を取得する。次に事前解析部140は、取得した情報からベクトルのX,Y,Z成分を抜き出し、座標列Xl(ti)(i=0,1,2,・・・,n−1)、Yl(ti)(i=0,1,2,・・・,n−1)およびZl(ti)(i=0,1,2,・・・,n−1)として保存する。ここでnはファイル数である(nは1以上の整数)。
次に事前解析部140は、X成分についてすべての点Xl(ti)を通るような滑らかに連続な曲線Xl(t)を補間法で求める。補間法として、例えばcubic splineを用いる。なお、cubic spline以外の補間法を用いてもよい。cubic splineでは曲線Xl(t)を区間ti≦t≦t(i+1) 毎に定義された補間多項式X(l,i)(t)を用いて式(1)で定める。
補間曲線Xl,i(t)の具体形は
となる。ただし、nは心臓の拍動1周期分であるため、事前解析部140は、n+1番目は0番目の値になるように、周期境界条件を課す。例えば事前解析部140は、tn+m=tmとする。また事前解析部140は、補間曲線Xl,i(t)の関数値についてもXl,n+m=Sl,mとする。ここで係数al,i,bl,i,cl,i,dl,iは未知数であるが、区間ti≦t≦ti+1ごとに微分まで含めて滑らかに連続になる条件を付加することで、連立一次方程式を作ることができる。この連立方程式を数値的に解くことですべての係数al,i,bl,i,cl,i,dl,iの組を計算することができる(非特許文献5参照)。そして、dXl/dtは式(3)から直接計算することができる。
このようにして、時間に関する1階微分および2階微分が連続になるように時刻tiにおけるdXl/dtの値を求めることができる。
そして事前解析部140は、係数al,i,bl,i,cl,i,dl,iの配列を事前解析結果Ωに含めて保存する。Y,Z成分についても同様の手続きで補間関数を求めることができる。事前解析部140は、このような係数の算出を、すべての心筋のグリッド点と血流のグリッド点について行う。その結果、ベクトルdrl/dtの値が計算されたこととなる。
次に速度場ベクトルv(ベクトルrl,ti)の時間微分ベクトルdv(ベクトルrl,ti)/dtを求める手続きを説明する。この時間微分ベクトルdv(ベクトルrl,ti)/dtは、グリッド点を流体に固定し、グリッド点が流体と共に運動すると仮定した場合におけるグリッド点の加速度を表している。これは流体力学の世界ではラグランジュ座標と呼ばれるものである。
なお、解析対象が非圧縮性流体の場合、加速度に流体の密度を掛けると、そのグリッド点上の粒子に加わる力となる。そのため、グリッド点の加速度を求めることは、非圧縮性流体内のグリッド点上の粒子に加わる力の大きさと方向を求めることに等しい。
流体の速度場は、速度場ベクトルv=(vx,vy,vz)のように成分表示することができる。ここでは速度場のx成分(vx)について説明するが、速度場のy成分(vy)についても同様にして計算することができる。速度場のz成分(vz)を算出する場合、事前解析部140は、合成関数の微分を計算する。すると、以下の式(4)が成立する。
式(4)から各グリッド点(グリッド番号k)における時刻t=tiでの速度場のx成分(vx)の時間微分を求めることができる。グリッド番号kの座標ベクトルrkにおけるベクトルdrk/dtは、補間多項式からすでに求めている。∇vxについては、非特許文献6などを参考にして計算できる。残りの速度場の時間に関する偏微分は、以下の式(5)を用いて計算できる。
ここで、ベクトルaaveはグリッド番号kのグリッド点のラグランジュ座標での平均加速度ベクトル、ベクトルvaveは平均速度ベクトルであり、下記の式(6)、(7)で定義される。
ここで、式(5)にはグリッド点のラグランジュ座標での平均加速度(ベクトルaave)の項と、平均速度(ベクトルvave)の項が含まれているが、これはグリッド点が任意の運動をしているため、グリッド点自体の運動に起因する見かけの力を補正するためである。
グリッド点が加速度運動をする場合における解析手法として、例えばALE(Arbitrary Lagrangian-Eulerian)法がある。
図11は、ALE制御されたグリッド点自身の運動による見かけの力の原理を示す図である。ALE制御されたグリッド点は、心臓の収縮に合わせて1拍動すると元の位置に戻り、心臓の拍動に合わせて運動する。このとき、グリッド点は速度が時々刻々と変化するので、加速度が生じる。ところがグリッド点自身に観測装置を設置すれば、観測者は自らを静止したと解釈してしまう。自分自身の加速度運動による効果は見かけの力としてあたかも流体に働くように見えてしまう。そのため、自分自身の加速度運動による補正をしなければならない。この見かけの力を補正するための手続きが式(5)、式(6)、式(7)には含まれている。このようにして、各グリッド点における時刻t=tiでの速度場の時間微分を計算することができる。事前解析部140は、このような速度場の時間微分をすべてのグリッド点での血流の速度場について求め、各グリッド点での速度場の時間微分を含むデータセットを、事前解析結果Ωとして事前解析結果記憶部120に保存する。
次に、時間発展計算処理(ステップS112)の詳細について説明する。
図12は、時間発展計算処理の手順を示すフローチャートの前半部分である。以下、図12に示す処理をステップ番号に沿って説明する。
[ステップS131]流脈線計算部150は、点Pijの領域内判定フラグを読み込む。そして流脈線計算部150は、領域内判定フラグが「T」か否かを判断する。領域内判定フラグが「T」であれば、流脈線計算部150は、処理をステップS132に進める。領域内判定フラグが「F」であれば、流脈線計算部150は、この点は既に領域外に出たものとして扱い、計算を行わず、時間発展計算処理を終了する。これにより、領域内判定フラグが「F」の場合、座標値は更新されないこととなる。
[ステップS132]流脈線計算部150は、点Pijの座標値を読み込む。
[ステップS133]流脈線計算部150は、計算開始時刻t=tiおよび計算終了時刻t=ti+1を、メモリ102から読み込む。
[ステップS134]流脈線計算部150は、計算開始時刻t=tiに対応する、流体部分のグリッド情報ベクトルB(ベクトルr,ti)と速度場ベクトルv(ベクトルr,ti)を、情報読み込み部130を介してファイルflui(i).inpから読み込む。また流脈線計算部150は、心筋部分の弾性体のグリッド情報(心筋の構造情報)であるベクトルM(ベクトルr,ti)を、情報読み込み部130を介してファイルstru(i).inpから読み込む。
[ステップS135]流脈線計算部150は、計算終了時刻t=ti+1における流体部分のグリッド情報ベクトルB(ベクトルr,ti+1)と速度場ベクトルv(ベクトルr,ti+1)を、情報読み込み部130を介してファイルflui(i+1).inpから読み込む。また流脈線計算部150は、ベクトルM(ベクトルr,ti+1)を、情報読み込み部130を介してファイルstru(i+1).inpから読み込む。
[ステップS136]流脈線計算部150は、flui(i).inpとflui(i+1).inpの各グリッド点の速度場ベクトルのノルム(速度場ベクトルの長さ)を計算し、補間式を用いることにより当該時間区間における速度の最大値を求め、求めた最大値をVmaxとしてメモリ102に保存する。
[ステップS137]区間[ti,ti+1]をそのまま1回の時間発展で計算すると精度が不十分である。そのため流脈線計算部150は、区間[ti,ti+1]をNdiv(Ndivは1以上の整数)等分し、中間時刻(t=tk(k=1,2,・・・,Ndiv))を決定する。これにより、区間を[ti,ti+Δt],[ti+Δt,ti+2Δt],・・・,[ti+(Ndiv−1)Δt,ti+1]に分割して解くこととなる。分割数Ndivは、流脈線計算部150が最適値を自動で決定する。なお、分割数Ndivを外部から与えることもできる。その後、処理がステップS141(図13参照)に進められる。
図13は、時間発展計算処理の手順を示すフローチャートの後半部分である。以下、図13に示す処理をステップ番号に沿って説明する。
[ステップS141]流脈線計算部150は、中間時刻(t=tk(k=1,2,・・・,Ndiv))の、k=1からk=Ndivまで、ステップS142〜S150のループ処理を繰り返し実行することで、時間発展計算を行う。これにより、各中間時刻t=tkにおける座標ベクトルrkが得られ、時刻t=ti+1における点Pi+1jの座標ベクトルrNdiv=ベクトルri+1が得られる。
[ステップS142]流脈線計算部150は、時刻t=tkにおける場の情報(流体の構造情報ベクトルB(ベクトルr,tk)と速度場ベクトルv(ベクトルr,tk))を求める。この処理の詳細は後述する(図17参照)。
[ステップS143]流脈線計算部150は、時刻t=tkにおける弾性体場の情報(心筋の構造情報ベクトルM(ベクトルr,tk))を求める。この処理の詳細は後述する(図18参照)。
[ステップS144]流脈線計算部150は、時間dt=tk+1−tk分だけ時間発展を行い、ベクトルrk+1を求める。
ステップS142〜S144における各中間時刻での時間発展は以下のようにして行うことができる。点Pijが時刻t=tkで、ベクトルrk(tk)にあったとすると、流脈線の方程式は式(8)で与えられる。
ここでベクトルv(ベクトルr,t)は時刻t、位置ベクトルrでの速度(場)である。従って、時間Δt後の座標は常微分方程式である式(8)を数値的に解くことによって得られる。式(8)を4次ルンゲ・クッタ法で解くと以下のような計算式が得られる。なお、この考え方はより高次のルンゲ・クッタ型公式にも適用可能であり、高精度の計算が可能である(非特許文献2参照)。ここでは典型例として4次のルンゲ・クッタ公式で説明する。
4次のルンゲ・クッタ公式では、以下の式(9)、式(10)が成り立つ。
ここで流脈線計算部150は、係数αIと係数βIの値を、ルンゲ・クッタ係数表から取得する。
図14は、ルンゲ・クッタ係数表の一例を示す図である。図14に示すルンゲ・クッタ係数表には、I(Iは1〜4の整数)の値ごとの、係数αIと係数βIの値が示されている。図14に示すようなルンゲ・クッタ係数表は、例えばメモリ102に予め記憶されている。
時刻t=tkでの任意の位置ベクトルrでの速度場ベクトルv(ベクトルr,tk)は、ベクトルv(ベクトルr,ti)、ベクトルv(ベクトルr,ti+1)、ベクトルB(ベクトルr,ti)、ベクトルB(ベクトルr,ti+1)、ベクトルM(ベクトルr,ti)、およびベクトルM(ベクトルr,ti+1)から求めることができる。また時刻t=tkでの移動境界面をSkとすると、ステップS142、S143で用いる移動境界面Sk上の速度場の情報も計算することができる。以下、移動境界面を単に「境界面」と呼ぶ。従って、式(9)、式(10)、図14に示したルンゲ・クッタ係数表を用いて時間発展に必要な中間の値を計算することができる。これらの結果を式(8)に代入することで、ベクトルr(tk+1)を求めることができる。なお、時間発展処理の詳細は後述する(図20参照)。
以下、図13の説明に戻る。
[ステップS145]流脈線計算部150は、ベクトルrk+1の心臓内部での位置判定を行う。この処理を行うのは、求めたベクトルrk+1は有限の時間幅で誤差を含んでおり、心筋内部に入り込んでしまう場合があるためである。サブルーチンとして位置判定を行った結果、位置判定の結果を示すステータスが返される。例えば心筋を跨いだり、心筋内部に入り込んだりしていなければ正常終了ステータスである「0」または「2」が返される。ベクトルrk+1が解析対象の流体の要素内の位置(例えば心房・心室中)を示している場合、ステータス「0」が返される。ベクトルrk+1が解析対象の流体の要素外の位置(例えば動脈中)を示している場合、ステータス「2」が返される。この処理の詳細は後述する(図23参照)。
[ステップS146]流脈線計算部150は、判定結果が、正常終了を示すステータス「0」か否かを判断する。ステータスが「0」であれば、処理がステップS150に進められる。ステータスが「0」でなければ、処理がステップS147に進められる。
[ステップS147]流脈線計算部150は、判定結果が、終了を示すステータス「2」か否かを判断する。ステータス「2」が返される場合とは、計算の途中で点Pijが流体境界を超えて、大動脈のような系外に出た場合である。ステータスが「2」であれば、処理がステップS148に進められる。ステータスが「2」でなければ、処理がステップS149に進められる。
[ステップS148]流脈線計算部150は、点Pijが系外に出た場合、流脈線上の点Pijのj=1からjまでの領域内判定フラグを「F」に設定する。領域内判定フラグ「F」は、点Pijが解析領域外に出たことを示している。その後、流脈線計算部150は、時間発展計算処理を終了する。このように終了ステータスが「2」の場合、系外に出たとして、領域内判定フラグを「F」に変えられる。線分を描画するとき、線分は点Pi1,Pi2,Pi3,・・・,PiNの順番に点と点を曲線で結んで描画される。そのため、Pijが領域外に出た場合は、粒子発生源から射出したそれ以前の点も描画をする根拠が失われる。そこで流脈線計算部150は、j=1,2,・・・,jまでの領域内判定フラグをすべて「F」に変えて処理を終了している。
[ステップS149]流脈線計算部150は、正常終了しなかった場合(ステータスが「0」または「2」でない場合)、コントロールパラメータである時間刻み幅を小さくし、さらに計算を複数回に分けて、ステップS142〜S147の処理を繰り返す。ステップS142〜S147の処理の繰り返しは、可変時間刻み法で計算が収束するまで続けられる。流脈線計算部150は、時間刻み幅を小さくしていき、正常に終了したら、処理をステップS150に進める。
なお、ベクトルrk+1が予測球外に出てしまっているときも、正常終了しなかった場合に相当する。この場合、流脈線計算部150は、例えば予測球の半径を大きくして再計算することで、ベクトルrk+1が予測球外に出てしまうことを抑止できる。
[ステップS150]流脈線計算部150は、ベクトルrk+1を保存し、保存した値をk+1番目の繰り返し計算の初期値とする。
[ステップS151]流脈線計算部150は、ステップS142〜S150のループ処理が1回終わるごとに、kに1を加算し、ループ処理を繰り返す。流脈線計算部150は、k=Ndivの処理が終了すると、処理をステップS152に進める。
[ステップS152]流脈線計算部150は、最終的に求まったベクトルrNdivを、ベクトルrk+1として保存する。
図12、図13に示した処理により、流脈線上の点の座標が更新されていく。
図15は、流脈線のデータ例を示す図である。図15に示すように、解析対象の時刻ごとに、各流脈線の点の座標値が設定されている。時刻t=t0では、各流脈線上の点には、初期値としてすべて粒子発生源の座標値が設定されている。時刻t=t1において最初に放出された粒子の位置を示す点の座標値が更新される。その後、時刻が進むごとに、新たな粒子が放出され、新たに放出された粒子と既に放出されている粒子それぞれの位置を示す点の座標値が更新される。図15では、前回の時刻から位置が変更された点の座標値にアンダーラインを示している。
次に、出力データが与えられていない時刻tkにおける場の情報(ベクトルB(ベクトルr,tk)、ベクトルv(ベクトルr,tk)、およびベクトルM(ベクトルr,tk))を求める手続きを説明する。これらの場の情報は、ルンゲ・クッタ法による時間発展で説明した式(9)、式(10)の計算に使用される。
シミュレーションの結果としてデータが出力されているのは時刻t=ti,ti+1の場合だけである。そのため、ルンゲ・クッタ法で計算する中間時刻tkにおいて、グリッド座標、および速度場は定義されていない。そこで、流脈線計算部150は、出力ファイルの速度場から場を近似的に求める。このとき留意すべきは、シミュレーション実行時に、時々刻々とグリッドの位置を動かしていくことである。グリッドの位置の決め方には任意性があるが、心臓など境界自体が移動する問題ではALE法がよく利用される。ALE法では、シミュレーションに使用する座標自体が、記述する偏微分方程式の解の精度を落とさないように独立に決定される。決定には一般には偏微分方程式が使用される。しかし、データ解析の立場ではグリッドの位置を決定する支配方程式を知ることはできず、与えられたグリッド点の出力値だけが分かっている。このとき、グリッド点の位置が時間に対して連続的に変化する。
図16は、グリッド点の位置が時間に対して連続的に変化する様子を示す図である。図16では、横軸に時刻、縦軸にグリッド点(頂点)のX座標値を示している。図16に示すように、グリッド点は、時間進行に伴い位置が連続的に変化する。そこで流脈線計算部150は、グリッド点の位置が時間に対して連続的に変化することを利用して、補間法を用いて任意時刻におけるグリッド位置を推定する。
図17は、時刻t=tkにおける場の情報を求める処理の手順の一例を示すフローチャートである。以下、図17に示す処理をステップ番号に沿って説明する。
[ステップS161]流脈線計算部150は、時刻tkにおける場の情報をメモリに設定する。設定される情報は、ベクトルB(ベクトルr,ti)、ベクトルv(ベクトルr,ti)、ベクトルB(ベクトルr,ti+1)、およびベクトルv(ベクトルr,ti+1)である。
なお、時刻tkは、ti≦tk≦ti+1を満たす。そしてベクトルB(ベクトルr,ti)、ベクトルv(ベクトルr,ti)、ベクトルM(ベクトルr,ti)、ベクトルB(ベクトルr,ti+1)、ベクトルv(ベクトルr,ti+1)、およびベクトルM(ベクトルr,ti+1)は既知である。これらのベクトルの値は、ステップS134とステップS135において既にファイルから読み込まれている。
流脈線計算部150は、はじめに、流体部分の構造を規定するグリッド点について以下の処理を行う。ただし、計算量の削減のため、点Pi+1jの最大移動距離を理論的に求め、その最大移動距離を半径Rとする球内部のグリッド点のみを対象とする。この球を以後予測球と呼ぶ。
[ステップS162]流脈線計算部150は、予測球半径Rを決定する。この処理の詳細は後述する(図26参照)。
[ステップS163]流脈線計算部150は、予測球半径R内部にある流体のグリッド点を検索し、予測球内部に存在するグリッド点の数をNB,elemに設定する。
[ステップS164]流脈線計算部150は、予測球半径R内部にあるNB,elem個のグリッド点すべてに対して、ステップS165〜S168のループ処理を行う。
[ステップS165]流脈線計算部150は、グリッド点iが境界面上か否かを判断する。境界面上であれば、流脈線計算部150は、処理をステップS167に進める。境界面上でなければ、流脈線計算部150は、処理をステップS166に進める。
ステップS165により、グリッド点iが境界面上か否かにより、処理が分岐する。このような処理分岐が行われているのは、任意の時刻tkにおけるグリッド点iの座標を補間して求めることになるが、グリッド点iが心筋と血流の境界面S(t)上の点である場合は、血流は心筋に対して滑りなしの拘束条件が課されるためである。
[ステップS166]流脈線計算部150は、グリッド点iについての補間式に基づいて、グリッド位置を計算する。補間式は、例えば前述の式(2)である。なお事前解析結果Ωには、グリッド点iの座標の時間に関する補間式(式(2))の結果が保存されている。そのため流脈線計算部150は、事前解析結果Ωから、任意の時刻におけるグリッド座標を特定することができる。その後、流脈線計算部150は、処理をステップS169に進める。
[ステップS167]流脈線計算部150は、グリッド点iが境界面S(t)上の点であれば、境界条件を満たすように、以下のようにしてグリッド点iの位置を計算する。
グリッド点iが境界面S(t)上の点である場合、その速度場から構成される位相空間上の点を(ベクトルrID(t),ベクトルvID(t))とする。すると、時刻tiおよびti+1では値が出力されているため2点(ベクトルrID(ti),ベクトルvID(ti))、(ベクトルrID(ti+1),ベクトルvID(ti+1))を通る曲線として求めればよい。グリッド位置ベクトルrID(t)と速度場ベクトルvID(t)について、以下の式(11)の関係が成立する。
従って、条件式は4つある。そのため、境界面S(t)上のグリッド点iについては、ベクトルID(t)を時間について3次式で定めることにより、4つの条件を満たすようにすることができる。従って、ベクトルrID(t)は、以下の式(12)から決定できる。
係数ベクトルaiはベクトルID(t)の成分をξID(ξ=x,y,z)、その微分の成分をvξ(ξ=x,y,z)とすると、
となる。ここで、
とした。このようにして、任意の時刻における境界面S(t)上の位置ベクトルrID(t)の集合を取得できる。流体におけるすべてのグリッド点iの位置を計算することで、流体の構造情報であるベクトルB(ベクトルr,tk)を決定することができる。
[ステップS168]流脈線計算部150は、補間式(式(12))を用いて算出した係数を、メモリ102に保存する。なお、式(12)では速度場も同時に求めることができる。速度場についてはここで計算してもよいし、必要に応じて式(11)および式(12)を用いて計算することもできる。そのため流脈線計算部150は、補間式(式(12))を用いて算出した係数のみを保存している。
[ステップS169]流脈線計算部150は、ステップS165〜S168の処理を1回行うごとにiに1を加算し、ステップS165〜S168の処理を繰り返す。流脈線計算部150は、i=NB,elemに対する計算が終了すると、予測球内部の全てのグリッド点iにおけるグリッド点iの位置が計算されることになる。
場の情報と同様に、心筋の構造情報であるベクトルM(ベクトルr,t)についても、任意の時刻でのグリッド点情報を計算することができる。
図18は、時刻t=tkにおける弾性体場の情報を求める処理の手順の一例を示すフローチャートである。以下、図18に示す処理をステップ番号に沿って説明する。
[ステップS171]流脈線計算部150は、読み込まれた心筋の構造情報をメモリに設定する。設定される情報は、ベクトルB(ベクトルr,ti)、ベクトルv(ベクトルr,ti)、ベクトルM(ベクトルr,ti)、ベクトルB(ベクトルr,ti+1)、ベクトルv(ベクトルr,ti+1)、ベクトルM(ベクトルr,ti+1)である。
[ステップS172]流脈線計算部150は、予測球半径Rに基づいて、予測球内部の心筋の構造を検索し、心筋のグリッド点iを検索する。予測球半径Rは、流体部分の処理の時と同じ値が用いられる。流脈線計算部150は、検出したグリッド点iの数を、グリッド点NM,elemに設定する。
[ステップS173]流脈線計算部150は、予測球半径R内部にあるNM,elem個のグリッド点iすべてに対して、ステップS174〜S177の処理を行う。
[ステップS174]流脈線計算部150は、グリッド点iが境界面S(t)の点であるか否かを判断する。境界面S(t)上であれば、流脈線計算部150は、処理をステップS176に進める。境界面S(t)上でなければ、流脈線計算部150は、処理をステップS175に進める。
[ステップS175]流脈線計算部150は、事前解析結果Ωを用いて補間式(式(2))に従い、グリッド点iの位置を計算する。その後、流脈線計算部150は、処理をステップS178に進める。
[ステップS176]流脈線計算部150は、式(12)に従いグリッド点iの座標を計算する。流体におけるすべてのグリッド点iの位置を計算することで、流体の構造情報であるベクトルM(ベクトルr,tk)を決定することができる。
[ステップS177]流脈線計算部150は、補間式(式(12))を用いて算出した係数を、メモリ102に保存する。
なお流体の処理を先に行った場合、流体側に位置が同じになる対応するグリッド点iが存在する。そのため流脈線計算部150は、ステップS176,S177の処理に代えて、ステップS167における計算結果から、グリッド点iの座標を取得し、保存する処理を行ってもよい。
[ステップS178]流脈線計算部150は、ステップS174〜S177の処理を1回行うごとにiに1を加算し、ステップS174〜S177の処理を繰り返す。流脈線計算部150は、i=NM,elemに対する計算が終了すると、時刻t=tkにおける弾性体の構造情報を求める処理を終了する。このようにして、心筋の構造情報ベクトルM(ベクトルr,tk)を求めることができる。
次に、任意の時刻tにおける血流中のグリッド座標ベクトルri(t)での速度場ベクトルvl(ベクトルrl(t),t)の計算方法について説明する。
この速度場ベクトルvl(ベクトルrl(t),t)は、流脈線上の点の時間発展をルンゲ・クッタ法で行うための式(9)、式(10)の計算に用いられる。出力データが与えられている時刻をtiとすると、ti≦t≦ti+1を満たす整数iを決定することができる。事前解析結果Ωには、各頂点の時刻tiにおけるグリッド座標ベクトルrl(ti)の値、その点での速度場ベクトルvl(ベクトルrl(ti),ti)の値、および速度場の時間微分ベクトルdv(ベクトルrl(ti),ti)/dtが保存されている。従って、速度場は時刻tiとti+1で速度場とその微分が与えられていることになる。そのため、微分まで含めて連続な曲線を補間曲線として仮定することができる。与えられた2つの時刻での速度場とその時間微分が与えられているため、式(20)のような未知変数を4つとする3次の多項式を補間曲線として用いることができる。
係数ベクトルbk,iは、二つの時刻tiとti+1において速度場ベクトルvi(t)が滑らかに連続に繋がるように決める。ξ=x,y,zとして、式(21)〜(26)を用いて係数を決定することができる。なお、以下の式において、速度の各軸方向の時間微分値を、「v’x(t)」、「v’y(t)」、「v’z(t)」のように「’」を付けて表している。
このようにして、与えられたグリッド点iにおける任意の時刻tにおける速度場を求めることができる。
次に、任意の時刻tにおける血流中の任意の座標ベクトルrでの速度場ベクトルv(ベクトルr,t)の計算方法について説明する。
いま、与えられた血流中の任意の座標ベクトルrは血流中に属するため、座標ベクトルrを含む血流の有限要素Ilを求める事ができる。有限要素Ilに属する頂点の座標をベクトルrl(t)、速度場をベクトルvl(ベクトルrl(ti),t)とすると、座標ベクトルrにおける速度場ベクトルv(ベクトルr,t)は以下の式(27)から決定することができる。
ここで、Ni(ベクトルr,t)を構造関数と呼ぶ。1次の四面体の構造関数の具体的の計算方法を以下に示す。
図19は、四面体要素の一例を示す図である。四面体要素Ilの各頂点の座標が、それぞれP1(x1,y1,z1)、P2(x2,y2,z2)、P3(x3,y3,z3)、P4(x4,y4,z4)で与えられるものとする。このとき、構造関数は式(28)で与えられる。
ここで、Vは四面体要素Ilの体積である。また、係数ai,bi,ciはi以外の3つの点が作る平面の方程式の法線ベクトルとして求めることができる。例えば、N1は点P1以外の3点P2,P3,P4が作る平面の法線ベクトルから決定できる。法線ベクトルをベクトルn1とすると、ベクトルn1=(a1,b1,c1)=ベクトル(P2P3)×ベクトル(P2P4)として計算することができる。ここで、ベクトル(P2P3)は、点P2から点P3へのベクトルである。ベクトル(P2P4)は、点P2から点P4へのベクトルである。「×」は、ベクトルの外積である。なお、法線ベクトルの向きは底面の3角形P2P3P4からみて、頂点P1の向きが正になるようにとるものとする。さらに係数diは平面の方程式aix+biy+ciz+di=0が点P2(または点P3,点P4でもよい)を通ることから決定することができる。従って、任意の点ベクトルrが四面体要素Il中の点であると、式(28)に従い構造関数の値が決定できる。そして、式(27)からその場所での速度場ベクトルv(ベクトルr,t)を計算することができる(非特許文献6参照)。
次に、ルンゲ・クッタ法による時間発展処理について詳細に説明する。
図13のステップS142,S143で任意の時刻における心筋と血流のグリッド点iの位置を求めた後、ステップS144で流脈線上の点ベクトルr(tk)の時間発展がルンゲ・クッタ法で行われる。
図20は、ルンゲ・クッタ法による時間発展処理の手順の一例を示すフローチャートである。以下、図20に示す処理を、ステップ番号に沿って説明する。
[ステップS181]流脈線計算部150は、インデックスi=1から順番に、インデックスi=1,2,3,4について、ステップS182〜S183のループ処理を繰り返し実行する。
[ステップS182]流脈線計算部150は、ベクトルr(tk)が属する血流要素番号Ilを求め、式(27)による速度ベクトルの計算をするための要素情報を取得する。
[ステップS183]流脈線計算部150は、ルンゲ・クッタ法で用いる中間の速度ベクトルvi(i=1,2,3,4)を、式(9)、式(10)で計算する。ここでベクトルviの計算には、データが与えられていない任意の時刻での流体中の任意の座標における速度場の計算も行われる。例えば、ベクトルv1は時刻tkにおける座標ベクトルr(tk)における速度場の値であるが、時刻tkは事前解析によりデータが与えられている時刻とは限らない。また、座標ベクトルrkもデータが与えられている流体中のグリッド点iの座標とは限らない。従って、任意の時刻tにおける、任意の座標ベクトルrでの速度場の計算を行うこととなる。
例えば、座標ベクトルr(tk)と時刻tkが与えられているため、前述した、任意の時刻tにおける血流中の任意の座標ベクトルrでの速度場ベクトルv(ベクトルr,t)の計算方法(式(27))により、速度場を計算することができる。なお、ベクトルv2はベクトルv1の情報を含むが、ベクトルv1が既に計算されている。そのため、前述の任意の時刻tにおける血流中のグリッド座標ベクトルri(t)での速度場ベクトルvl(ベクトルrl(t),t)の計算方法(式(20)および式(27))でも速度場を計算することができる。
[ステップS184]流脈線計算部150は、ステップS182〜S183の処理を1回行うごとにiに1を加算し、ステップS182〜S183の処理を繰り返す。流脈線計算部150は、i=4に対する計算が終了すると、すべてのベクトルvi(i=1,2,3,4)の計算が完了したこととなるため、処理をステップS185に進める。
[ステップS185]流脈線計算部150は、式(9)により、次の時刻tk+1における流脈線の座標ベクトルr(tk+1)を計算する。
次に、心臓内部での位置判定について詳細に説明する。
ここでは、時間発展の結果得られたベクトルrk+1の心臓中の位置を判定する手続きについて説明する。ルンゲ・クッタ法などの方法は有限の誤差を含むため、計算の結果得られた位置ベクトルrk+1が本来であればありえない位置になることがある。
図21は、計算の結果得られる可能性のある位置の例を示す図である。心臓40の右心系41と左心系42の内部が、解析対象の流体が存在する領域である。右心系41には、右心房や右心室が含まれる。第2の実施の形態では、左心系42には、左心房や左心室が含まれる。左心系42に繋がっている動脈43内の血流は、解析対象外である。ただし、大動脈の一部をシミュレーションに含めてもよい。
時刻t=tkで点Pkjが流体中に存在するとき、時間発展により移動したときの移動先は、図21に示すように5通りの分類が可能である。移動した点には、移動先に応じて状態変数(ステータス)が設定される。心筋壁を超えず、解析対象の流体の要素内にある場合の状態変数は「0」である。心筋壁を超え、解析対象の流体の要素外にある場合の状態変数は「1」である。心筋壁を超えず、解析対象の流体の要素外にある場合の状態変数は「2」である。心筋壁を超え、解析対象の流体の要素内にある場合の状態変数は「3」である。心筋壁を超えてはいないが、心筋と解析対象の流体の要素との境界上にある場合の状態変数は「4」である。
図22は、状態変数の真理値表を示す図である。なお、どちらの場合も移動前の点をPとし、点Pは必ず流体中に存在していると仮定し、移動後の点Qの判定のみ行うものとする。どのような状態変数になるのかは、2つの判定を行うことで分類可能である。
1つ目は対象となる点Qが流体中に存在するかどうかを判定する流体判定である。点Qが流体中に存在すればTを返し、存在しなければFを返す。
2つ目は移動元の点Pと移動後の点Qを結んだ直線PQが心筋または心筋表面と交わるかどうかを判定する直線判定である。直線PQが心筋(表面)と交わればTを返し、交わらない場合はFを返す。また直線判定では、同時に交点の個数も返す。
流脈線計算部150は、点Qが流体中に存在し、直線PQが心筋と交わらない場合は、正常に移動したものとして状態変数「0」を設定する。
点Qが流体中に存在せず、直線PQが心筋(表面)と交わる場合、点Qは(1)心筋を突き破って系外に出た場合と(2)心筋内部にめり込んだ場合との2通りが存在する。どちらも再計算をすることになるため、流脈線計算部150は、状態変数として「1」を設定する。
点Qは流体中に存在せず、線分PQが心筋(表面)と交わらない場合は、大動脈などを通してシミュレーション系外に出たものとして、流脈線計算部150は状態変数「2」を設定する。
点Qが流体中に存在しても、左心房から右心房へ移動するなどありえない移動をする場合では、流体判定はTが返るが、直線判定もTであり、交点は必ず複数になる。そのため、交点の数が2以上の場合、流脈線計算部150は状態変数「3」を設定する。
流体判定がTであり、直線判定がTの場合でも、交点数が1の場合は流体と心筋の境界面に達したとして、流脈線計算部150は状態変数「4」を設定する。
このような状態判定の処理手順を以下に示す。
図23は、心臓内部での位置判定の処理手順の一例を示すフローチャートである。以下、図23に示す処理をステップ番号に沿って説明する。
[ステップS191]流脈線計算部150は、時間発展後の座標ベクトルrk+1が流体中に存在するかどうか判定する。この処理の詳細は後述する(図24参照)。
[ステップS192]流脈線計算部150は、移動ベクトルdr=ベクトルrk+1−ベクトルrkが作る有限の長さの線分が心筋と交点を持つか判定すると共に、この線分が心筋表面と交わる交点の数を計数する。この処理の詳細は後述する(図25参照)。
[ステップS193]流脈線計算部150は、図22に示した真理値表に基づいて、状態を判定する。すなわち、ステップS191,S192の結果は、それぞれ真偽値T(真、True)、F(偽、False)の2値で返される。ステップS193の結果は0以上の整数値となる。流脈線計算部150は、真理値表を参照し、ステップS191〜S193の戻り値に対応する心臓の状態変数として、「0」〜「4」のいずれかの値を位置判定結果とする。
このようにして、位置判定が行われ、状態変数が決定される。
次に、時間発展後の位置が流体か否かの判定処理(ステップS191)について詳細に説明する。
図24は、時間発展後の位置が流体内か否かの判定処理の手順の一例を示すフローチャートである。図24の例では、座標ベクトルrk+1が流体中に存在するか判定する。以下、図24に示す処理をステップ番号に沿って説明する。
[ステップS201]流脈線計算部150は、時刻tkでの座標ベクトルrkを取得する。
[ステップS202]流脈線計算部150は、時刻tk+1での座標ベクトルrk+1を取得する。
[ステップS203]流脈線計算部150は、予測球半径の値Rを取得する。
[ステップS204]流脈線計算部150は、座標ベクトルrkを中心とした半径Rの予測球内部の要素のリスト(流体要素リストLf)を取得する。
[ステップS205]流脈線計算部150は、流体要素リストLfの要素数をsizefとする。
[ステップS206]流脈線計算部150は、結果(result)の初期値として「F(False)」を設定する。
[ステップS207]流脈線計算部150は、i=1,2,・・・,sizefまで、要素リスト内の要素Liに対してステップS208の処理を繰り返す。
[ステップS208]流脈線計算部150は、要素リスト内の要素Liに対して、要素Liが座標ベクトルrk+1を含むかどうかを判定する。座標ベクトルrk+1を含む場合、流脈線計算部150は、処理をステップS210に進める。座標ベクトルrk+1を含まない場合、流脈線計算部150は、処理をステップS209に進める。
[ステップS209]流脈線計算部150は、ステップS208の処理を1回行うごとにiに1を加算し、ステップS208の処理を繰り返す。そして流脈線計算部150は、i=sizefの処理が終了したら、時間発展後の位置が流体内か否かの判定処理を終了する。
[ステップS210]流脈線計算部150は、要素Liの要素番号IDをメモリに保存する。
[ステップS211]流脈線計算部150は、resultをTrueに変更する。
このようにして、移動先の点の座標がいずれかの要素に含まれていた場合、座標ベクトルrk+1は流体中に存在するとして戻り値がT(True)に設定される。しかし、含まれていない場合は戻り値がF(False)に設定される。
次に、予測球内部にある移動ベクトルdrが通過する弾性体要素の検索処理(ステップS192)について詳細に説明する。
図25は、移動ベクトルが作る線分と心筋の交点数の計数処理の手順の一例を示すフローチャートである。以下、図25に示す処理をステップ番号に沿って説明する。
[ステップS221]流脈線計算部150は、時刻tkでの座標ベクトルrkを取得する。
[ステップS222]流脈線計算部150は、時刻tk+1での座標ベクトルrk+1を取得する。
[ステップS223]流脈線計算部150は、取得した情報から移動ベクトルdr=ベクトルrk+1−ベクトルrkを計算する。これにより、点の移動経路を示す線分が定義される。
[ステップS224]流脈線計算部150は、予測球半径Rの値を取得する。
[ステップS225]流脈線計算部150は、予測球半径内部にある弾性体の要素リスト(弾性体要素リストLe)を作成する。
[ステップS226]流脈線計算部150は、弾性体の要素リストLeの要素数をsizeeとする。
[ステップS227]流脈線計算部150は、結果(result)の初期値として「F(False)」に設定する。
[ステップS228]流脈線計算部150は、i=1,2,・・・,sizeeまで、要素リストLe内の要素に対してステップS229のループ処理を繰り返す。
[ステップS229]流脈線計算部150は、i番目の要素Liが移動ベクトルdrと交わるか否かを判断する。要素Liは多面体であるため、流脈線計算部150は、要素Liに含まれるすべての面に対して移動ベクトルdrと交点を求める。要素内のすべての面に対して、交点が1点も存在しなければ、流脈線計算部150は、その要素とは交わらないと判定する。交わらない場合、流脈線計算部150は、処理をステップS230に進める。交わる場合、流脈線計算部150は、処理をステップS231に進める。
[ステップS230]流脈線計算部150は、ステップS229の処理を1回行うごとにiに1を加算し、ステップS229の処理を繰り返す。そして流脈線計算部150は、i=sizeeの処理が終了したら、移動ベクトルdrが通過する弾性体要素の検索処理を終了する。
[ステップS231]流脈線計算部150は、要素Liの要素番号IDをメモリに保存する。
[ステップS232]流脈線計算部150は、線分を示すベクトルdrと心筋表面との交点数Z(Zは1以上の整数)を求め、メモリ102に保存する。
[ステップS233]流脈線計算部150は、resultをTrueに変更する。
このようにして、交点が1点も存在しない場合、交わらないとしてFが返され、交点が1点以上存在する場合、交わるとしてTが返される。交わる場合は交点を持つ要素の番号と、心筋表面との交点数Zが保存される。
以上の処理により、点の移動先の状態を適切に判定することができる。この際、移動先の判定対象として予測球内の要素を対象とすることで、処理を効率化することができる。以下、予測球半径Rの決定方法について詳細に説明する。
流脈線計算部150は、予測球は時間発展前の座標ベクトルrkが時間刻み幅Δtの間にどれだけの距離を動くことができるかに基づいて決定する。4次のルンゲ・クッタ法の場合、式(9)から次の不等式が成立する。
従って、半径Rを
と定義すれば、半径Rは流脈線上の点Pが時間Δtに進む最大距離を表す。そして、時間Δt後にも点Pは必ずこの球内部に存在する。また、中間ベクトルviも同様にして、半径Rの球内部の点であることを次のようにして示すことができる。すなわち式(9)において、I=1の場合を例にとると、
が成立する。そのため、中間ベクトルが指し示す座標も半径Rの球内部の点になるのである。同様のことを式(9)のI=2,3,4について行えば、すべての中間ベクトルvIも同様にして、半径Rの球内部の点であることが分かる。このような半径Rを予測球半径とする。流脈線計算部150は、予測球半径を設定するため流体の速度場から最大値を求める。そのために以下のようにして求める。
速度場は式(20)に従って、3次の多項式で補間されている。そのことから、各グリッド点iにおける速度場の区間[ti,ti+1]における最大値を数値的に求めることができる。得られた各グリッド点iにおける速度場の最大値の中からさらに最大値を選ぶことによって、この二つの時刻の中での速度場のノルム最大の点を最大速度|ベクトルvmax|として設定することができる。この処理はデータセットに対して1回だけ実行すればよいため、事前解析結果Ωとして保存すれば、二度目以降の処理は行わなくてよい。その後、ルンゲ・クッタ法の時間刻み幅Δtを設定すると、最大移動距離はR=|Δtベクトルvmax|として定まる。
しかし、このように定めた予測球半径Rは時間刻み幅Δtが小さくなりすぎると、グリッドの幅(隣接するグリッド点間の距離)より小さくなってしまう。そのため、グリッド点iの離散化に伴う最小値Rminが存在する。例えば、このRminは経験的な最小値として初期値をRmin=0.001[m]に設定する。グリッドの統計分析から最小値を求めることも可能である。
予測球の半径Rが、このようにして求めたRminより小さくなった場合、予測球の半径はR=Rminとして、予測球内部に要素が一つも存在しない状況を回避することができる。以上のような予測球半径Rの決定処理を整理すると、図26のような手順となる。
図26は、予測球半径の決定処理の手順の一例を示すフローチャートである。以下、図26に示す処理をステップ番号に沿って説明する。
[ステップS241]流脈線計算部150は、要素の辺の長さと速度場の統計解析から予測球半径の最小値Rminを決定する。
[ステップS242]流脈線計算部150は、時刻tiでの速度ベクトルviの値を取得する。
[ステップS243]流脈線計算部150は、時刻tiでの速度の最大値|ベクトルvi,max|を取得する。
[ステップS244]流脈線計算部150は、時刻ti+1での速度の最大値|ベクトルvi+1,max|を取得する。
[ステップS245]流脈線計算部150は、|ベクトルvi,max|が|ベクトルvi+1,max|以上かどうかを判断する。流脈線計算部150は、|ベクトルvi,max|が|ベクトルvi+1,max|以上であれば、処理をステップS246に進める。流脈線計算部150は、|ベクトルvi,max|が|ベクトルvi+1,max|未満であれば、処理をステップS247に進める。
[ステップS246]流脈線計算部150は、|ベクトルvi,max|を|ベクトルvmax|に設定する。流脈線計算部150は、その後、処理をステップS248に進める。
[ステップS247]流脈線計算部150は、|ベクトルvi+1,max|を|ベクトルvmax|に設定する。流脈線計算部150は、その後、処理をステップS248に進める。
[ステップS248]流脈線計算部150は、ルンゲ・クッタ法の時間刻み幅dtを取得する。
[ステップS249]流脈線計算部150は、|ベクトルvmax|dtを計算し、計算結果を予測球半径Rに設定する。
[ステップS250]流脈線計算部150は、予測球半径Rが、予測球半径の最小値Rminより小さいか否かを判断する。流脈線計算部150は、予測球半径Rが最小値Rminより小さい場合、処理をステップS251に進める。流脈線計算部150は、予測球半径Rが最小値Rmin以上の場合、予測球半径決定処理を終了する。
[ステップS251]流脈線計算部150は、最小値Rminを予測球半径Rに設定する。その後、流脈線計算部150は、予測球半径決定処理を終了する。
以上のような処理により、適切な予測球半径Rを決定することができる。
なお、第2の実施の形態では、以下のような処理によって、処理の高速化を図ることができる。
[分割法による計算の高精度化と高速化]
図12のステップS137では、出力ファイルが与えられた時間ti≦t≦ti+1の時間分割をさらにNdiv分割している。この分割の仕方について詳細に説明する。
流脈線の計算では一回の流脈線上の点が関与する要素は全体のごく一部である。そのため、記憶容量削減と計算時間の短縮のため予測球を用いる。従って、流脈線の計算コストは予測球半径R3に比例して増大する。このことは、以下のように説明できる。
計算対象となる要素の数Nelemは、空間的な要素数の密度を座標ベクトルrの関数としてρ(ベクトルr)とすると、以下の式で与えられる。
密度ρ(ベクトルr)がおおよそ一様であると仮定すれば、ρ(ベクトルr)=ρ0となる。そのため、Nelem∝R3となる。
ここで時間ti≦t≦ti+1をNdiv分割することを考える。Ndiv分割すると、ルンゲ・クッタ法による時間発展回数はNdiv回となる。一方で、予測球半径は式(30)から決定される。そのため、時間刻み幅がNdiv分の1になると、予測球半径もNdiv分の1になる。1回の計算量は、予測球半径R3に比例するため、Ndiv -3になる。この計算をNdiv回繰り返すため、合計の計算量はNdiv -2になる。この計算の概要を模式化したのが図27である。
図27は、時間分割による計算量削減の概念を示す図である。図27では、点Pの移動先となる点Qを計算する場合を想定している。時間分割せずに時間刻み幅を長くすると、点Pを中心とする大きな予測球45内を解析することとなるが、時間分割を行い、時間刻み幅を短くすると、点Pにある粒子の移動可能範囲が狭まる。そのため、予測球45よりも小さな予測球46内を解析すればよい。すなわち、大きな予測球45に対して1回計算をするより、時間をNdiv分割して、経路を細分化したほうが予測球46が小さくなる。その結果、計算対象になる要素数を減らせ、計算量を削減できることが分かる。
図28は、時間分割数に応じた合計計算時間の変化の一例を示す図である。図28のグラフは、横軸が分割数Ndivであり、縦軸が計算時間である。理論上の計算時間51の遷移を破線で示し、実際の計算時間52の遷移を実線で示している。実際の計算時間52は、時間ti≦t≦ti+1のトータルの計算時間を測定したものである。Ndiv=0の時は、予測球を使用せず、そのまま全部の要素を計算対象とした場合にかかった時間である。
理論上は分割数Ndivが多くなるほど計算時間は短くなる。しかし、実際には、分割数を多くしすぎると、予測球内の要素のリスト作成など、分割後の単位時間当たり1回ずつ行われる処理の回数が増えてしまい、処理時間が増加に転じる。そのため、分割数Ndivには最適値が存在する。分割数Ndivの最適値は、例えば流脈線の計算を始める前にNdivを変えながら、対象となる系に対して予め測定しておく。
[統計分析による予測球半径の最小値の決定法]
流体シミュレーションは有限個の離散点情報で行われる。従って、予測球半径を小さくしすぎると予測球内部に離散点情報が含まれない状況が生じうる。これは予測球半径に下限値が存在することを意味する。同時に、予測球半径は式(30)から決定されるため、時間刻み幅にも下限値が存在する。予測球を用いた計算では、予測球半径の下限値Rminを設定し、その予測球半径が下限値以下の場合になるときは、Rminを予測球半径として設定する。なお、予測球の下限値以下になった時に、それより大きな値であるRminを使用するので、流脈線上の点が予測球外部に出てしまうことはない。このように、計算を安定に進めるためにRminの決定は重要である。また、Rminの値は時間分割数Ndivの決定にも関与する。Rminの値が定まれば、R0=|Δtベクトルvmax|が最大移動距離であるため、天井関数を使って以下の式で分割数Ndivを決定できる。
分割数Ndivの値は計算速度と計算精度に関わるため、Rminの決定は計算速度と計算精度の面でも重要である。
しかし、下限値Rminの決め方には工夫がいる。具体的には、確率モデルを導入し、流脈線計算部150は、計算実行時に失敗することを許容した投機的な計算を行う。計算に失敗したときには計算が確実に成功するパラメータで計算を実行し、その計算にかかる時間がペナルティとしてかかると考える。そして、ペナルティまで含めて統計的に計算時間を最小にするように下限値Rminを決定する。詳細を以下に記す。
流脈線計算部150は、初めにペナルティとして用いる最悪値としての半径Rwを決める。これはシミュレーションに用いられた要素の辺の長さの最長のものを設定する。
図29は、要素の辺の長さの分布の一例を示す図である。図29のグラフは、横軸が要素の辺の長さであり、縦軸が、辺の長さごとの該当する辺の存在確率を示す確率密度である。グラフ中には、2種類の心臓シミュレーション#1,#2における確率密度関数61,62を破線で示している。
図29の例では、シミュレーションに使用された要素の一部が非常に粗く、最長で0.008[m]にも達する。そのため、そのまま計算に用いてしまうと分割数Ndivも小さくなり、速度が遅くなる。しかし、殆どの計算は最長の長さでなくても計算できる。
最悪値としての半径Rwの決定後、流脈線計算部150は、計算に使用する下限値Rminを決定する。この際、流脈線計算部150は、統計的な計算コストを、計算の失敗を前提として計算する。そして、流脈線計算部150は、投機的な実行を考慮に入れ、失敗した時のペナルティまで含めて計算量が最小になるような半径を、下限値Rminとして選択する。これは、仮定する確率モデルに極端に依存する話であるが、簡単な例を用いて説明する。まず、流脈線上の点は、すべての要素が等確率で解析対象になると仮定する。すると、図29の確率密度関数61,62に従って、計算が成功する。
今、半径Rで計算時間がTだけかかるとする。この計算量はR3に比例する。また半径をβR(0<β≦1)に縮小することで、計算はp[%]の確率で成功するものとする。計算が成功する場合とは、点の移動先が半径βRの予測球内にある場合である。計算に失敗した場合、半径Rで再計算する。この場合、ペナルティまで含めた計算時間T’は、
となる。
図30は、予測球半径に応じた計算コストの変化を示す図である。図30の縦軸が計算コスト(T’/T)であり、横軸が予測球半径Rである。図30に示すように、R=0.003[m]付近でペナルティまで含めたコストが最悪値半径Rmax=0.008[m]と比べて約10%まで落ちることがわかる。そして、ペナルティまで含めて統計的に最小の計算量で済む半径が存在することがわかる。実際には、有限回の計算であるため、すべての要素を等確率に解析対象とするという状態にはならない。そのため、これよりも半径の値は小さくなる。
この場合、最適な予測球半径Rが存在することは示せるが、最適値自体は過大評価される傾向がある。そこで、過大評価を抑えることを目的とし、各離散点における速度場のノルムを求め、これに時間刻み幅をかけて移動距離の分布を出すと図31のようになる。
図31は、移動距離の確率分布を示す図である。図31では、横軸が移動距離、縦軸が発生数を示している。同じ形状、同じ大きさの4面体があったとしても、4面体上での速度場の大きさが2倍違えば、対象となる4面体を通過する時間は半分になる。そこで、移動距離の分布から式(33)を用いて予測球半径Rの関数としてペナルティまで含めた計算効率性を図示したのが図32である。
図32は、確率分布を仮定した時の計算効率化曲線を示す図である。図32では、横軸が予測球半径R、縦軸が計算効率である。計算効率は、値が小さいほど効率がよいことを示す。図32から計算効率が最もよい予測球半径Rを求めると、0.0012[m]〜0.0016[m]程度になる。これは経験的な最適値Rmin=0.0015±0.0005[m]のモデル論的な裏付けである。
以上のようにして、予測球半径Rの最適値を求めることができる。すなわち、離散点が予測球の外部に出てしまう場合の再計算のペナルティを考慮した、最も効率的な予測球半径Rを設定することができる。その結果、流脈線の計算効率が向上する。
[具体的な計算例]
以下、心臓シミュレータによる心筋と冠循環の解析を用いて、流脈線を実際に計算した場合の計算速度について具体的に説明する。
初めに計算に用いたデータについて説明する。シミュレーション結果は心臓の拍動1周期分が出力されており、0.01[sec]ごとに100個の心臓の状態のデータが出力されている。心臓の拍動により速度場は時間依存して変化するため、速度場は非定常流である。また、心筋も拍動のため拡張と収縮を繰り返す。従って、心筋面も動き、移動境界が問題になる。この系において心臓中の血流の輸送を記述するため、心臓中の複数の点に粒子発生装置を配置し、流脈線を計算する。
可視化装置100に外部から心筋と流体の情報を読み込ませる。この際、可視化装置100に、流脈線の本数Mと計算回数Nを入力する。また可視化装置100に対して、心臓中の左心室と右心房を流脈線の発生源とするように、発生源の位置を入力する。発生源の配置指示に従い、例えば可視化装置100は、半径0.05[m]の球内部の流体部分からランダムに20個ずつ、流脈線の発生源を配置したものとする。また、計算回数は0.3拍分の30回とする。なお、時間発展計算は4次のオーダのルンゲ・クッタ法で行った。
以上のような初期条件を設定し、可視化装置100が流脈線計算を開始する。開始後、ステップ毎に粒子発生源から粒子が発生する。それぞれの粒子の時間Δt=0.01[sec]後の位置は図9に示した流脈線計算のフローチャートに従って、計算される。計算された流脈線は、モニタ21に表示される。
図33は、流脈線の表示例を示す図である。図33の例では、心臓70の断面の画像の上に重ねて、複数の流脈線71が表示されている。
流脈線の計算では、計算量の削減のため、および計算精度の向上のため、予測球が使用されている。予測球を使った計算では、時間刻み幅Δt=0.01[sec]をさらにNdiv分割して細分化した。Ndivの値は、統計的に計算量が最小になるように自動的に最適値が決定される。このシミュレーション結果の場合、Ndivの値はNdiv=3〜7程度に設定された。
Ndivの最適化による計算速度を定量的に測定した結果は、図28に示した通りである。図28の例では、予測球を使用した場合の効果を示すため、予測球を使用しない場合の流脈線の計算時間も計測している。Ndiv=0のときが、予測球を使用しない場合、すなわちそのまま全部の要素を計算対象とした場合にかかった時間である。
予測球を使った場合(Ndiv=1)の時、つまり、実質上時間分割をしない場合は予測球の構築などに時間がかかる。そのため、予測球を使用しない場合よりも時間がかかる(約1.47倍)。しかし、Ndiv=2とすると、予測球の構築にかかる固定コストよりも、Ndiv -2に比例する計算コスト減少量の方が大きくなる。そのため、計算時間は予測球を使用しない場合と比べても約22.9%まで減少する。Ndivを増やしていくと、計算時間は短くなっていくが、予測球を構築するための固定コストがあるため、性能向上に上限値が存在することが分かる。図28の例では、Ndiv=4が最良である。そして、分割数Ndivを増やして行くと、固定コストの効果が上回り、計算時間は増大に転じる。Ndiv=10では最良のケースと比べて性能が約53%程度まで悪化している。
このように分割数Ndivには最適値が存在するが、実際の計算では流脈線の計算を始める前に最良の分割数が決定されている。また、図28の計算では、グリッド点数が高々50,000点程度であるため、予測球を使わなかった場合の方が、予測球を使いNdiv=1の場合よりも計算時間は短い。しかし、シミュレーション系が大規模になれば、予測球を使わない場合は計算量がグリッド点に比例して増えていく。例えば、グリッド数が10倍になれば、時間も10倍かかる。しかし、予測球を使用した場合、予測球半径Rは速度の最大値と時間刻みだけから決まり、常に一定になるため、計算量も一定になる。このため、シミュレーションを行う系が大きくなるほど、予測球を使用する効果は大きくなる。
さらに、予測球による時間分割のもう一つの効果について述べる。それは精度向上である。4次のルンゲ・クッタ法の場合、式(9)〜式(10)で与えられるが、誤差のオーダはO(Δt4)で与えられることが知られている。そのため、時間をNdiv分割すると、1回のルンゲ・クッタ演算での誤差はNdiv -4倍になる。時間ti≦t≦ti+1まで合計Ndiv回のルンゲ・クッタ法の計算をして、誤差がNdiv倍だけ累積しても、合計の誤差はNdiv -3に留まる。Ndiv=4ならば、1/64倍になる。
図34は、時間刻み幅を変えたときの軌跡の精度の変化を示す図である。図34では、横軸がシミュレーション上の時間、縦軸が離散点のx座標である。図34の例では、時間刻み幅Δtを「0.01」、「0.05」、「0.001」、「0.0001」としたときの、特定の離散点のx座標の時間変化(軌跡)を表している。
積分後の座標変化量が小さい場合、もしくは積分回数が少ない場合においては、時間刻み幅が大きい場合でも軌跡はほとんど変わらない。しかし、積分回数が大きくなった領域(時刻t>2.5[sec])では時間刻み幅Δt=0.01[sec]の場合の軌跡は、Δt=0.001[sec],0.0001[sec]の軌跡と比べて大幅にずれてしまっている。反対にΔt=0.001[sec]の軌跡とΔt=0.0001[sec]の軌跡はよい一致を見せている。このことから、時間刻み幅を小さくすることで、計算誤差の累積を防ぐことができることがわかる。
このように、分割数Ndivの決定は計算速度の面でも、計算精度の面でも重要である。そして、分割数Ndivは予測球半径の最小値Rminに依存して決まる。実際の計算では図31のような速度場と要素の辺の長さの両方を考慮した確率モデルを仮定し、確率分布を計算する。そして、その確率分布から式(33)を用いて計算効率を求め、最良の計算効率を与えるRminを求める。これは図32に示すように、最小値が存在し、その値はおおよそRmin=0.0015±0.0005[m]程度として与えられる。そして、常に最小の計算コストで計算を実行することができる。
次に計算の安定性について述べる。第2の実施の形態では、速度場は、ALEによるグリッド座標の運動による補正を取り入れ、式(4)で計算する。
図35は、ALEグリッド点の運動補正を加えた速度場の例を示す図である。図35には、速度場の評価を線形補間で行った場合の速度変化(点線)と、式(4)でALEグリッド座標自身の運動により生じた見かけの力の補正を入れた場合の速度変化(実線)との計算結果を示している。
線形補間近似が非常に良い結果を与えるときもあるが、速度場が時間に関して急激に変化する領域([0.03≦t≦0.1])では速度場の評価に線形近似を用いると、速度場の評価精度が悪くなる。速度場の評価精度が悪い領域では、数値誤差が大きくなるため、流脈線の計算時に流脈線が心筋に入り込む原因になる。これを模式的に示したのが図36である。
図36は、計算精度向上による流脈線の心筋へのめり込み抑止効果を示す図である。心臓の収縮期に心筋に近い場所に流脈線が存在した場合、その付近の流脈線上の点は心筋の移動方向へ運動する。
速度場の計算精度が低いと、速度場が過小評価され、流脈線上の点の速度が、正しい値より小さくなる場合がある。心筋に近い場所の流脈線上の点の速度が過小に算出され、心筋の収縮速度より小さくなると、心筋が流脈線上の点を追い越してしまう。その結果、流脈線が心筋の中に入り込むような挙動になる。一旦、流脈線上の点が心筋にめり込んでしまうと、心筋上では流体の速度場が定義されないので、計算不能に陥る。
このような事態を避けるため、第2の実施の形態では、速度場の計算時に、ALEグリッド座標の運動を式(4)に従い補正として取り入れている。これにより、速度場の計算精度が上がり、心筋に近い場所の流脈線上の点の速度が、心筋の収縮速度より小さな値となり、心筋が流脈線上の点を追い越してしまうような状況の発生が抑止される。その結果、流脈線が心筋の中に入り込むような事態が回避できる。
このようにグリッド点自身の加速度運動に起因する見かけの力を補正することで、流脈線計算装置の計算の安定性が向上する。
〔その他の実施の形態〕
流脈線上の各点はお互いに相互作用せず、独立である。そのため、並列化に適している。そこでMPI(Message Passing Interface)やOpenMP(Multi-Processing)を用いて流脈線の計算を並列化させてもよい。これにより計算速度を向上させることができる。
また第2の実施の形態では、心臓シミュレーションの結果を用いて、血流の流脈線を可視化する例を示したが、他の流体シミュレーションの結果に対しても適用できる。例えば自動車のリアに可変ウィング機構がついている場合に、可変ウィング稼働時の周囲の空気の流れをシミュレーションによって解析することも考えられる。第2の実施の形態に示す可視化装置100を用いれば、可変ウィング稼働時の周囲の空気の流れを流脈線で可視化することができる。また、可変翼を有する航空機における翼の変形過程での周囲の空気の流れを示す流体シミュレーション結果についても、同様に適用できる。