Dragonfly 4.1 (CT segmentation software) で ROI を使って部位を取り除く

Help の ROI Properties and Settings には、

ROI highlighted in clipped rendering (left), ROI extracted by increasing the ROI opacity and decreasing the opacity of the dataset (middle), ROI subtracted by setting the ROI opacity to 0 and Dataset opacity to 100%.

と書いてあるが、実際には Highlight も 0 にしないと subtraction はされない。つまり、

  • Highlight: 0
  • ROI: 0
  • Dataset: 100

が正解。まぁいろいろやればわかるだろって話かもしれないが…

Dell Precision 5820 に m.2 NVMe SSD をインストールするには(2019-10現在)

まえがき

結局面倒すぎるので諦めたんだけど、調べたので一応メモしておく。

日本語でいいならこのPDFがめちゃくちゃわかりやすい: https://i.dell.com/sites/csdocuments/Merchandizing_Docs/ja/dell_precision_expansionguide_2019june.pdf

英語はこのページがヒットする: https://www.dell.com/support/article/uk/en/ukbsdt1/sln312251/upgrading-storage-in-the-dell-precision-5820-7820-7920-tower-workstations?lang=en が、なぜか上記の日本語PDFよりはるかに分かりづらいし、ズームカードの記述がない。

reddit も少し参考になった(マニュアルのあたり。他のところでちょっと正しくなさそうな記述もある): Precision 5820 tower -- NVMe confusion : Dell

方法

2種類の方法がある。

  1. PCIe アダプタ(ズームカード)を使う方法
    • カードに m.2 SSD をマウントし、このカードを PCIe スロットに刺す。
    • カードはこれ https://www.amazon.com/dp/B0714MMD6M らしい。日本語PDFマニュアルによると型番は 414-BBBQ(2枚)と 414-BBBK(4枚)らしいが、これらの型番は他の場所で全く出てこないのが謎。
  2. Front bay を使う方法
    • 4つある front bay のうち上の2つを換装できるらしい
    • 575-BBSH と 750-ABDF という2つのキットが必要。めんどくさそうすぎる。しかも、Dell Precision 5820 Tower Owner's Manual によると、Core i9 を選んだ場合(僕らがそう)にはたったの 1x 1TB しかインストールできないとか…。せめて 1x 2TB は欲しかった。

しかしこれらの追加キットは本体と別に後で買えるのかがわからない。買えるのかもしれないが、DELLにきかないといけないし、高そう。DELL的には購入時点でBTOしとけや、ってことなんだろうが、割高だろうし、そうでなくとも今回は予算の関係でPCとして使える金額には上限があった。

というわけで、個人的にはもう面倒だし、m.2 というか NVMe というか PCIe の SSD は諦めて、ふつうの SATA/AHCISSD にした…。

Export time series of STL files (for mesh, Q-isosurface) in ANSYS CFD-Post by script (playing session file)

Overview

I'm still learning, but it seems that basically what you need to do for writing a script for CFD-Post are:

  1. Record the session
  2. Modify the session file (e.g., adding the for loop)
  3. Play the modified session file

So I did the recording, then modified that session file thanks to ( http://www.cfdresearch.com/ansys-fluent-cfd-post-scripts/ ). Basically simply adding the for loop.

Not sure of the syntax yet, but it seems the variable can be specified with $ prefix, as in shell script.

Sample

Let's say you have a time series of the result file (e.g., flapping wing) and you want to same some of them as STL file.

In the sample below, the you're saving 100 time instances as 1.stl, 2.stl, ... for each directory, where actual timestep values for Fluent simulation are 10, 20, 30, ... so the timestep has to be specifed as $i*10.

Here you're saving wing surface and Q-isosurface, both of them had to be created before playing the script.

# Session file started:  2019/10/04 16:21:36
# CFX-19.1

# To avoid unnecessary file pre-processing and modifications, include
# COMMAND FILE at the top of your session file.
# If it is not included, the file is assumed to be older and will be
# modified for backward compatibility.
COMMAND FILE:
  CFX Post Version = 19.1
END

! for ($i=1; $i <= 100; $i=$i+1) {

> load timestep=$i*10

EXPORT:
  ANSYS Export Data = Element Heat Flux
  ANSYS File Format = ANSYS
  ANSYS Reference Temperature = 0.0 [K]
  ANSYS Specify Reference Temperature = Off
  ANSYS Supplemental HTC = 0.0 [W m^-2 K^-1]
  Additional Variable List =
  BC Profile Type = Inlet Velocity
  Export Connectivity = Off
  Export Coord Frame = Global
  Export File = E:/wing_surface/$i.stl
  Export Geometry = On
  Export Location Aliases =
  Export Node Numbers = Off
  Export Null Data = On
  Export Type = STL
  Export Units System = Current
  Export Variable Type = Current
  External Export Data = None
  Include File Information = Off
  Include Header = On
  Location = back
  Location List = wing_surf
  Null Token = null
  Overwrite = On
  Precision = 8
  Separator = ", "
  Spatial Variables = X,Y,Z
  Variable List =
  Vector Brackets = ()
  Vector Display = Scalar
END
>export

EXPORT:
  ANSYS Export Data = Element Heat Flux
  ANSYS File Format = ANSYS
  ANSYS Reference Temperature = 0.0 [K]
  ANSYS Specify Reference Temperature = Off
  ANSYS Supplemental HTC = 0.0 [W m^-2 K^-1]
  Additional Variable List =
  BC Profile Type = Inlet Velocity
  Export Connectivity = Off
  Export Coord Frame = Global
  Export File = E:/Q/$i.stl
  Export Geometry = On
  Export Location Aliases =
  Export Node Numbers = Off
  Export Null Data = On
  Export Type = STL
  Export Units System = Current
  Export Variable Type = Current
  External Export Data = None
  Include File Information = Off
  Include Header = On
  Location = back
  Location List = /VORTEX CORE REGION:Q
  Null Token = null
  Overwrite = On
  Precision = 8
  Separator = ", "
  Spatial Variables = X,Y,Z
  Variable List =
  Vector Brackets = ()
  Vector Display = Scalar
END
>export

!}

論文読み: Thermodynamics of the bladderwort feeding strike—suction power from elastic energy storage

概要

論文

Thermodynamics of the bladderwort feeding strike—suction power from elastic energy storage | Integrative and Comparative Biology | Oxford Academic

発端など

全然わからんと言われると(けど自分では大体わかりそうとなると)解説したくなる。なにより内容的にも面白そうだし、last author が僕が修士か博士学生のときにボス・他の学生と共同研究をしていた Ulrike(ユリーク、に近い音)だったこともあって読んでみた。彼女の滞在中に、Ragtag という古着屋に行きたいというので案内したのは未だに覚えている*1

内容説明

先に言っとくと数式のとこは読んでません。アブストに Navier-Stokes とあるけど CFD をやってるとかではなく理論解析的なことをしてるみたい。

エネルギ変換パス

Figure 2 を見るとわかりやすいのだが、エネルギ変換は以下のようなパスを辿っている:

  • bladderwort(タヌキモという植物、獲物を吸い込むらしい):
    • 化学エネルギ(筋肉相当のやつ…?) → 弾性エネルギ(壁を変形させる loading phase)+熱(変形の際にわずかだろうけど熱になる)
      • 弾性エネルギ → 運動エネルギ(獲物を吸い込む水流を生み出す unloading/suction phase) + 粘性散逸による熱
  • largemouth bass(オオクチバスという魚):
    • 化学エネルギ(筋肉だと思う) → 運動エネルギ(獲物を吸い込む水流)+ 粘性散逸による熱

で、このオオクチバス自体なのかはわからないけど(読み込んでないので)、タヌキモとサイズの近い魚の larva(生後すぐの…稚魚?)と比較した場合、タヌキモの瞬間的な suction の方が、larva の suction feeding よりも効率がいいらしい。つまり、このエネルギ変換における、最初に投入した化学エネルギに対して最終的に有効に使える運動エネルギの割合が大きい(熱の割合が小さい)場合に効率が良い、ということ。どれくらい違うかというと、タヌキモでは17%が粘性散逸によるロスである一方、fish larva では 60% にもなるらしい。なお、この17%というのは、ちゃんと読んでないのでわからないけど、たぶん「化学エネルギ→弾性エネルギ+熱」のときの熱ではなくて、「弾性エネルギ→運動エネルギ+熱」の方だけの話だと思う。前者の熱は遥かに小さいんじゃないかな。ローディングは30分から10時間もかけてゆっくりやるらしい。と思ったけど…いや時間の問題じゃないか。移動量が小さいことの方が本質かな?なんにせよ、この壁面変形はたぶんかなり小さくて、ほとんど流れは起きないんじゃないだろうか。すいませんちゃんと読んでないし先行研究とかも全然見てないのでこの辺はアヤシイ…

PIV実験の手法説明

んで、この論文のメインパートは、この 17% という粘性(熱)へのロスを求めるところ、っぽい。実験部分だけざっと読んだので少し内容を説明してみる。

PIV (particle image velocimetry) という、流体中に浮かべた小さな粒子の運動を撮影して、流れの速度分布を求める手法を使っている*2。まず実物のタヌキモを使ってこの PIV をしているが、動きが 0.1 から 1 ミリセカンドで終了するらしく、速すぎるので、50,000 fps (frames per second) つまり1秒間に5万コマもの超高速で撮影しており、そのため解像度が 320x280 ピクセルに制限されている。このため時間・空間解像度が非常に小さく精密な計算には耐えないことから、このPIV結果自体を直接使用して解析するのではなく、かわりに、この結果をもとにして、拡大模型によるメカニカルシミュレーション(これもまたPIVだがもっとゆっくりでピクセル数も多い)を行い、そちらをエネルギ変換の計算に使っているようだ。

拡大模型を作る際には、スケールが違っても流れの様相が相似であることを保証するために、流れ場の相似則を満たす必要がある。それにはまず、形状が相似であることが必要だ。その上で、流れに関係する無次元数を一致させることが必要。今の場合は Reynolds 数(記号 Re)だけを一致させている*3。直径が 96 μm, 移動距離が 160 μm という微少なシリンジと思えばよいらしいのだが、この微小距離を 5.2 m/s という高速(最大速度)で移動するため、Re はこのサイズにしては意外と低くない 500 になるという。Re は Re = 長さx速度/動粘性係数で定義される。動粘性係数は粘性係数/密度なのである温度では定数だ。Re を求めるには速度と長さの選び方に任意性があるのだが、今回は直径を代表長さにしているようだ (Re = 5.2 * 96e-6/1e-6 = 499.2、ただし水の動粘性係数 1e-6 m^2/s はよく使われるざっくりした値)。さて、拡大模型は直径が大きいので、その分だけ速度をゆっくりにできる。一方で動粘性係数が水より70倍くらい大きな流体(鉱物油)を使っているため、速度はその分は速くすることにはなる(あるいは直径をもっと大きくするというか)*4。結果的に、直径は 32 mm と約320倍に、速度は1.09 m/sと1/5近くなっている。これにより滞在時間的には1470倍とかなり長くなる *5 ので、撮影的にも楽になる…といっても 1000 fps だけど。しかしこれによってピクセル数が増やせる(書いてないけどたぶん最大の 1280x800 だと思う)。

で、このあとは数式が並んでエネルギ変換効率の計算をしてるようだ。ここでは実物のタヌキモの容積計測値と、メカニカルシミュレーションによる流れの計測結果を使っているようだ。詳細は読んでません。

なぜ魚より効率がいいのかの推測

どうも Discussion みてもはっきりと書いてないんだけど、たぶん魚の方が(筋肉を使うしかないから)流れの吸い込み速度が遅くて、Re が低くて、つまり粘性散逸の割合が高い、ってことじゃないのかな?なんでこれをもっとハッキリくっきりわかりやすく書かないのかはちょっと謎。なぜかっていうと Ulrike は昔 Science の assistant editor かなんかをしてたくらいの経験があって論文のストーリの書き方にめちゃくちゃ気を使うので。むかし共著で Nature に出た swift の論文 *6 を書いたときの話を教えてくれたんだけど、最初のころの原稿はいかにもエンジニアーって感じの書き方・図だったのを彼女が相当ガシガシ手を入れて直したらしい。というわけで僕が読み飛ばして見落としてるだけで、そのあたりの議論はちゃんと書いてあるのかも。

拡大模型の妥当性

拡大模型の形状、相似じゃないよねこれ。そのことが本物の流れ場と拡大模型内の流れ場とに差異を生んでいることは確実で、あとはそれが無視できる程度なのか、重要なのか、というところの評価(少なくとも推測)が必要なのだけど、この論文自体には実物の流れ場の図が全く載っていなくて、定性的には判断のしようがない(数字で書いてるかもしれないが、そこまでは読み込んでない)。んでよく見ると "The particle tracking procedure and analysis is described in greater detail in Berg et al. (in press)." ってあるんだよね… どうやら実物の流れ場についてはこの別論文に書いてあるようだ。

*1:僕にはとても手が出ない値段だなーと思ってそれを言ったら、「長く使うんだからいいものに多少お金使うのはありでしょ」って言われた気がする。たしかにアリだ。高いと言っても古着なわけではあるし。あ、いま調べたら千葉店は閉店していた… https://twitter.com/ragtagshop/status/476179978724597760

*2:レーザシートで薄い板上の範囲のみを光らせることが多い。粒子としては空気中ではオリーブオイルや化学合成油の小さな液滴使われる。水中では(中性浮力に調整した)プラスチックの(?)粒子や気泡などが使われるようだ。

*3:タイトルで熱力学と言ってるわりに、別に熱力学というか熱流体関係の無次元数(めっちゃたくさんある)には気を使ってはいないみたいだった…いやたぶん大丈夫なんだと思うんだけど。

*4:この実験で鉱物油を使った理由は、どうもPIVのための都合のようだ。容器と密度が?近いので外からの撮影がしやすいとある。また可視化のための泡が留まりやすいとかもあるのかも…?

*5:この計算は、320 * 0.96 * 5.2/1.09 = 1465.5 かな?

*6: How swifts control their glide performance with morphing wings | Nature

Rhinoceors 3D: Python script で「表示中のすべてのオブジェクトそれぞれに対してコマンドを実行」する

環境

Rhino 6 on Windows 10 Pro/Enterprise. だけど PythonScript は Mac でも動くらしい(RhinoScript は Win でしか動かないらしい)。

解きたい問題

現在画面に表示させているすべてのオブジェクト(今の場合は球だった)の体積中心に点を打ちたい、という状況があった。マウスクリックで球を選択してから VolumeCentroid を実行し、次の球を選択したら space キー(直前のコマンドの redo)、というのを延々と繰り返せばいいのだが、600個くらいあってちょっと手作業が嫌になった。こんな簡単な作業、スクリプトでできないはずがない、と思い、初めてスクリプトを使ってみようと思い立った。

参考リンク

主に以下を参考にした:

Developer とあるのでちょっと勘違いしていたが、スクリプトを使いたいユーザ向けでもあるよなこれ…

手順

まず Rhino のメニューから Tools > PythonScript > Edit... を選択しエディタを起動する。そこにスクリプトを書いて、エディタのツールバーにある緑の三角で実行。

スクリプト

import rhinoscriptsyntax as rs

rs.CurrentLayer("centroids")

obj = rs.FirstObject()
while obj:

    massprop= rs.SurfaceVolumeCentroid(obj)
    if massprop: rs.AddPoint( massprop[0] )
    
    obj = rs.NextObject(obj)

これにより、あるレイヤ(centroids という名前)をカレントレイヤに設定し、そこに VolumeCentroid*1の結果としての points を出力する。もちろん、VolumeCentroid のところを他のコマンドに変えれば色々応用できると思う。

おそらくこれくらいの簡単な作業なら旧来の RhinoScript でも問題なくできそうだが、どうも Python がこれからはスタンダードになっていくようなので Python にした。初めて書いたばかりなので syntax とかよくわかってない。公式によると

Rhino uses Python version 2.7 ( What is Rhino.Python? with Python )

ということでちょっとがっくり来たが、これはこの機能が実装され始めた時代的にしょうがなかったんだろうかな…

改良版(ロックされたレイヤを無視する)

毎回「見えてるレイヤだけ」処理するのが面倒で、「ロックされたレイヤは飛ばせないかなぁ」と思っていたが、下記でできた。

import rhinoscriptsyntax as rs

# This is optional. You can pre-select a layer and comment out this line instead.
rs.CurrentLayer("centroids")

obj = rs.FirstObject()
while obj:
    
    if rs.IsLayerLocked( rs.ObjectLayer(obj) ):
        pass
    else:
        massprop= rs.CurveAreaCentroid(obj)
        if massprop: rs.AddPoint( massprop[0] )
    
    obj = rs.NextObject(obj)

rs.ObjectLayer(obj) で「obj というIDのオブジェクトが属するレイヤ」のIDを返すっぽい。で、その結果を使って、rs.IsLayerLocked でロックされてるかどうかを調べる、ということ。

*1:なぜかスクリプトではコマンドと違って名前が SurfaceVolumeCentroid だが。

AutoDesk で middle drag(= pan)を rotation に変え、Ctrl+middle drag を pan にアサインする(X-Mouse Button Control利用)

概要

環境は Win 10.

AutoDesk Inventor を使い始めて、マウスの middle drag をデフォルトの pan でなく回転にしたかった。基本的には先人の知恵に習った:

Fusion 360で右クリックで視点を回転させる方法 - 画力がないなら立体を作ればいい

ただ、これだけやると逆に pan ができなくなったので、Ctrl + middle drag で pan するように少しだけ工夫した。具体的には以下の通り:

手順

  1. http://www.highrez.co.uk/downloads/XMouseButtonControl.htm をインストール(ポータブル版でもいいのかも)
  2. Fusion 360で右クリックで視点を回転させる方法 - 画力がないなら立体を作ればいい のとおりに middle drag を rotation に設定(Fusion のところは自分のアプリに置き換えて考える)
  3. 次に、Settings > Modifier Keys と進み、Enable modifier keys にチェック。さらに Layer Modifiers の Activate Layer 2 のところを None から Control に変えて、OK.
  4. メインウィンドウで Apply.

これでどうなるかというと、

  • ミドルドラッグすると回転
  • Ctrl 押しながらミドルドラッグすると、もともとの挙動、つまり pan

になる。

最初は Rhinoceros のように右クリックを pan つまり middle drag に変えればいいじゃん、と思ったのだが、実際やってみると「Inventor 上でのすべての right mouse click」が「middle click」になってしまったようで、全然ダメだった。いや、なんか方法はありそうなんだけど、ちょっと思いつかないのでとりあえずこれで。

Fluent: VS Code で journal file の編集をする → Scheme の関連付けをする

journal file の拡張子をたとえば .jou などに統一しておいて、Scheme と関連付けすればよい。まずは Scheme の機能拡張を入れる(自分は適当に vscode-scheme を選んだ)。次に、settings.json に、

    "files.associations": {
        "*.jou": "scheme"
    },

を追加する(最後尾に追加するなら、最後のカンマは不要)。

これで、セミコロン ; がコメントと認識されて、syntax highlight がされるし、トグルコメントなども機能するようになる。

…今思ったけど、.set ファイルも関連付けしとくと見やすいだろうな。