CAEソリューションズ フルイド事業部CAE Solutions

CAE効率向上のソフトウエア販売と受託解析サービス、あらゆる場面で貢献します。

ソフトウエア製品名から探す解析対象から探す受託開発・受託解析お問い合わせ
| フルイド事業部 トップ | アクセス | サイトマップ |

SPL

SPL

DADiSPの設計思想は、ユーザーがプログラミングをすることを無くし、問題解決に集中できるようにすることにあります。しかし、ユーザーがDADiSPをカスタマイズしたい、あるいは特殊な処理機能を追加したい場合があります。そのために、DADiSPは、SPLというシリーズ プロセッシング言語を提供しています。SPLは、C/C++言語を基礎としてC/C++ライクの構文を持っています。それゆえ、SPLのルーティンは、なじみ易いものとなっています。
この分野でよく知られているMATLABと比べてみますと、MATLABは、もともとFORTRANで開発され、その後Cに書き換えられため、MATLABのプログラムは、一般的に一貫性に乏しく、FORTANとCのコーデング スタイルを組合せたようなものになります。SPLとMATLABは、それぞれの設計思想と特徴を持っていますが、プログラムを相互にコンバートすることが、かなり簡単にできます。次に例として、台形法則による面積計算のプログラムを示します。

 

バーチャル シリーズ マネージメント

SPLは、バーチャル シリーズ マネージメントと呼ぶ最適化手法を採用しています。各シリーズと配列の大きさは、使用可能なディスク容量によってのみ制限されます。シリーズの大きさが、利用可能なメモリー容量を超えると、SPLは自動的にハードディスクを使います。バーチャル シリーズ マネージメントは、シリーズの処理を最適化します。それゆえ、この手法は、汎用OSのページ スワッピングより高速かつ確実に処理します。メモリー内のシリーズの大きさは調整可能で、ユーザーがシステムメモリー上の処理を最適化することを可能にします。つまり、SPLは、大量の大容量シリーズの処理に理想的に対応できます。

MATLAB M File SPL Function

function s = traprl(f, a, b, m)
%
% trapezoidal rule.

h = (b - a)/m;
s = 0;

for k=1:(m-1),
  x = a + h*k;
  s = s + feval(f,x);
end

s = h*(feval(f,a)+feval(f,b))/2;
s = s + h*s;

traprl(f, a, b, m)
{
// trapezoidal rule

 h = (b - a)/m;
  s = 0;

 for (k = 1; k < m; k++) {
   x = a + h*k;
   s = s + feval(f,x);
  }

 s = h*(feval(f,a)+feval(f,b))/2;
  s = s + h*s;
  return(s);
}

 

MATLBと比べてみますと、MATLABの配列の大きさは、物理的メモリー容量で制限されています。MATLABが、OSの汎用仮想メモリー管理に依存しているためです。配列の大きさが、使用可能なメモリー容量を超えると計算はエラーとなるか、メモリーページがディスクにスワップされない限り停止します。

C/C++スタイルの構文法

SPLは、C/C++の構文法を多く借用しているので大部分のC/C++プログラムは、SPLのルーティンとして直接読み込むことができます。例えば、SPLは、次のC/C++の演算子をサポートしています。

++, --, +=, -=, /=, *= %=, ==, !=, >>, <<, >>=, <<=, ||, &&, スカラーポインター

また、次のループや反復は、C/C++と同じ動作を正確におこないます。

for, while, do while, if, else, switch, goto

配列の構成は、C/C++構文法と似ています。さらに、SPLには次のC/C++ライクのプロセッサーも含まれています。

#if, #ifdef, #elif, #endif, #include, #define, #undef

上に戻る

MATLAB MファイルからSPLへのコンバート

MファイルからSPLルーティンへのコンバートが必要になった場合は、MathWorks社が提供しているMATLAB-to-C変換ユーティリティが役に立ちます。SPLは、C/C++とかなり似ているのでMファイルからSPLルーティンへのコンバートにこのユーティリティが使えます。参考のために、次にSPLとC/C++、MATLABの演算子と構文法の比較を示します


SPLとC/C++およびMATLABの演算子と構文法の比較

Operation MATLAB C/C++ SPL
scalar or series multiply a .* b a * b a * b
scalar or series divide a ./ b a / b a / b
matrix multiply a * b N/A a *^ b
matrix divide a ? b N/A a ?^ b
matrix transpose a' N/A a'
block statement begin, end {} {}
range specifier 1:10 N/A 1..10
series constructor [1,2] {1,2} {1,2}
array constructor [1,2;3,4] {{1,2},
{3,4}}
{{1,2},
{3,4}}
array reference a(n,m) a[n][m] a[n][m]
a[n,m]
function call f(x,y) f(x,y) f(x,y)
iteration for n:100 end

while n < 100 end

for (n=0; n <= 100; n++)
while (n < 100)
do { } while (n < 100)
for (n=0; n <= 100; n++)

while (n < 100)

do { } while (n < 100)

loop (n..100)

jump statements goto
switch
goto
switch
goto
switch
input arg count nargin argc argc
output arg count nargout N/A outargc
string character 'text' "text" "text"
'text'
pre/postfix N/A a++
a--
++a
--a
a++
a--
++a
--a
multiple assign [a,b]=f(x) N/A a++
a--
++a
--a
multiple return [a,b]=f(x) N/A return(a,b)
assignments a = b a = b
a += b
a -= b
a /= b
a *= b
a %= b
a = b
a += b
a -= b
a /= b
a *= b
a %= b
a @= b
a := b
address N/A &a &a
pointer reference N/A *a *a
logicals a | b
a & b
a || b
a && b
a || b
a && b
relationals a > b
a < b
a >= b
a <= b
a > b
a < b
a >= b
a <= b
a > b
a < b
a >= b
a <= b
equalities a == b
a  ̄= b
a == b
a != b
a == b
a != b
bit operators N/A a << b
a >> b
a <<= b
a >>= b
a << b
a >> b
a <<= b
a >>= b
modulus N/A a % b a % b
comment % text // text
/* text */
// text
/* text */
preprocessor N/A #if
#ifdef
#elif
#endif
#if
#ifdef
#elif
#endif
file inclusion N/A #include #include
macros N/A #define
#else
#elif
#endif
#undef
#define
#else
#elif
#endif
#undef
ternary conditional N/A a ? b : c a ? b : c

上に戻る

© 2006 CAE Solutions Corporation. All Rights Reserved
〒102-0072 東京都千代田区飯田橋2-1-10 TUGビル8F |Tel:03-3514-1506|Fax:03-3514-1507