問題タブ [fortran90]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arrays - Fortran90 配列が空白値を null として読み取る
外部テキスト ファイル (30 行、7 列) からデータを読み取っています。各行は「,」で区切られています。「、、」で表される欠損値があります。データを 2 次元配列に読み込むと、欠損値は 0.00 に置き換えられますが、データにも 0.00 の値があります。私が平均を計算しているとき、カウント(アイテムの数(n))はカウント-(欠損値の数)であることが示されました。欠落している値を動的に選択するにはどうすればよいですか。
ありがとうスリ
データ
arrays - 二次元配列の読み取り
Fortran 90 の外部ファイルから 2 次元配列 (30.7) を読み取ろうとしています。
データには、空白として表される欠損値がいくつかあります。データを array に読み込むと、欠落しているデータ(,*)(indices(i,j))
が割り当てられます。0.00
この問題をどうやって乗り越えますか?以下にデータを添付します。
binary - Fortran 90 バイナリに保存されたデータを人間が読める形式に変換する
あなたの経験では、Fortran 90 で大きな配列を出力ファイルに保存する最良の方法は何ですか? 以前は、大きな配列を ASCII テキスト ファイルに書き込もうとしていました。たとえば、次のようにします (ページの下部にある推奨事項のおかげで、Fortran 90 では、行単位で配列をテキスト ファイルに書き込む良い方法は何ですか? ):
これは機能しますが、 In Fortran 90の一番上の返信で指摘されているように、行単位で配列をテキスト ファイルに書き込む良い方法は何ですか? 、テキスト ファイルへの大きな配列の書き込みは非常に遅く、必要以上に大きなサイズのファイルが作成されます。そこのポスターは、代わりに次のようなものを使用して、フォーマットされていない Fortran バイナリに書き込むことを推奨しています。
これは機能しているようで、実際にははるかに高速であり、返信here で約束されているように、ファイルサイズが小さくなります。しかし、後で Fortran バイナリ (上記の output.dat など) に保存されたデータを操作してその内容を分析できるようにしたい場合はどうすればよいでしょうか? たとえば、バイナリに格納されている配列を Microsoft Excel などのプログラムで開きたい場合はどうすればよいでしょうか?
以前の投稿でmatlab について言及したとき、返信では、バイナリを 16 進数ファイルとして開き、そこからレコードを見つけて抽出するよう提案されました。しかし、私は 16 進法による調査の経験がないため、深い水域に入ることに不安を感じています。Fortran ファイルの読み取りについて、matlab ボード (ここ: http://www.mathworks.com/matlabcentral/answers/12639-advice-on-reading-an-unformatted-fortran-binary-file-into-matlab ) で質問したときmatlab に入ると、その人は Fortran ストリームを使用するのは簡単かもしれないと提案しました。しかし、Fortran ストリーム (つまり、コマンドでディレクティブを使用ACCESS="STREAM"
) はOPEN
、上記の最初の例で作成した ASCII テキスト ファイルと時間とファイル サイズが似ているでしょうか?
または、Fortran バイナリを人間が読める形式に自動的に読み取ることができるソフトウェアが他にあるかどうか知っていますか? (または、16 進数の調査または Fortran ストリームに関する優れたチュートリアルを知っていますか?)
どうぞよろしくお願いいたします。
vb.net - Visual Basic2010からFortranDLLに文字列を渡すにはどうすればよいですか?
整数、シングル、ダブル、およびこれらすべての配列を問題なく前後に渡すことができます。しかし、VisualBasic2010の文字列をFortranDLLの文字変数に渡す方法がわかりません。エラーが発生し続けPInvokeStackImbalance
ます。Visual Basic文字列を各文字のASCIIコードを含む整数配列に変換し、それを送信してDLL内に戻すこともできますが、それは哀れです。これを行う簡単な方法が必要です。
最初Dim txt(50) as Char
にVB2010とDVFF90DLLで使用してみまし character*50 txt
たが、機能しませんでした。
次にDim txt as String
、Visual Basic 2010で文字列を50文字の長さにしました(49文字も試しました)が、これは機能しませんでした。
他の誰かがファイル名などをDLLに渡したいと思っていることを願っています。
fortran - 配列からベクトルを抽出しようとする際のFortran90ランクの不一致
私のFortran90コードでは、整数の次の配列( arrayと呼ばれる)を作成しました。
最初の列を抽出し、 timeという4要素のベクトルに保存したいと思います。私は次のコードを持っています:
しかし、次のエラーメッセージが表示されます(gfortranでコンパイルする場合)。
なぜそうなのですか?エラーメッセージは、配列がランク1ではなくランク2であることを示唆しているようです。ランク1の配列にarray(:,1)
変換する方法はありますarray(:,1)
か?RESHAPE
どういうわけかアレイをスクイーズするために使用する必要がありますか?または、を使用してarray(:,1)
、行ベクトルではなく列ベクトルを指定しているという問題はありますか?お時間をいただき、誠にありがとうございます。
fortran - Fortran 90 で引数を渡すスマートな方法
私は Fortran の初心者です。メイン プログラムから 4 つの引数を受け取り、最初に渡された 4 つの引数を含む配列をメイン プログラムに出力するサブルーチンを作成しようとしています。これを行う良い/スマートな方法は何ですか?
たとえば、以下のテスト プログラムでは、メイン プログラムで4 つの実数変数 ( a
、b
、c
、および) を作成します。d
次に、これらの実数変数を というサブルーチンに渡しますmysub
。、、、およびをmysub
取り込み、それらを使用して と呼ばれる 2 行 2 列の配列を設定し、メイン プログラムに送信してそこで表示 (および可能な変更) できるようにしたいと考えています。だから、私は次のことを試しました:a
b
c
d
o
o
しかし、次のエラーが表示されます。
私はこれを、サブルーチンヘッダーの引数のリストにないo
ため、コンパイラーが何であるかを知らないと解釈します: . したがって、おそらくそのヘッダーに含める必要があります。そこで、次に次のことを試します (ここでは、 を使用して変更または追加を示しています)。o
SUBROUTINE mysub(w,x,y,z)
o
!...
これはうまくいくようで、正しい出力が得られます。
しかし、私の質問は、これはこれを行う良い方法ですか? この作業例では、サブルーチンとメイン プログラムのo
両方で配列を宣言しています。これは、サブルーチンまたはメインプログラムのいずれかが割り当てられるように注意する必要があることを意味するため、混乱を招く可能性があるようです(ただし、エラーメッセージを回避するために、両方ではないと思います)。サブルーチンからメイン プログラムに配列を送信する、よりスマートな方法はありますか? お時間をいただきありがとうございます。o
fortran - FORTRAN90の同じ行に複数のステートメントがあります
「;」を使用して同じikeに割り当てた一連の割り当てがあります。statemntsを分離するために、しかし私はこのエラーを受け取ります:
1.0; lb(1,9)1エラー:ファイルLJ.F90:223の(1)にある分類できないステートメント
各ステートメントが独自の行にある場合にコードを機能させると、どこから来ているのかわかりません。コードは本当に簡単です...
私が愚かに間違っているのは何ですか..以下のコードはすべて1行にあります。
parallel-processing - Fortran90の並列使用法を理解する
上記のFortran90コードでは、同期、通信、および算術の観点からどのように実行されるかを知りたいと思います。
私が理解しているのは:
コミュニケーションとは、互いにコミュニケーションをとるためのさまざまなタスクの必要性です。たとえば、他の変数との依存関係がある変数がある場合です。しかし、上記のコードは、何らかの通信があることを示していません。依存関係がないようですが、私は正しいですか?
同期は通信にいくらか関連していますが、バリアが使用されているかどうかも関係します。しかし、上記のコードには障壁はありません。したがって、関係する同期は、データの依存関係があるかどうかだけです。
算数私にはこの点についての手がかりがないので、誰かが私にそれを説明してくれたら嬉しいです。
scope - Fortran 90 のサブルーチンおよび関数内の引数/変数の INTENT の意味
INTENT
Fortran のサブルーチン内の変数についていくつか質問があります。たとえば、数週間前、私は別の Fortran トピックに関する質問を投稿しました ( Fortran 90 では、テキスト ファイルに配列を行単位で書き込む良い方法は何ですか? )。返信の 1 つに、定義するコードが含まれていました。tick
とtock
コマンド。これらは、コードの実行時間を計るのに役立つことがわかりました。tick
と以下を貼り付けtock
て、簡単な例で使用して、DO
ループの時間を計ります。
これは、私の最初の質問につながります(以下の2番目の質問は、INTENTが明示的に指定されていないINTENT
サブルーチンまたは関数の引数/変数に関するものです):
タイマーを開始するには、 を書きます。
CALL tick(myclock)
ここmyclock
で、 は整数です。サブルーチンのヘッダーはであるため、引数としてSUBROUTINE tick(t)
ダミー整数を受け入れます。t
ただし、サブルーチン内でt
は INTENT(OUT): が与えられますINTEGER, INTENT(OUT) :: t
。どうすればいいの?私の素朴な仮定は、INTENT(OUT) は、この変数の値が変更され、サブルーチンからエクスポートされ、読み込まれないことを意味するということです。しかし、明らかt
にサブルーチンに読み込まれています。整数myclock
をサブルーチンに渡しています。t
は INTENT(OUT) として宣言されているので、それもt
入ってくるように見えるのはどうしてでしょうか?function
tock(t)
では、整数変数now
とclock_rate
に明示的に INTENT が指定されていないことに気付きました。では、これらの変数のスコープは何ですか? 関数内now
でclock_rate
のみ表示されますか? (そのような構文はありませんが、INTENT(NONE) や INTENT(LOCAL) のようなものですか?) そして、これは関数ですが、サブルーチンにも同じことが当てはまりますか? サブルーチンを書いているときに、このような「一時的な」変数を宣言したい場合があります。これは、サブルーチン内でのみ見られる変数です (たとえば、最終出力の割り当て前のステップで入力を変更するため)。これは、指定された INTENT の欠如が達成するものですか?
テキスト ( Hahn による Fortran 90 テキスト)を調べたところ、彼は引数の意図について次のように簡単に説明しています。
引数の意図。 ダミー引数は、 intent属性で指定できます。つまり、それらを入力として使用するか、出力として使用するか、またはその両方として使用するかを指定できます。
インテントが IN の場合、サブプログラム内で仮引数の値が変更されていない可能性があります。
インテントが OUT の場合、対応する実引数は変数でなければなりません。のような呼び出し
CALL PLUNK(A, (B), C)
(B) は式であり、変数ではありません。
インテントが INOUT の場合、対応する実引数は再び変数でなければなりません。
仮引数に意図がない場合、実引数は変数または式である可能性があります。
すべての仮引数にインテントを指定することをお勧めします。特に、すべての関数の引数にはインテント IN が必要です。インテントは、INTENT(INOUT) X、Y、Z のように別のステートメントで指定することもできます。
上記のテキストは、引数/変数のスコープについて言及していないようです。主に、サブルーチンや関数内で引数/変数の値を変更できるかどうかについて話しているようです。これは本当ですか?もしそうなら、INTENTに関するスコープについて何を仮定できますか?