我正在嘗試創建一個全局可訪問的主程序和所有子例程的數據結構。數據結構是通過讀取一些.dat文件構建的。Fortran模塊和全局變量
這種全局可訪問性似乎適用於某個模塊。到目前爲止,我的模塊解決方案包括:1)全局定義數據類型; 2)在模塊中包含(包含)一系列子例程以打開/讀取.dat文件; 3)從.dat文件構造數據類型。
理想情況下,我想在模塊中構建這個數據結構ONCE,然後讓這個數據結構可以在全局訪問。我不想在每次調用模塊過程時打開/讀取.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