fortran子程序传入可变数组要在module里实现

Posted OYP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fortran子程序传入可变数组要在module里实现相关的知识,希望对你有一定的参考价值。

坑死我了,我说怎么子程序传递不了可变数组

在写fortran程序的时候,要对矩阵实现特定的功能,如高斯法解线性方程组,很多时候子程序不知道矩阵的大小,如有限元程序中先要用程序得到总体刚度矩阵再把总刚传入求解矩阵方程的子程序中。所以实现子程序参数是可变数组的功能要将子程序放在module中。具体如下:

主程序1(kk1.f90):

 
 1 program main
 2 implicit none
 3 real,allocatable::a(:,:)
 4 integer::np
 5 allocate(a(2,3))
 6 a(1,:)=(/1.2,3.4,5.6/)
 7 a(2,:)=(/1.2,3.4,5.6/)
 8 call trya(a,np)
 9 write(*,*)np
10 end program main
 

子程序1(try1.f90):

 
1 subroutine trya(a,np)
2 implicit none
3 real,intent(in),allocatable,dimension(:,:)::a
4 integer,intent(out)::np
5 np = size(a,2)
6 end subroutine trya
 

显然该程序的目的是传入一个事先不知道大小的矩阵到子程序中,子程序功能是求出返回矩阵的列数。

用gfortran编译:gfortran try1.f90 kk1.f90 -o try 再运行try结果是 16368800   显然出错。

 

如果把子程序放在模块中,如下:

主程序(kk.f90):

 
 1 program main
 2 use try
 3 implicit none
 4 real,allocatable::a(:,:)
 5 integer::np
 6 allocate(a(2,3))
 7 a(1,:)=(/1.2,3.4,5.6/)
 8 a(2,:)=(/1.2,3.4,5.6/)
 9 call trya(a,np)
10 write(*,*)np
11 end program main
 

子程序(try.f90):

 
 1 module try
 2 implicit none
 3 contains
 4 subroutine trya(a,np)
 5 implicit none
 6 real,intent(in),allocatable,dimension(:,:)::a
 7 integer,intent(out)::np
 8 np = size(a,2)
 9 end subroutine trya
10 end module try
 

以上是关于fortran子程序传入可变数组要在module里实现的主要内容,如果未能解决你的问题,请参考以下文章

Fortran 中没有 Allocate() 的可变大小数组

fortran关于数组内部函数的问题

Fortran中的可变长度参数列表?

fortran如何在一个module中调用其他module的变量?

fortran里的数组赋值

从 Fortran 调用 C 函数,其中 C 函数名称最初是从 C 传入的