ロシアで最も人気のあるソフトウェアツールはANSYS、ABAQUS、SCAD、LIRA、PLAXISなどであると主張する人はいません。 そして、この長く分割された市場セグメントでニッチを占める可能性は何ですか? そして、新しいプログラムで再学習したい人はほとんどいません。 しかし、プログラムを強力な決済システムと統合し、結果を別のシステムに転送するという問題は、はるかに困難なタスクです。 開発とデバッグに何年もかかった強力なコンピューティングパッケージがあり、特定のタスクがありますが、1つのコンピューターシステムに実装するのが非常に難しい場合や、自分で実装できる必要な機能がありません。
必要に応じて、実際のテストのグループのモデリングの結果を計算モデルと一致させるために、材料モデルのパラメトリック最適化を実行するためにこのタスクを取り上げました。 これは、各ソフトウェア製品が独自の方法を考慮し、ANSYSでの計算結果が同じモデルパラメーターを使用したABAQUSでの計算と同一ではないという事実によってさらに悪化します。 計算の特定の実装、有限要素のタイプ、さらにはグリッドノードの場所に依存します。 その結果、エンジニアは材料のパラメータを入力しますが、実際にどのように正確に対応しているかはわかりません。 さらに、最適なパラメーターの変動性はテスト結果の70%に達する可能性があります。特に、テスト処理は1つ、最大2つの強度条件、多くの場合最も単純で複雑なモデルのフレームワーク内で実行されるため、特に必要に応じて設定するように求められた場合、必要なパラメーターを決定する方法が常にわかっているとは限りませんあらゆる範囲の経験から。
この問題を解決するために、プログラムをANSYS計算コアと統合するようにタスクが設定されました。 統合タスクは問題なく解決されましたが、正常に解決されました。 さらに、主な問題はパブリックドメインにドキュメントがまったくないことでした。そのため、統合の実装に関する情報は、私の問題と同じ問題を抱えている人にとって非常に役立つと思います。
統合メカニズム
単一のANSYS Workbench環境ですべてのANSYSソフトウェア製品の統合が開始されると、プログラムをこの環境に直接統合できるようになりました。 ANSYS Workbenchアーキテクチャ自体は、アプレットと呼ばれるANSYSモジュールが呼び出されるJavaおよびVBスクリプトを使用して構築されています。
開発者が最初に思い浮かぶ最初のオプションは、Java-Scriptで以前に作成または生成されたスクリプトから呼び出すだけで十分なことです。 ただし、このパスにはかなり重大な欠陥が1つあります。スクリプトを呼び出すたびに、ワークベンチを再度開き、ANSYSアプレットを初期化する必要があります。その後、計算のためにコマンドをカーネルに送信します。 これは、 Cにあるスクリプトから見ることができます。\ Program Files \ ANSYS Inc \ v110 \ AISOL \ SDK \ samples \ JPDL \Demo.js。 スクリプトテキストを以下に示します。
oWB = new ActiveXObject ( "AnsysWB.WB.90" ) ;
oWB。 StartApplet = "AAOApplet" ;
oWB。 実行 ( ) ;
oWB。 タイトル = "ANSYS Workbench" ;
ConnectToAnsysCS ( ) ;
var fs、a ;
ForAppending = 8 ;
fs = new ActiveXObject ( "Scripting.FileSystemObject" ) ;
a = fs。 CreateTextFile ( "d: \ r undir \ t estfile.txt" 、 true ) ;
with ( ansys。cmd ) {
for ( l = 4 ; l < 10 ; l ++ ) {
_clear ( ) ;
_prep7 ( ) ;
_view ( null 、 -1 、 -2 、 -3 ) ;
var w = 3 ;
var d = 2 ;
block ( null 、l、 null 、w、 null 、d ) ;
kp4x = ansys。 apdl get ( "KP" 、 4 、 "LOC" 、 "X" ) ;
commentx = "KP 4 X LOC =" ;
commentx + = kp4x ;
kp4y = ansys。 apdl get ( "KP" 、 4 、 "LOC" 、 "Y" ) ;
commenty = "KP 4 Y LOC =" ;
コメント+ = kp4y ;
kp4z = ansys。 apdl get ( "KP" 、 4 、 "LOC" 、 "Z" ) ;
commentz = "KP 4 Z LOC =" ;
commentz + = kp4z ;
ret = _com ( commentx ) ;
ret = _com (コメント) ;
ret = _com ( commentz ) ;
これ 。 。 WriteLine ( commentx ) ;
これ 。 。 WriteLine (コメント) ;
これ 。 。 WriteLine ( commentz ) ;
球体( 1 ) ;
vsbv ( 1、2 ) ;
et ( 2、92 ) ;
vmesh ( "all" ) ;
da ( 9 、 "all" ) ;
sfa ( 4、1、 "pres" 、 10,000,000 ) ;
mp ( "EX" 、1、27E + 06 ) ;
mp ( "PRXY" 、 1、0.3 ) ;
finish ( ) ;
_solu ( ) ;
解決する( ) ;
finish ( ) ;
_post1 ( ) ;
セット( "LAST" ) ;
plnsol ( "S" 、 " EQV " ) ;
_replot ( ) ;
finish ( ) ;
}
}
a。 閉じる ( ) ;
プログラムでスクリプトを生成して実行すると、非常に不便になります。なぜなら、 スクリプト自体は外部ハンドラーによって実行されるため、デバッグが非常に複雑になります。 また、作業の全サイクルを担当するスクリプトを生成することは非常に不便です。
主な問題は、WorkBench環境のハンドルを取得して保存することでした。 この観点から、ワークベンチ環境のロードを担当する部分が最も興味深いものです。
oWB = new ActiveXObject ( "AnsysWB.WB.90" ) ;
oWB。 StartApplet = "AAOApplet" ;
oWB。 実行 ( ) ;
oWB。 タイトル = "ANSYS Workbench" ;
これと他のスクリプトを勉強するとき、私は質問がありました:Java-Scriptができるなら、なぜC#はできないのですか そして、非常にうまくいくことがわかった。 ANSYSをインストールすると、MS Visual Studio自体がすべてのANSYSライブラリへのリンクを検出しますが、少なくともバージョン11では、それらは大幅に切り捨てられています。 しかし、その中には、Workbench環境でのプログラムの動作を担当するライブラリであるAnsysWBがありました。これはANSYSWBLib名前空間の形式で接続されています。
ANSYSを実行するには、次のコードを書くのに十分であることが判明しました。
ANSYSWBLib。 WBClass wb = 新しい ANSYSWBLib。 WBClass ( ) ; // ABSYS WBオブジェクトを作成します
wb。 コマンドライン ディレクトリ = @ "c:tmp" ; //作業ディレクトリを指定します
wb。 コマンドライン JobName = "Test" ; //プロジェクトの名前を指定します
wb。 コマンドライン CadFile = @ "c:tmpqwe.ewq" ; //作業ファイルを指定します
wb。 StartApplet = "AAOApplet" ; //古典的なANSYSモジュールが必要であることを指定します
wb。 実行 ( 0 ) ;
したがって、このコードを使用するとANSYSを実行でき、起動される従来のANSYSのアプレットが起動アプレットとして直接示されます。 しかし、その後、私たちは彼への制御コマンドの転送を整理する必要があり、ここで困難が生じました。 Java-Scriptでは、これは次の行で実装されます。
アプリ スクリプト ans_sendcommand (コマンド)
Appは、AAOAppletモジュールへのハンドルへのリンクです。 クラスプロパティに格納されます。
wb。 AppletList 。 get_WBApplet ( "AAOApplet" ) 。 アプレット アプリ
しかし、プラグインライブラリのANSYSバージョン11では、ANSYSアプレットを操作するためのインターフェイスが見つかりませんでした。 幸いなことに、NET FrameWorkにはMicrosoft.JScriptなどのライブラリがあり、JScriptスクリプトをメモリ内で直接コンパイルして実行でき、C#から必要な関数の呼び出しを実装できます。
この目的のために、ANSYSで作業するために必要なすべての機能を実装する独自のクラスを作成することにしました/クラスコードを以下に示します。
クラス WBCommand
{
ANSYSWBLib。 WBClass wb ;
パブリック WBCommand ( ANSYSWBLib。WBClass WB )
{
wb = wb ;
aao = wb。 AppletList 。 get_WBApplet ( "AAOApplet" ) 。 アプレット アプリ
文字列コード= @ "関数クロージャ()
{
リターン関数(アプリ、コマンド)
{
return App.Script.ans_sendcommand(コマンド);
}
}
閉鎖()」 ;
//
SendCommandClosure = ( Closure ) Microsoft。 JScript 評価 JScriptEvaluate (コード、Microsoft。JScript。Vsa。VsaEngine。CreateEngine ( ) ) ;
}
private Closure SendCommandClosure = null ;
プライベートクロージャーSetWorkingDirectoryClosure = null ;
プライベート オブジェクト aao = null ;
パブリック オブジェクト SendCommand ( string Command )
{
SendCommandClosureを返します。 Invoke ( null 、 new object [ ] { aao、Command } ) ;
}
public void SetWorkingDirectory ( string WorkingDirectory )
{
SendCommand ( "/ CWD、" + WorkingDirectory ) ;
}
}
クラスのコンストラクターを呼び出すと、呼び出されたプロシージャがJScriptで形成され、そのエントリポイントが保存されます。
文字列コード= @ "関数クロージャ()
{
リターン関数(アプリ、コマンド)
{
return App.Script.ans_sendcommand(コマンド);
}
}
閉鎖()」 ;
//
SendCommandClosure = ( Closure ) Microsoft。 JScript 評価 JScriptEvaluate (コード、Microsoft。JScript。Vsa。VsaEngine。CreateEngine ( ) ) ;
それを呼び出すために、メソッドが実装されました:
パブリック オブジェクト SendCommand ( string Command )
{
SendCommandClosureを返します。 Invoke ( null 、 new object [ ] { aao、Command } ) ;
}
テキストコマンドを必要とする入力パラメーターとして、またJSCriptが呼び出されると、関数はコンストラクターで受信されaao変数に保存されたアプレットへの参照を追加で渡します。
SendCommandメソッドを呼び出すことで、外部アプリケーションからAPDL言語のANSYSコマンドを転送し、必要なすべてのアクションを実行できるようになりました。 この方法は、ANSYSコマンドラインへのコマンド入力を直接エミュレートしますが、多くのコマンドでは確認が必要です。 アクションの確認要求を回避するには、コマンドを一度に1つずつ挿入するのではなく、APDLファイルに書き込み、SendCommandコマンド( "/ inp、f、apdl")を呼び出すだけで十分です。この場合、ANSYSは1つまたは別の操作。
私はANSYSの新しいバージョンでの動作をテストしていないため、JSの使用を完全に放棄することが可能になりましたが、バージョン11との互換性が必要な場合、プログラムを統合する別の方法は見つかりませんでした。