Translate

2013/03/28

気象データを読んでみる

少々必要に迫られて生の気象データを読んでみました。
気象データって、基本的にテキストデータなので、メモ帳とかエディタで開けば中身を読むことができます。

Meteonorm

まずはMeteonorm(tm2)形式。
これはムリ((+_+))読めん。

テキストデータですが、まるで読む気にならないフォーマットです。ちゃんと定義を調べりゃ読めるはずですが、これ完全にプログラムで読むことしか考えてないですね。肉眼で読むのはキツイ。

EPW

気を取り直してEPW形式のファイルを開けてみる。
これもムリ((+_+))
Meteonormに比べれば、多少は読めますが、やっぱり定義と突き合せないと読めそうにないです。
仕方ないので(仕方なくもないが)フォーマット形式を調べてみると。。。
これが、どうも正式にドキュメント化されたものが無いっぽい。
参考↓
https://sam.nrel.gov/content/epw-weather-file-format

みんなどうやってプログラム書いてるんだ?
単にデータを見たいだけならNRELのツールを使えとコメントがあるので、早速ダウンロードしてみました。

NREL DView

インストールして、EPWを読みこませて表示。
 なるほど。気象データの項目が全部表示できる。これはこれで便利。
必要であればテキストに書き出しもできる。
ひとまず、これでデータの内容は確認できるので、生データの解析はできそうです。

2013/03/15

No single-threaded DLL option

TRNSYS-Usersを見ていたら、FORTRANコンパイラの設定の質問が流れていました。

No single-threaded DLL option

Type29をビルドしなおしてみたら、コンポーネントからのファイル作成時にエラーになってしまうようです。現象としては"fort.xxx"というファイルの書出しに失敗するというもの。

対策としてコンパイラの設定を変更しようとしたけど、該当項目がない。しょうがないのでWindowsXpとCompaq Fortranで対応したどWindows7の環境で何とかならんの?という質問。


これと全く同じ話で最近悩んだので、以下、備忘のため書いておきます。


質問者のメールには書いてないけど、この件の対策の元ネタはTRNSYSのドキュメントの以下の記載。

7.5.2.6. Troubleshooting multiple DLL's


ここに原因と対策が記載されているんですが、悩んだのが対策の記述。

set "Project Settings\Fortran\Libraries" to "Single-threaded DLL" in the Visual Studio

Visual Studioでライブラリーの設定を変更しろとありますが、Intel Visual Fortran(以下、IVF)のライブラリーの設定に"Single-threaded DLL"って無いんです。

でも、IVFの場合はここで、単に"Mutli-threaded DLL"を選べばOK。エラーの原因になるのはSingleかMultiかの違いじゃなくて、ライブラリーをDLLにしているかStaticにしているかの違いです。
ということで"DLL"の方を選べばOKです。

実際の設定画面のキャプチャーを載せておきます。
  • Release

  • Debug

ただ注意しないといけないのは、TRNDLL側も同じ設定にしてビルドしないと、やっぱりエラーになります。



2013/03/14

TRNSYS Type79 とスピード対決

先日試しに実装してみたJavaScriptのコンポーネントとType79 W-Languageとスピード対決してみました。
Type79については、以前に紹介したこちらを参照。

前回と同じシンプルにサインカーブを描くスクリプトを用意して。実行。!
結果はというと。。。

惨敗です。。。


計算時間105.28秒に対して試作したタイプの処理時間104.76秒。ほぼコイツが計算時間を食っている。
対してType79の処理時間0.18秒!

W-Languageすげー!


2013/03/13

Intel Fortranで固定形式と自由形式の切り替え方法

FORTRANのソースコードの形式には固定形式と自由形式があります。前者はいわゆるFortran77互換の形式、後者はFortran90です。

Intel Fortranではどちらの形式にも対応していて、デフォルトではファイル拡張子で区別しているようです。


拡張子による判定
固定形式(Fortran77):*.for、*.f
自由形式(Fortran90):*.f90

TRNSYSが書きだすコンポーネントの雛形は拡張子*.forで書きだされます。つまり、Fortran77形式ですね。最初、この切替方法に気づかずに悩んでしまいました。
あるソースコードではコンパイルできるのに、同じ書き方を別のソースコードで書くとエラーになる。例えば、一行72文字を超えたコードがソースコードによってビルドできたり、できなかったりします。

新旧のソースコードが混在するときは、拡張子で分けてくれるので重宝しますが、それに気が付かないと、あれっ?ってな感じになります。

ちなみに一括してどちらかの形式を指定したい場合は、プロパティダイアログの以下の項目で設定します。

2013/03/11

TRNSYSでJavaScriptを使ってみる(試作です)


the JavaScript Code / Dmitry Baranovskiy

前回の投稿で、Equationの使い方を紹介しました。Equationはいろいろ使えて便利なんですが、ちょっと複雑な条件になると、それなりに工夫が必要になります。というか、だんだん一見して何の処理か解りにくいのが難点。
どうもプログラマ的な視点でみると、なんで普通にif-then-elseできないんだろうかと、そう思ってしまいます。

まー、でも判定式を実装しようとしたら、それなりに手間だ。ちょっとしたスクリプトを実装するのと変わらない。すげー大変。と、ここまで考えて、ふと気がついた。

オープンソースのスクリプトとか使えるんでは?


今時はフリーで使えるスクリプトエンジンが存在します。ちょっと調べてみると、組み込みできそうなのが幾つかあります。
代表的なのは、
・JavaScript
・Lua
・Ruby
さらに調べてみると、GoogleのJavaScriptエンジンなんかが割と簡単に実装できそうな事がわかります。こことか↓

人の話を聞かない人の V8 エンジン。 V8 を C++ に組み込んで遊ぼう

JavaScriptエンジン、しかもv8って、googleのブラウザ、Chromeに搭載されている超高速なやつです。これはもう、使わない手はないんでないかと。

Google JavaScript V8 Engineをコンポーネントに組み込む


早速、実装してみました。詳細は省きますが、ああだこうだと試行錯誤すること数日、土日を潰して、なんとか動くプロトタイプが出来上がりました。
仕組みは単純で、JavaScriptのエンジンに、コンポーネントのInputs/Outputsの値をやり取りする関数を追加しているだけです。かなりシンプルな拡張です。この関数を使って、JavaScript側でif-then-elseの処理を行います。


試しにEquationの例と同じ、タイムステップが特定の範囲内になったら、出力の値を変更するスクリプトを書いてみました。

例)暖房期以外は冷房期
暖房期 1/1-4/25, 10/21-12/31(1-2760, 7056-)
冷房期  4/26-10/20(暖房期以外)

var time = getInputValue(1);
if(time<=2760 || 7056 <= time)
{
     heating = true;
}
else

     heating = false;
}
cooling = (!heating);
setOutputValue(1, heating);
setOutputValue(2, cooling);

ちなみに前回のEquationで書いたのはこちら。

HEATING = or(le(time,2760 ),ge(time,7056)) 
COOLING = not(HEATING) 

こっちの方が行数が少なくて、なんかスッキリした感じだけど、可読性はやっぱりJavaScriptの方がいいですよね?(そんなことない?)

コンポーネントを配置して、スクリプトを用意したら、いよいよSimulation Studioから実行!

おー、ちゃんと動いた。Heatingの状態がOn/Offしているのが確認できます。

If-then-elseが使えりゃいいやって思ってたけど、スクリプトで簡易なコンポーネントのような使い方もできますね。例えば、こんな感じ。

サインカーブを描くスクリプト。

var inp2=getInputValue(1);
var ret;
ret = Math.sin(inp1 / 180 * Math.PI);
setOutputValue(1,ret);


おー、これも無事に動いた。

いろいろ使えそうな感じです。とはいえ、いいことばかりでもなくて実行速度が出ない。これがガッカリするぐらいに遅い。
コンポーネントの仕組み上、イテレーションごとにスクリプトのロードが発生します。おそらく、それが遅くなっている理由。

それとエディタもデバッガーもないので、エラーが起きても原因が何か調べるのも手探り状態。ちょっと普段使いには向かないですね、これじゃ。
スクリプトを使うことを思いついたときは、良いアイディアだと思ったんだけど厳しいですね。

もちょっと試行錯誤が必要そうです。

2013/03/06

TRNSYSのEquationで条件判定


Complementary Creative Commons Casio Calculator / Boaz Arad


TRNSYS-Usersを読んでいると、if-then-else処理の話題が出てました。

以下、メーリングリストからの抜粋ですが、TRNSYSで条件判定をやる場合、Equationを使って処理することになります。EquationにはGT(),LT()など、FORTRANでいう比較演算子に相当する関数が用意されています。これらを組み合わせて。。。

'For example, let's assume you would like to use the following "if-then-else"
statement:

if (Z>0) then
X=Y1
else
X=Y2
endif
The following equation will do the same:

X=GT(Z,0)*Y1+(1-GT(Z,0))*Y2

だいたいこんな感じで式を組み立てて判定します。
で、これを何に使うかというと、特定の条件でパラメータとか変えたい時です。
例えば、暖冷房機器の運転を冷房、暖房期間できっちりON/OFFしたい場合とかです。Equationを使って暖冷房期間の判定処理をして、冷房機に暖房が入ったり、逆に暖房機に冷房が入ったりといったことを避ける事ができます。

例)暖房期以外は冷房期 として処理する
暖房期 1/1-4/25, 10/21-12/31(1-2760, 7056-)
冷房期  4/26-10/20(暖房期以外)

これをEquationで表現すると、次のようになります。

HEATING = or(le(time,2760 ),ge(time,7056)) 
COOLING = not(HEATING) 

これでHEATING,COOLINGで、それぞれ暖房、冷房のOn/Off状態がつくれます。あとはType56のHeating TypeやCooling Typeで受け取って、暖房、冷房のPowerに渡してあげれば、暖房期間は暖房だけ、冷房期間は冷房だけというようなコントロールができます。

ちょっと慣れがいりますが、これを覚えると、いろんな場面で使えて重宝します。

2016/1/23 追記
1年以上の期間を計算すると、上記のやり方だと2年目はすべて暖房期間として判定されます。こまりますよねー。そういう場合は、mod()関数を使って、剰余として扱えば幸せになれます。
HOUR=mod(time,8760) 
HEATING = or(le(HOUR,2760 ),ge(HOUR,7056)) 
COOLING = not(HEATING)