インターバルマッチング
CUBITの各meshing schemeは、surface/volumeを境界付けるcurveへ割り当てられるintervalにconstraintを課します。たとえばsurfaceをMap meshするには対辺のinterval数が等しい必要があります。schemeに関係なくsurfaceをquadrilateralでmeshするには境界interval総数がevenでなければなりません。接続surfaceやassemblyでは、割り当てたschemeで各surface/volumeをmesh可能にするため、これらのinterval constraintをglobalに解く必要があります。constraintを満たすだけでなく、interval数(mesh size)はユーザー希望値、またはそれに可能な限り近い値にする必要があります。CUBITで実装されているこのglobal solution techniqueを「interval matching」と呼びます。
Interval matching is automatically performed by the mesh element生成前にこのコマンドを実行します。interval matchingを手動実行することは、一部entityだけを今meshしつつ、後ですべてをmeshできることを保証したい場合に便利です。例:全volumeでmatch intervalsを行い、今はsurface 3だけmeshします。また、割り当てたscheme、corner、edge type、intervalの互換性確認にも使えます。
intervalを手動でmatchするコマンド構文は次のとおりです。
Match Intervals {Surface|Volume|Body|Group} <range>
entity listにはgroup、body、volume、surface、curveを混在して指定できます。sub-entityは自動的に含まれます。たとえばvolumeのintervalをmatchすると、そのvolumeのすべてのsurfaceも対象になります。ただし逆方向、すなわち上位次元への展開は自動ではありません。たとえばcurve 1を含むすべてのvolumeについてintervalをmatchするには「match intervals volume in curve 1」を実行します。
トラブルシューティング
interval solutionのqualityが悪い場合は、個々のentityのinterval countを変える、あるいはMapからPaveへ一部schemeを変更して自由度を増やすなどして、interval matchingを再実行してください。
interval solutionが存在しない場合があります。solutionが見つかる可能性を高めるには、少なくとも確認としてinterval firmnessをsoftへ設定してみてください。softでも、mapping cornerやsweep directionの対応が不適切だとsolutionが存在しない場合があります。
solutionがない場合、原因調査に次のコマンドが役立つことがあります(Cubit 15.6のIIAではまだ未対応)。
Match Intervals {Surface|Volume|Body|Group} <range> [Seed Curve <range>]
[Assign Groups [Only|Infeasible]] [Map|Pave]
Assign Groups はglobal problemから独立したsubproblemを含むgroupを作成します。 Assign Groups Only を指定すると独立subproblemをgroup化しますが、solverはそれらを解こうとしません。 Assign Groups Infeasible はsolutionがない独立subproblemごとに特別な名前のgroupへ格納します。corner選択やsurface meshing schemeの問題がこの方法で明確になることがあります。 Map または Pave を指定するとmappingまたはpaving constraintを含むsubproblemだけを対象にします。 Seed Curve を指定すると、そのcurveを含むsubproblemだけを対象にします。
Interval Solver Version
古いjournal fileと一貫した結果を得る必要がある場合は、旧solverを使えます。
set interval version {<cubit version number>|default}
list interval version
version >= 15.6ではIIA(2020 solver)を使い、small-loop boundを有効にします。それ以前のversionではBBIA(1997 solver)を使います。どちらのsolverも次のproblemを解きます。
min f(x,g)
s.t. Ax=b
x in [lo,hi]
A, x, b integer
ただしobjective fが少し異なるためsolutionも異なる場合があります。この形式の一般problemは、solutionがinteger-valuedでなければならないため難しく、どちらのsolverもglobal minimumを保証しません。
ここでxはintervalおよび内部変数、bはそれら変数のbound、Aとbはhardsetを含むconstraint、gは各curveについてユーザーが希望するinterval数(goal)です。objective fはmesh sizeの最大相対変更を最小化したいという要求をモデル化します。新しいIIA solverでは、achieved>goalならachieved:goal、そうでなければgoal:achievedというratioの最大lexicographic vectorがfです。旧solverはIIAのfの近似を使用します。
IIA Solver >= Cubit 15.6
Cubit 15.6では2020年にinteger linear algebraに基づく「Incremental Interval Assignment(IIA)」を導入しました。IIAはAx=bのinteger solutionを高速かつrobustに求め、Aのnullspaceからinteger vectorを加えてboundを満たし、goalへ近づけます。
IIA solutionはBBIAよりやや粗くなる傾向があり、多くの場合intervalが1つ少なく、ユーザーgoalやglobal optimumにより近くなります。IIAはBBIAより高速で、submappingとhard-setを含む一部caseでは6000倍高速です。1秒以上かかる例があればCubitチームへ送ってください。
BBIA Solver < Cubit 15.6
Cubitが1996年に導入した旧解法は、linear programmingでAx=bのfloating-point solutionを求め、その後branch-and-bound roundingで近傍のinteger solutionを探す方法です。前半は高速かつrobustですが、後半は遅くerror-proneです。linear programmingはlinear objective functionに限られるためgoal:achieved ratioは近似され、size差が極端な場合に予想外のcompromiseが生じることがあります。
BBIAについてadvanced userは次の設定を試せます。
Set Match Intervals Rounding {on|off}
Set Match Intervals Fast {on|off}
Set Match Intervals Delta <interval_difference = 0.>
set match intervals rounding が onの場合、intervalはnearest integerへ丸められます。設定が offの場合、intervalはユーザー指定interval側へ丸められます。
set match intervals fast が off ではbranch-and-bound iterationごとにcurveを1本固定します。まれにより良いmeshになる場合がありますが、通常は遅くなります。 onに設定するとiterationごとに複数curveを固定します。
Set match intervals delta はoptimizationのconvergence toleranceへ影響します。ここで delta はcurveのgoalと割当intervalの差です。値を大きくするとmatchingは高速になりますがsolution qualityが悪くなる場合があります。既定は0.0です。例として1.0を試せます。