ACU-T:6108 ユーザー定義の抗力モデルを使用したAcuSolve - EDEMの双方向連成
前提条件
このチュートリアルでは、カスタムのユーザー定義抗力モデルを使用した双方向AcuSolve EDEM連成シミュレーションを実行するためのセットアッププロセスについて説明します。チュートリアルの最初に、UDFコードとコンパイルプロセスの概要を説明してから、シミュレーションのセットアップとポスト処理について説明します。すでにHyperMesh CFDとEDEMを使用した経験があることを前提としていますが、その基本については、このチュートリアルのACU-T:1000 ユーザーインターフェース、およびACU-T:6100 Altair EDEMを使用した風力選別機での粒子分離 でも説明しています。
問題の説明

図 1.
シミュレーションの目的は、水柱中を落下する固体粒子の終端速度を計算することです。粒子の初期位置は、水柱の底面から4.8mmの位置です。Stokes流れでは、粒子は最初に重力によって加速され、流体の抗力は無視できます。流体中を粒子が移動すると、摩擦抗力が増加し、加速が時間とともに低下してゼロとなり、その後粒子は終端速度と呼ばれる一定の速度で移動します。
| 重要なシミュレーションのパラメータ | |
|---|---|
| 水の密度(kg/m3) | 1000 |
| 水の粘度(Pa s) | 0.001 |
| 粒子の密度(kg/m3) | 1500 |
| 粒子の直径(m) | 0.0001 |
AcuSolveユーザー定義関数(UDF)の概要
UDFのフォーマット

図 2.
ヘッダーファイル
- acusim.h: このヘッダーファイルには、AcuSolveや、stdio.h、string.h、math.hなどの標準Cヘッダーファイルによって使用される主なデータタイプが含まれます。AcuSolveで使用される一般的なデータタイプ
a. Integer Type integer b. Real Type floating point c. String Type string d. Void Type void - udf.h: このヘッダーファイルには、UDF内のデータにアクセスするために必要なすべてのマクロと宣言が含まれます。
関数プロトタイプ
ヘッダーファイルが宣言されると、UDF_PROTOTYPE()マクロと、その引数としてユーザー関数の名前を使用して、ユーザー関数のプロトタイプを作成する必要があります(例: UDF_PROTOTYPE(usrStokesDrag))。
このユーザー関数名は、モデルのセットアップで指定した名前を同じにする必要があります。そうしないと、実行時エラーとなる可能性があります。ユーザー関数名は、Cでサポートされているものであれば何でも構いませんが、他のソルバーパラメータと区別するために、usrで始まる関数名を使用することをお勧めします。
関数定義

図 3.
戻り値のタイプ
すべてのC関数には戻り値のタイプが必要です。抗力の値はoutVecを介してAcuSolveに戻されるため、戻り値には意味がなく、戻り値のタイプはVoidに設定する必要があります。
関数の引数
- udfHd
- さまざまなデータにアクセスするために必要な情報を含むポインター。サポートするすべてのルーチンでこの引数が必要となります。
- outVec
- ユーザー関数の結果ベクトル。入力では、この配列はすべてゼロとなります。このベクトルは力の情報をAcuSolveに戻すために使用されます。
- nItems
- これはoutVecの最初の次元で、入力する必要のある項目の数を指定します。呼び出しごとに1つの粒子の抗力を計算しているため、すべての抗力モデルユーザー関数でこの値は1となります。
- vecDim
- これはoutVecの2番目の次元で、特定のデータのベクトルの次元を指定します。この値は、戻されるデータのタイプに依存します。
- 抗力のユーザー関数
- 最小で3つの値(x、y、z成分)が必要です。オプションで、4つ目の値をAcuSolveに戻すこともできます(抗力係数)。
- 揚力のユーザー関数
- 3つの値(x、y、z成分)。
- トルクのユーザー関数
- 3つの値(x、y、z成分)。
関数コード
変数:
変数は、データの特定のタイプを格納するために使用されます。このデータは単独の値でも、値の配列でも構いません。C言語では、プログラムで使用する前に、すべての変数を宣言する必要があります。宣言はプログラム内のどこでも行うことができますが、前もって必要なすべての変数を宣言すると、コードがより整理され、容易に理解できるようになります。Cで変数を宣言するシンタックスはDatatype variable_nameです。
例
Real volume ;
ここで、Realはデータタイプ、volumeは変数名です。
現在の例を含む多くのUDFでは、AcuSolveから、ソルバーによってすでに計算され、特定のメモリアドレスに格納されている一部のデータにアクセスする必要がある場合があります。このためには、要求されたデータのメモリアドレスを指すポインター変数を宣言する必要があります。たとえば、局所流体速度にアクセスする必要がある場合、すでにAcuSolveがその値を格納している場所のメモリアドレスを格納するポインター変数を宣言する必要があります。
例
Real* xVel ;
AcuSolveからのデータアクセス:
AcuSolveから粒子および流体データへのアクセスに使用されるルーチンは、udfGetEDEMData(udfHd, dataName)です。これはデータの配列を返し、配列の長さは要求されるデータのタイプに依存します。
たとえば、
粒子の体積にアクセスするには、まずポインター変数を宣言し、次のデータルーチンを使用する必要があります。
Real* vol ;


図 4.
- 抗力値を計算する:
- 力のデータをAcuSolveに送信する:

図 5.

図 6.
全コード
#include "acusim.h"
#include "udf.h"
/*===========================================================================
*
* Prototype the function
*
*===========================================================================
*/
UDF_PROTOTYPE( usrStokesDrag ) ;
/*===========================================================================
*
* "stokesDrag": calculate EDEM particle drag force based on the Stokes law
*
* Arguments:
* udfHd - opaque handle for accessing information
* outVec - output vector
* nItems - number of items in outVec (=1 in this case)
* vecDim - vector dimension of outVec (=3 in this case)
*
* Input file parameters:
* user_values = { }
* user_strings = { "" }
*
*===========================================================================
*/
Void usrStokesDrag( UdfHd udfHd,
Real* outVec,
Integer nItems,
Integer vecDim )
{
Real beta ;
Real vol ;
Real visc ;
Real diam ;
Real* scalar ;
Real* flowVel ;
Real* particleVel ;
Real slipVel[3] ;
Real poros ;
/*---------------------------------------------------------------------------
* Get particle and flow data at current particle location
*---------------------------------------------------------------------------
*/
scalar = udfGetEDEMData( udfHd, UDF_EDEM_PARTICLE_VOLUME) ;
vol = scalar[0] ;
scalar = udfGetEDEMData( udfHd, UDF_EDEM_FLOW_VISCOSITY ) ;
visc = scalar[0] ;
scalar = udfGetEDEMData( udfHd, UDF_EDEM_FLOW_POROSITY ) ;
poros = scalar[0] ;
flowVel = udfGetEDEMData( udfHd, UDF_EDEM_FLOW_VELOCITY ) ;
particleVel = udfGetEDEMData( udfHd, UDF_EDEM_PARTICLE_VELOCITY) ;
if ( vol <= 0 ) {
udfSetError( udfHd, "Error: EDEM particle volume"
" should bigger than zero" ) ;
}
/*---------------------------------------------------------------------------
* Calculate drag
*---------------------------------------------------------------------------
*/
slipVel[0] = flowVel[0] - particleVel[0] ;
slipVel[1] = flowVel[1] - particleVel[1] ;
slipVel[2] = flowVel[2] - particleVel[2] ;
diam = pow((6*vol/PI),0.333333333333);
beta = 3*PI*visc*poros*diam ;
/*---------------------------------------------------------------------------
* Push the drag force to AcuSolve
*---------------------------------------------------------------------------
*/
outVec[0] = beta * slipVel[0] ;
outVec[1] = beta * slipVel[1] ;
outVec[2] = beta * slipVel[2] ;
} /* end of usrStokesDrag() */
使用可能なUDFルーチンの詳細については、AcuSolve User-Defined Functions Manualをご参照ください。
UDFのコンパイル
ソルバーがユーザー定義関数にアクセスできるようにするには、これらの関数をコンパイルして、共有ライブラリにリンクさせる必要があります。これらのライブラリは、ソルバー入力ファイルとともに、作業ディレクトリに配置する必要があります。
Windows
スタートメニューからAltair <solver version>を展開し、AcuSolve Cmd Promptを起動します。
ターミナルで、cdコマンドを実行し、モデルファイルとUDFスクリプトファイルがあるディレクトリに移動します。次のコマンドを実行して、UDFをコンパイルします:
acuMakeDll -src usrStokesDrag.c
Linux
コマンドラインプロンプトを開き、cdコマンドを実行してモデルファイルとUDFスクリプトがあるディレクトリに移動します。次のコマンドを実行します:
acuMakeLib -src usrStokesDrag.c
パート1 - AcuSolveシミュレーション
HyperMesh CFDの起動とHyperMeshデータベースのオープン
形状の検証
Validateツールは、モデル全体をスキャンし、サーフェスおよびソリッド上でチェックを実行して、形状に不具合(フリーエッジ、閉じたシェル、交差、重複、スライバーなど)があればフラグ付けします。

図 8.
流れのセットアップ
一般的なシミュレーションパラメータの設定
材料プロパティの割り当て
流れ境界条件の定義
メッシュの生成
節点出力の定義
メッシングが終了すると、自動的にソリューションリボンに移動します。
パート2 - EDEMシミュレーション
WindowsのスタートメニューからをクリックしてEDEMを起動します。
EDEMの入力デックを開く
EDEMモデルセットアップの確認
このチュートリアルでフォーカスする主な領域は、ユーザー定義の抗力モデルのセットアップと、双方向AcuSolve - EDEM連成シミュレーションのコンパイルプロセスです。したがって、簡潔にするため、入力ファイルとともに提供されるEDEMデータベースには、必要なすべてのセットアップが含まれています。
EDEMモデルのサマリー
直径0.0001mの球形粒子が、水柱の底面から0.0048mの位置に投入されます。粒子の密度は1500kg/m3で水より重いため、粒子は水柱中を自由に落下します。
シミュレーション設定の定義
連成シミュレーションの実行
結果の分析
要約
このチュートリアルでは、双方向AcuSolve-EDEM連成のためのカスタムの抗力モデルを実装するため、C言語でユーザー定義関数を記述する方法を知ることができました。Stokes抗力則を使用して、水柱中を落下する球形粒子の終端速度を計算しました。このシミュレーション結果は、レイノルズ数の値が小さい流れでは、粒子上の抗力の予測においてStokes抗力則は非常に正確であることを示していました。






















