CAESolutions

  • 製品一覧
  • イベント・セミナー
  • スクール
  • ニュース
  • ダウンロード
  • 会社案内
  • cds事業部
  • 技術サポート事業部
  • PLM事業部
  • フルイド事業部
  • home
  • sitemap
  • contact

ここから本文です

製品一覧

DADiSP

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 FileSPL 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の演算子と構文法の比較

OperationMATLABC/C++SPL
scalar or series multiplya .* ba * ba * b
scalar or series dividea ./ ba / ba / b
matrix multiplya * bN/Aa *^ b
matrix dividea ? bN/Aa ?^ b
matrix transposea'N/Aa'
block statementbegin, end{}{}
range specifier1:10N/A1..10
series constructor[1,2]{1,2}{1,2}
array constructor[1,2;3,4]{{1,2},
{3,4}}
{{1,2},
{3,4}}
array referencea(n,m)a[n][m]a[n][m]
a[n,m]
function callf(x,y)f(x,y)f(x,y)
iterationfor 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 statementsgoto
switch
goto
switch
goto
switch
input arg countnarginargcargc
output arg countnargoutN/Aoutargc
string character'text'"text""text"
'text'
pre/postfixN/Aa++
a--
++a
--a
a++
a--
++a
--a
multiple assign[a,b]=f(x)N/Aa++
a--
++a
--a
multiple return[a,b]=f(x)N/Areturn(a,b)
assignmentsa = ba = 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
addressN/A&a&a
pointer referenceN/A*a*a
logicalsa | b
a & b
a || b
a && b
a || b
a && b
relationalsa > b
a < b
a >= b
a <= b
a > b
a < b
a >= b
a <= b
a > b
a < b
a >= b
a <= b
equalitiesa == b
a  ̄= b
a == b
a != b
a == b
a != b
bit operatorsN/Aa << b
a >> b
a <<= b
a >>= b
a << b
a >> b
a <<= b
a >>= b
modulusN/Aa % ba % b
comment% text// text
/* text */
// text
/* text */
preprocessorN/A#if
#ifdef
#elif
#endif
#if
#ifdef
#elif
#endif
file inclusionN/A#include#include
macrosN/A#define
#else
#elif
#endif
#undef
#define
#else
#elif
#endif
#undef
ternary conditionalN/Aa ? b : ca ? b : c

上に戻る

ページの最後です