私は最近、MATLAB で有限要素法に取り組んでいます。
MATLAB でコードを最適化しようとしました。
検索中に、mex 関数を使用すると行列の組み立てが高速化できることがわかりました。
「PoissonAssembler.m」を mex 関数に移植しているときに、いくつかの問題が発生しました。
PoissonAssembler.m は基本的にこのような構造になっています。
for every element{
loc_stiff_assmbl();
loc_rhs_assmbl(); // this one involves with function evaluation @(x,y)
for every edges{
loc_edge_assmbl();
if boundary{
loc_rhs_edge_assmbl(); // this one also have function eval
}
}
}
matlabでは、私は持っています
f = @(x,y) some_math_function;
この関数は他の数値シミュレーション用に変更されるため、
関数ハンドルを mex ファイルの入力として使用したかった
mexCallMatlab() と feval を使用してこれを行う方法があることがわかりました。
ただし、matlab の呼び出しによるオーバーヘッドが原因で、コードの速度が低下すると思います。
関数ハンドルを変更するたびに mex ファイルをコンパイルせずに回避する方法はありますか?
より正確なコードは次のようになります
for (k=0;k<nE;k++){ // nE : number of elements (about 10^5 to 10^6)
// other assembling procedure
blabla
// function evaluation for rhs assemble
for (i=0; i<nP; i++){ // nP : number of points in element
fxy[i] = f(x[i],y[i])};
}
// rhs assemble
for (j=0; j<nP; j++){
for (i=0; i<nP; i++){ // matrix vector multiplication
rhs[k*nE + j] += Mass[ i*nP + j]*fxy[i];
}
}
// face loop
for (f1 = 0; f1 < nF4E; f1++){ // number of face for each elements
switch(BCType[k1*nF4E + f1]){ // if boundary
case 1 : // Dirichlet
// inner product with evaluation of gD = @(x,y) function
CODE OMITTED
case 2 : // Neumann
// inner product with evaluation of gN = @(x,y) function
CODE OMITTED
}
}
}