我目前正在编写一个处理(可能很大)数据数组的Fortran子例程。我正在使用来自多个模块的多个子例程,并且希望将输入数据数组以及输出数据数组作为全局变量,以便可以在每个子例程中读取/写入它们。但是,我想避免不必要地复制数据数组,因为我担心它会减慢整个程序的速度(如前所述,数据数组可能非常大,大约有10.000x5个条目)。
此刻,我使用一个变量模块,其中包含所有子例程的全局变量。我将输入和输出数组读入子例程,然后将输入值复制到全局数组,执行计算,然后将全局输出数组复制到子例程中的输出数组。子例程的代码如下:
subroutine flexible_clustering(data_array_in, limits_in, results_array_out)
use globalVariables_mod
use clusterCreation_mod
use clusterEvaluation_mod
implicit none
real*8, dimension(:,:) :: data_array_in
real*8, dimension(:) :: limits_in
real*8, dimension(:,:) :: results_array_out
! determine dimensions
data_entries_number = size(data_array_in(:,1))
data_input_dimension = size(data_array_in(1,:))
data_output_dimension = size(results_array_out(1,:))
! allocate and fill arrays
call allocate_global_variable_arrays()
data_array = data_array_in
limits = limits_in
! clustering
call cluster_creation()
call cluster_evaluation()
results_array_out = results_array
call reset_global_variables()
end subroutine flexible_clustering
此处使用的全局变量在globalVariables_mod中定义如下(带有适当的allocate / deallocate子例程):
integer :: data_entries_number = 0, data_input_dimension = 0, data_output_dimension = 0
integer :: total_cluster_number = 0
real*8, allocatable, dimension(:) :: limits
real*8, allocatable, dimension(:,:) :: data_array
real*8, allocatable, dimension(:,:) :: results_array
总结一下,我将data_array_in,limits_in和results_array_out复制到data_array,limits和results_array,以使其成为所有子例程中的全局变量。
是否可以忽略此复制?也许使用指针?我可以用另一种方式优化吗?
谢谢!