2016-09-28 15 views
1

私はhdf5 Fortranライブラリで動作するモジュールを設計しています。このモジュールには、さまざまな型と形状の配列をファイルに読み書きするためのサブルーチンが含まれています。サブルーチン引数として未知のランクの配列

配列の形状と型に関係なくwriteToHDF5(filepath、array)を呼び出せます。私はインターフェイスが異なるタイプでこれを達成するために使用されなければならないことを認識しています。私はしかし、配列の仮定された形状を持つことが可能かどうか疑問に思っています。

アレイは、このような

integer(kind=4), dimension(*),intent(in) :: array 

として定義された二次元アレイは、これがうまくいく渡された場合。配列の各シェイプに対して別々のサブルーチンを作成せずにこれを行う方法はありますか?

+1

'dimension(*)'はサイズとみなされ、形状とはみなされません。 'integer(kind = 4)'は悪いです、それは移植可能に4バイトを意味しません。 –

+0

'writeToHDF5'の実際の定義は何ですか?あなたはそれをまったく変更できますか? –

+1

Fortran 2015に*想定ランク*と呼ばれるものがあります。https://www.ibm.com/support/knowledgecenter/SSGH4D_15.1.0/com.ibm.xlf151.aix.doc/language_ref/assumedrankobject.html便利です主にC interop用です。 –

答えて

3

Vladimir Fによれば、Fortran 2015には "仮定ランク"が追加されています - このです。Fortran-Fortran(FortranバインディングではMPIから要求されました)追加の合併症を伴わずに直接それをしてください。いくつかのコンパイラはこれを既にサポートしていますが、これが少し便利なように新しく追加されたSELECT RANK構造をサポートするものはほとんどありません。

ただし、C_LOCとC_F_POINTERを使用して、想定ランクダミーを任意のランクの配列へのポインタに「キャスト」することができます。

スタンダード(Fortran 90に戻っても)があなたにここを出します。 call writeToHDF5(filepath, array(1,1))(ここでは配列がランク2であると仮定します)、呼び出されたプロシージャの明示的なインタフェースでは、「シーケンス関連」の魔法によってダミー引数のランクを指定できます。ただし、いくつかの制約があります。特に、配列は想定形状またはPOINTERにすることはできません。

+0

ここで*有用な*という単語の最初の出現箇所を*使用可能な*に変更することがあります。 –

+1

ジェネリックインターフェイス、特に気になるのがメモリブロックである場合に非常に便利です。 –

+0

もう1つの便利なアプローチは、MAPとUNIONを使用し、同じメモリを表現し、(N、M)と(NxM)を使用することです。これはDECORT拡張子を付けたifortで動作します。あなたは配列とおそらくNとMを渡します。これと別の便利なことは、N = 2または3でMが非常に大きい場合、おそらく '構造'のデータのようです。 1Dバージョンは、時間のピール/残りのものが起こることなく、ベクトル化します。別のオプションは、RESHAPEを使用して(...、N、M)を使用して1Dから2Dに形状を内部的に並べ替えることです。私は個人的には、ポインタを使用するだけでなく、境界違反を回避する方が簡単だとわかります。 – Holmz