Translate

2013/08/28

Simulation Studioのアイコンの表示を変更する

TRNSYS/Simulation Studioのアイコン表示を変更する


アイコンのType番号の表記を変更する方法です。解像度の高いPC、特にノート型なんかだと、文字が小さくなりすぎてType番号の表記が見にくくなります。
そういう時には、フォントの大きさを変更すると見やすくなります。

1. 「Component Properties」ウィンドウを表示する

変更したいアイコンを選んで右クリックで表示されるメニューから「Properties」を選択する。

2. フォントサイズを変更する

「Font」タブで、文字の大きさを変更して、「適用」ボタンをクリックする。

図のように、アイコンの文字が大きくなったら終了です。

2013/08/26

FORTRANでWindowsイベント処理

計算型のコンポーネントを作ったら。。。


条件が成立するまでWaitと計算を繰り返すコンポーネントを作ったら、止まらなくなりました。
いや、いずれ条件が成り立てば止まるんですが、途中で止めたくても止まらなくなってしまいました。

具体的にどうなるかというと。。。

計算が全く進まない状態。条件の成立を待ちをしているので、これはこれで正常な状態。

でも途中で止めたくなって「Abort」ボタンをクリックすると。。。。
これが、本格的に問題があるようなメッセージになってしまう。とほほっ。。。

これはなんか格好が悪い

これって、Windowsのイベント処理の問題というか、コンポーネントが計算に夢中になって処理を返さないのが原因。VBなんかでも計算型のプログラムを書くと陥りやすいパターンです。VBにはDoEvents()っていう便利な関数が用意されているので、適当なタイミング、一般的には時間の掛かりそうなループの途中で呼んであげれば簡単に解決できます。

しかし、今回はFORTRAN。そんな便利な関数はない。というか、言語仕様にそんな機能があったら変だ。

だが、そこはIntel FORTRANのこと、なんか用意してそうだと思ったら、やっぱりありました。Win32 APIを直接呼び出しているサンプルが!

ということで、DoEvents()もどきのサブルーチンに仕立ててみました。
こいつを適宜呼び出すことで無事に解決。

! 呼出し側   
! 計算の途中でイベントの処理を流す   
Call DoEvents() !Windowsイベントを処理する

!-----------------------------------------------------------
! イベント処理   
!-----------------------------------------------------------
SUBROUTINE DoEvents()

use IFWINTY
use USER32
use IFLOGM
logical lNotQuit, lret
integer iret
TYPE (T_MSG) mesg
lNotQuit = .TRUE.
do while (lNotQuit .AND. (PeekMessage(mesg, 0, 0, 0, PM_NOREMOVE) /= 0))
  lNotQuit = GetMessage(mesg, NULL, 0, 0)
    if (lNotQuit) then
      if (DLGISDLGMESSAGE(mesg) .EQV. .FALSE.) then
         lret = TranslateMessage(mesg)
         iret = DispatchMessage(mesg)
      end if
    end if
end do

END SUBROUTINE DoEvents



2013/08/22

FORTRANで四捨五入


Binary Coded Decimal / pboyd04


TRNSYSのコンポーネントを書いて、計算に組み込んでみたら、すかっと落ちる。
これがエラーメッセージが表示されるわけでもなく、ログにも手がかりなし。

調べてみると、どうも計算誤差が原因っぽい。

計算上は本来はゼロになる条件なのに、どうも誤差の積み重ねで変な値が出来上がっている模様。
ループの中で計算しているとありがちですよね。

ということで四捨五入

しょうがないので小数点以下の適当なところで四捨五入して誤差を吸収しようとしたら、FORTRANに適当な関数が無いんですね。(知らないだけか?)

ひとまず文字列に変換する処理で実装してみたんだけど、これだと遅くないかな?
みんなどうやってんだろう?なんか定石がありそうな気がする。

! 四捨五入
CONTAINS
DOUBLE PRECISION Function QRound(val)
    DOUBLE PRECISION val
    Character(20) valStr
   
    write(valStr, '(f0.5)') val ! 実数を文字列に変換
    read(valStr, *) val         ! 文字列を実数へ変換

    QRound = val
    return
End Function QRound  

追記:
こういう書き方もありますね。こっちの方が、3倍は速い。(呼び出し回数が少ないので、全体でみると、ほぼ同じなんですがね)

DOUBLE PRECISION Function QRound2(val)
    DOUBLE PRECISION val
    Qround2 = aint( val * 10000.0) / 10000.0
End Function QRound2

2013/08/20

FORTRANでプリプロセッサーを使う

TRNSYSのコンポーネント書いてて、デバッグ用にメッセージの処理を入れてたんですが、これってデバッグモードの時だけ出力するようにできないかと思ったので調べてみました。

実際にやってたのは、こんな感じの処理。

    filename = getLUFilename(LU)
    Open (unit=LU,file=filename,action='READ',status='OLD',err=200)
    Call Messages(-1,'Reding the data file...',             'Notice',CurrentUnit,CurrentType)

単にファイルが開けたか確認したかったので、ファイルの読み込みが始まったらログにメッセージを書き出しています。
デバッグ中はこれでいいんですが、リリースモードでもログに書き出されるのもちょっとうっとおしい。これも含めて、他にも数か所あるので、ログがごちゃごちゃしてて見にくい。

プリプロセッサを使う

Intel Fortranのドキュメント調べたら、どうもC/C++なんかと同じようにプリプロセッサがつかえるらしい!

という事で、こういう時は、#ifdef/#endifで囲んであげればオッケー。

    filename = getLUFilename(LU)
    Open (unit=LU,file=filename,action='READ',status='OLD',err=200)
#ifdef debug
    Call Messages(-1,'Reding the data file...',             'Notice',CurrentUnit,CurrentType)
#endif



これ使う場合、ちょっと条件があって、
  • ソースコードは自由形式(拡張子.f90)
  • #ifdef/#endifは1カラム目から書く(途中から書くと無視される)

プロパティの設定


それとプロジェクトのプロパティでプリプロセッサの指定も忘れずに!


  • Debugモード


  • Releaseモード





2013/08/15

TRNSYSの情報サイトを作ってみる

夏休みなのでTRNSYSのサイトを作ってみました。

日頃TRNSYSをネタに、いろいろ書いていますが、思いつきで書くことが多くて、いまいちまとまりに欠けるなー、と常々思っておりまして、内容に応じてまとめられないかなと。

Googleのサービスの一つ、Google Siteでちょちょちょいと、作ってみました。このブログのエントリーの他、役に立ちそうなサイトへのリンクなどもまとめています。

TRNSYS NOTE(Beta)

ちなみに、勢いで作ったので、まだまだ内容が薄いです。これから過去のエントリーを遡って、まとめたいと思います。
まだまだ試行錯誤中なので、サイトの構成とかレイアウトとか、予告なしに変更すると思いますが、ご容赦ください。
そんなわけで、しばらくタイトルには「Beta」の文字を入れおります。

Google Siteって、いまいち人気なさげなので、せっかく作ったのに無くなってしまわないかというのが目下の気がかりです。





2013/08/14

30度超えたらツィートする

夏休みの工作でIFTTTのレシピ作ってみました。

IFTTTが何かっていうと、なんだろ?複数のウェブサービスを組み合わせたレシピと呼ばれるスクリプトを作ってくれるサービスです。(説明あってるかな?)

ちょこっとやりたいことがあってIFTTTをいじってて、天気予報のデータが拾えることに気づきました。

で、作ってみたのがこちら。
30℃を超えたらツィートする

天気予報サービスから東京の気温を取得して、30℃を超えたらツィートするレシピ。

製作時間1分未満。こんなに簡単に作れていいのかレベルでした。

Google Driveへ書き込みなんかもできるので、予報データを記録するようなのも簡単に作れそうです。なにか工夫次第じゃ、面白いことができそうですね。