Open Fresco使用再開に向けて

2003-4年にアメリカUC Berkeleyに留学した一番の成果は、OpenSeesと実験機器を融合させたハイブリッド実験を行うシステムを開発したことでした。オブジェクト指向で構造実験を分析し、実装。留学先のFenves先生と一緒に、OpenFresco (Open software FRamework for Experimantal Setup and COntrol)と名付けました。有難いことに、今でもUC Berkeleyから公開してくれています。これを研究でも使用再開しようと思い、そのためにまずOpenSeesのビルドから再開したのです。

さて、実験機器をコンピュータでコントロールするにはドライバが必要で、当時その多くはMS Windows用しかありませんでした。当時はメインはLinuxだったので流儀がわからず閉口しましたが、時間もあったのでコーディングできましたが、さて、再開しようとすると、随分と状況が変わっています。オリジナルはWindows XPでしたが、その後Windows 7時代までは使ってました。ただ、OSも64ビット化する中で、実験機器用ドライバは32ビット版しかなかったので、OSを32ビット版を使うことで解決していました。ただ今再開するにあたり、今更32ビットは…ということで調べてみると、National InstrumentsのUSB接続のDAQボードを制御するドライバNIDAQmxは64ビット版もありました。これを使うことにします。インストールはOK、ドライバ付属のテストパネルでは電圧の入出力もOK。さて、これをC++のプログラムで制御したいのです。

さて、ANSI Cのサンプルコードも付いていたのでVisual Studio 2019でプロジェクトファイルを開くと、サンプルが古くてソリューションファイルに変換失敗とでる。そのままコンパイルすると、何かのフラグがバッティングしているだけそうだったので、必要ないフラグを外して再コンパイル。あっさり実行ファイルができました。ラッキーと、プログラムを走らせても、何も電圧が出力されていません。32ビットのライブラリがリンクされているかと思い、確認するとビンゴ。64ビットのライブラリへリンク先を変更し、再コンパイルすると、今度は多くのリンクエラーが。なぜ??原因は、Visual Studioのソリューションファイルのターゲットがx86となっていたので、とりあえずx64を新規作成。実は何が変わったか分かりませんが、これでリンクエラーも出ず、実行ファイルができました。めでたし、めでたし。実行すると、やっぱり電圧が出力されない…でもエラーも発生していないので、DAQボードとは通信しているみたいだけど…

困ってネットで情報検索.すると,C言語でNIDAQmxライブラリを用いている事例は(オフィシャルも含め)ほぼ10年前までのものばかり.National Instrumentsでも,LabViewを押しているし,MATLABでもNIの機器を使えるので,最近はC言語で制御したいニーズがないんだろうな,と諦め,サンプルソースコードに向き合う(本来,まずはこれからすべき).すると,Sampling Clock Timingを取得するデバイス名が違う,という初歩的なミスでした.恥ずかしいので,自戒を込めてここに晒しておきます.これを修正し,無事,電圧出力できました.次はOpenFrescoのビルドだな.OpenSSLなどの通信も含むので,これまた大仕事.時間みつけられるかな.

 

 

OpenSees用の自作ライブラリの組み込み

OpenSeesそのものはC++言語でコーディングされていますが、Tcl言語をインタープリタとして拡張しているので、入力ファイルがプログラムとなっており、柔軟な解析を行うことができます。ただ、新しい材料モデルなどを組み込むにはOpenSees本体に組み込み、再ビルドする必要がありました(2003年当時)。なので、OpenSeesのメンテナであるFrankにとっては、得体の知れない人のライブラリを組み込むフラストレーションもあったのでしょう(彼の口癖は、You can do it.でした)、Packageという動的組み込み法を導入しました。WindowsならDLLですね。OpenSeesの実行ファイルと自作ライブラリのDLLを一緒に置いておくと、必要な時にロードされ、組み込むことができるようになりました。これは自作ライブラリを作る人にもメリットがあって、OpenSees本体をビルドする必要が無いのです。

さて、WindowsにOpenSeesビルド環境が整ったので、昔作った武田モデル(鉄筋コンクリート部材の履歴といえば世界的にもこれでした)のDLLを再ビルドしてみたのですが、動的ロードされません…ググってみると、64bit版を作るには、ちょっと手を加えないとダメなんですね。今まで32bit版しか作ったことが無かったので気づきませんでした。

で、再ビルドしてOpenSeesTkで動作確認。ちゃんとアルゴリズムも問題なさそうですね。

OpenSeesのビルド

2003年にUC Berkeleyに留学した際,構造解析ソフトウェアフレームワークのOpenSeesを開発していたG.L. Fenves先生のグループに加わりました.これを用いた分散ハイブリッド実験を行うために,OpenSeesと協働して実験を行うためのフレームワークOpenFrescoを開発しました.その際,散々ソースコードを読んだので,OpenSeesは今でも便利に研究に使っています.WindowsやMac OS Xの実行形式バイナリをダウンロードするだけなら簡単ですが,中身をいじくろうと思うと,ソースコードからビルドする必要があります.で,それが簡単ではない(コツを知っているとなんとかできる).なので,昔から使っているコードを改変しながら使っていたんだけど,いつかは最新版に置き換えないとな,と思っていました.特に,version 3.0.3からTclをメジャーバージョン8.5から8.6に変えていたことから,付け焼き刃の対処には無理がでてきたので.

OpenFrescoの開発者なのに全然使ってないな,と思うことがあり,一念発起.Windowsの環境を整えることにしました.OpenFrescoでは実験用の機器をコントロールする必要があり,そのためのライブラリはWindowsのみしか対応していないものが多いためです.まずはOpenSeesのビルドもやってみました.案の定,一筋縄では行かなかったので,ここに覚え書き.

準備

  • OS:Windows 10 (64 bit)
  • コンパイラ:Microsoft Visual Studio Community 2019(フリーで利用できます)
  • OpenSees ソースコード:Git Hub OpenSees Release Pageよりversion 3.1.0のzipファイルをダウンロード.自分のDocumentフォルダに展開.
  • Tcl/Tk:ActiveStateのActiveTclより,version 8.6をダウンロード.OpenSeesのVisual Studioプロジェクトファイルでは,Tcl関連のリンク先をc:\Program Files\tclを想定しているので,インストール先もこちらに変更.
  • 配布されていないライブラリ:これが一番見つけるの大変でした.OpenSees実行ファイルをリンクする際,ifconsol.libなどが求められるのですが,これが配布されていません.OpenSees + ifconsol.libで検索すると見つかるライブラリを使ってもうまく行かない.おそらくそれらは32 bitバージョンのよう.Intel® Parallel Studio XE Cluster Edition for Windows* 2020の体験版をダウンロードして見つけました.肝心のファイルは,c:\Program Files (x86)\IntelSWTools\compilers_and_libraries_2020.0.166\windows\compiler\lib\intel64_winフォルダにある以下のファイルをOpenSees-3.1.0\Win64\libにコピー.体験版の期間が切れるとどうなるんだろう?
    • ifconsol.lib
    • libdecimal.lib
    • libifcoremt.lib
    • libifport.lib
    • libirc.lib
    • libmmt.lib
    • svml_dispmt.lib

ビルド

OpenSeesを展開したフォルダより,Win64フォルダにあるOpenSees.slnをダブルクリック.Visual Studioのソリューションファイルです.

最新版のソースコードには,インタープリターとしてTclに加え,Pythonも使えるように拡張されていますが,とりあえずTclの方だけビルドしますが,一点だけ修正します.Visual Studioのソリューションエクスプローラーより,OpenSeesのプロパティを右クリックして,プロパティページを開き,構成プロパティの「C/C++」の「コード生成」の中で,「ランタイムライブラリ」を「マルチスレッドデバッグ DLL (/MDd)」に変更します(下の画像参照.2020/1/20追記).これで「ビルド」.するとWin64\binフォルダに,OpenSees.exeができるはず.