Category Archives: Fortran

本の紹介:Fortran90/95

Fortranって他の言語と比べると圧倒的に書籍が少ない。
本屋さんでもコーナーちっちゃい。。。(T_T)

TRNSYSではCppでもコンポーネント作成できますが、いかんせん、サンプルプログラムの仕様がゆるく、現状有姿って書いてある。オイオイ。。。

という理由で、TRNSYSコンポーネントの作成には、Fortranをオススメしています。

コンポーネントはFortran77の書式でも作れますが、Fortran90/95のほうがプログラムは書きやすいです。
Module文が使えるとか、一行に書ける文字数を気にしなくていいとか、動的に配列を扱えるとか。

オススメの書籍:
数値計算のためのFortran90/95プログラミング入門 森北出版
例題とともに書いてあるのでわかりやすいです。

以上、Over!!

それゆけ!Fortran。配列を動的割付

Fortran90から配列の大きさをプログラムの中で動的に変えられるようになりました。

使い方はこんな感じ。
宣言して
Double Precision,allocatable::MatrixA(:,:)
integer i,j,num1,num2

割り付ければOK.
allocate(MatrixA(1:num1,1:num2))

いつもの?配列として使えます。
read(*,*) ((MatrixA(i,j),j=1,num1),i=1,num2)

設定した配列を解放するには
deallocate(MatrixA)
ですよー。

以上、OVER!!

それゆけ!Fortran。Module文

FortranでTRNSYSのコンポーネント作成する際、使いまわしをできる処理はSubroutine化したほうが間違いが少なくなります。

Fortranのsubroutineでは、呼び出す変数をいちいち宣言しないといけないので、よく使う変数や定数があるようであれば、Module文を用意してその中に書くようにするとglobal変数として扱えるようになるので便利です。

このModule文、Fortran90からの機能でFortran77のCommonブロックと同じような機能です。
Module文は変数だけでなく、処理に対しても使えます。
う~ん、例えば、ラジアンと角度の変換式とか。

TRNSYSで使う場合は下のような感じ。

(1)拡張子の変更
proformaの[File]->[export as…]でfortranのソースコードを書き出すと.for形式で書き出されるので、拡張子をひとまず.f90に変更。
これでFortran90の機能が使えるようになります。
このあたりの詳しい話は、TRNSYS.JP 1号のページをどうぞ。

(2)Module文は文頭で作成
module CommonVariablesAndConstants
・・・
end module CommonVariablesAndConstants

(3)Module文の宣言
Use TrnsysConstants
Use TrnsysFunctions

と記載されている箇所があるので、そこに宣言を追加。Module名は(2)と同じ。
Use CommonVariablesAndConstants

TRNSYSのSorceCodeフォルダにあるType62, Type63, Type99などのソースコードが参考になるかもです。

ちなみに…
Type62はCalling Excel,
Type63はThermodynamic properties of substances with NASA CEA2,
Type99はCombined Data Reader and Radiation Processor
のコンポーネントです。

Type63のNASA CEA2って一体・・・。

以上、OVER!!

それゆけ!Fortran。計算過程の出力。

TRNSYSのコンポーネント作成中に、計算過程をタイムステップ毎、書き出してチェックしたい場合。

write文で書き出せばいいじゃんと思って書き出そうとすると、大概、収束するまでのイテレーション単位で書き出されます。
通常TRNSYSのソースコード中でcallしているSetOutputValueは、収束後の結果を出力してくれるsubroutineなので、それを使ってとりあえず書き出すという方法もありますが、チェックしたい項目が多いとそれも面倒です。

イテレーション単位ではなく収束した後の値をタイムステップ毎に書き出すには、最後に処理が通る場所、getIsEndOfTimestepのif文の中で記述すればOKです。

!Perform Any “After Convergence” Manipulations That May Be Required at the End of Each Timestep
If(getIsEndOfTimestep()) Then
!====== ここに記述する。 ======
! Open文
! write文
! Close文
!======
Return
EndIf

open文のpositionでappendを指定するのをお忘れなく~。(タイムステップ毎上書きされちゃいます)
debugの機能と組み合わせて使うとより楽ちんです。

以上、OVER!!

逆行列を求めたいの。

TRNSYSコンポーネントを作成する際、逆行列を求めたい場合があります。

逆行列を求めるプログラムを自分で書くというのもありですが、TRNSYSはInvertMatrixというsubroutineをもっているので、それを使用するという方法もあります。

このInvertMatrixで利用できる配列は50*50まで。
解法は、ガウスジョルダン法(掃き出し法)です。

Type19, Type37のコンポーネントでもInvertMatrixのsubroutineを使っていますので、マニュアル(07.Programmer’s Guide)とあわせてfortranのソースコードを参考にどうぞ。

ちなみに、Type19は、DETAILED SINGLE ZONEのコンポーネント、Type37は、Attached Sunspaceのコンポーネントでござるよ。

以上、Over !!

モバイルバージョンを表示。