私はメインプログラムとすべてのサブルーチンにグローバルにアクセスできるデータ構造を作成しようとしています。データ構造はいくつかの.datファイルを読み込むことで構築されています。Fortranモジュールとグローバル変数
この種のグローバルなアクセシビリティは、モジュールにとって適切なようです。これまでの私のモジュールソリューションには以下が含まれます:1)データ型をグローバルに定義する。 2).datファイルを開く/読み込むためのモジュールにサブルーチンの束をインクルード(包含)する。 3).datファイルからデータ型を構築する。
理想的には、このデータ構造をモジュール内に構築し、この単一のデータ構造をグローバルにアクセス可能にしたいと考えています。私はモジュールのプロシージャを呼び出すたびに.datファイルを開いたり読んだりしたくない。
たとえば、メインプログラムからグローバル変数としてデータ構造を宣言し、モジュールプロシージャを呼び出してデータ構造を一度構築する方法はありますか?
@Ross。ソースコード:
module DataTypeModule
implicit none
type :: DatCube
integer :: NGrid(4)
double precision, allocatable :: tgrid(:)
end type DatCube
contains
subroutine DataArraySizes(NGrd)
implicit none
integer, intent(out) :: NGrd(4)
open(unit=15, file='./Data/DataHeader.txt', status='old')
read(15,*) NGrd(1)
read(15,*) NGrd(2)
read(15,*) NGrd(3)
read(15,*) NGrd(4)
close(15)
end subroutine DataArraySizes
subroutine DataTGrd(NGrd,tgrd)
implicit none
integer, intent(in) :: NGrd(4)
double precision, intent(out) :: tgrd(NGrd(1))
open(unit=16, file='./Data/tgrid.dat', status='old')
read(16,*) tgrd
close(16)
end subroutine DataTGrd
subroutine ConstructDataCube(DataCube)
implicit none
type(DatCube), Intent(out) :: DataCube
integer, allocatable :: NGrd(:)
double precision, allocatable :: tgrd(:)
allocate(NGrd(4))
call DataArraySizes(NGrd)
DataCube%NGrid = NGrd
allocate(tgrd(NGrd(1)),DataCube%tgrid(NGrd(1)))
call DataTGrd(NGrd,tgrd)
DataCube%tgrid = tgrd
deallocate(NGrd,tgrd)
return
end
end module DataTypeModule
program main
use DatatypeModule
implicit none
double precision :: arg1,out1(4)
type(DatCube) :: DataCube
call ConstructDataCube(DataCube)
call subrtn1(arg1,out1)
stop
end
subroutine subrtn1(arg1,out1)
use DataTypeModule
implicit none
double precision, Intent(in) :: arg1
double precision, Intent(out) :: out1(4)
type(DatCube) :: DataCube
out1 = DataCube%NGrid
return
end
私はあなたの混乱の原因を理解していません。なぜあなたのプログラムの始めに 'read_data'を一度呼び出すのではなく、どこからでも変数を'使う 'ことはどうでしょうか? – Ross
@Ross。メインプログラムまたはさまざまなサブルーチンからモジュールプロシージャを呼び出すたびに、.datファイルを開いたり読み取ったりしてデータ構造を構築します。それは巨大な時間のシンクです。 モジュールプロシージャー(データ構造体を構築する)を一度呼び、このデータ構造体をメインプログラムとすべてのサブルーチンにアクセス可能なグローバル変数として設定したいと思います。 多くのネストされたプロシージャがあるので、このデータ構造をすべてのサブルーチンの引数として渡したくありません。 – jkedmond
これは以前に投稿されたソースとは別のバージョンですが、小さく見えます。 – Ross