找回密码
 注册
Simdroid-非首页
查看: 338|回复: 9

[3. Fortran] 在子程序中用ALLOCATABLE

[复制链接]
发表于 2005-7-10 09:17:20 | 显示全部楼层 |阅读模式 来自 华南理工大学
在子程序使用ALLOCATABLE可以吗?
为什么我的子程序中使用这个,编译的时候出现问题?
如果不能用的话
应该怎么办?

程序如下:
program test1
  real,dimension(:,,allocatable::A1
  real,dimension(:),allocatable::X1
  real,dimension(:),allocatable::Y1
  INTEGER m
  allocate(A1(m,m+1))
  allocate(X1(m))
  allocate(Y1(m+1))
  m=4
  A1(1,1)=0.2368
  A1(1,2)=0.2471
  A1(1,3)=0.2568
  A1(1,4)=1.2671
  A1(1,5)=1.8471
  A1(2,1)=0.1968
  A1(2,2)=0.2071
  A1(2,3)=1.2168
  A1(2,4)=0.2271
  A1(2,5)=1.7471
  A1(3,1)=0.1581
  A1(3,2)=1.1675
  A1(3,3)=0.1768
  A1(3,4)=0.1871
  A1(3,5)=1.6471
  A1(4,1)=1.1161
  A1(4,2)=0.1254
  A1(4,3)=0.1397
  A1(4,4)=0.1490
  A1(4,5)=1.5471
  call gauss_3(m,A1,X1,Y1)
  print *,(X1(i),i=1,m)
end

subroutine gauss_3(n,A,X,Y)
  real,dimension(:,:),allocatable::A
  real,dimension(:),allocatable::X
  real,dimension(:),allocatable::Y
  integer i,j,k,n
  real sum
  allocate(A(n,n+1))
  allocate(X(n))
  allocate(Y(n+1))
  do i=1,n
   do k=i+1,n
     if(abs(A(i,i))<abs(A(k,i))) then
       Y(i:n+1)=A(i,i:n+1)
       A(i,i:n+1)=A(k,i:n+1)
       A(k,i:n+1)=Y(i:n+1)
     endif
   enddo
   do j=i+1,n
     A(j,i:n+1)=A(j,i:n+1)-A(j,i)/A(i,i)*A(i,i:n+1)
   enddo
  enddo
  X(n)=A(n,n+1)/A(n,n)
  do i=n-1,1,-1
   sum=0
   do j=n,i+1,-1
     sum=sum+A(i,j)*X(j)
   enddo
   X(i)=(A(i,n+1)-sum)/A(i,i)
  enddo
end
发表于 2005-7-10 11:11:17 | 显示全部楼层 来自 大连理工大学

Re:在子程序中用ALLOCATABLE

Simdroid开发平台
Allocate中使用了m,但之前没有定义。
"m=4"应放在“INTEGER m”后,这样Allocate才有 意义
 楼主| 发表于 2005-7-10 20:10:50 | 显示全部楼层 来自 华南理工大学

Re:在子程序中用ALLOCATABLE

但是编译中
主程序没有出现问题
出现问题的是在子程序SUBROUTINE中的

斑竹能否指点一二?
发表于 2005-7-10 20:36:48 | 显示全部楼层 来自 北京

Re:在子程序中用ALLOCATABLE

你的问题应该我也遇到过(如果我没有把你的问题理解错的话),下面就是我的解决方法,供你参考、选择。

如果你一定想在子程序中使用动态数组的话,请将子程序都放到一个模块(MODULE)中,然后再在主程序中源代码开头部分引用这一模块,然后在语句中调用子程序就行;如果你把子程序和主程序放在同一个文件中时,子程序中又带有动态数组声明,编译时可能会出现“虚参个数不够的”提示,这时只需吧子程序进行修改,把动态数组的大小也加到子程序定义参数中传递到子程序中,这样子程序中的该数组实际用常规数组声明方式声明就行。

呵呵不知道我这样说你明白了没有,也可以看我以前的回帖。

http://www.simwe.com/forum/viewthread.php?tid=511412

评分

1

查看全部评分

 楼主| 发表于 2005-7-11 08:31:04 | 显示全部楼层 来自 华南理工大学

Re:在子程序中用ALLOCATABLE

谢谢BG老兄啊
按照BG老兄的建议
我在子程序,直接用N替代,不使用ALLOCATION,
直接使用DIMENSION就完全可以了
就解决了

至于MODULE,我买的书中没有这个部分,
不知道哪位好心的斑竹
可以传一个上来
发表于 2005-7-11 09:34:50 | 显示全部楼层 来自 北京

Re:在子程序中用ALLOCATABLE

在网上搜搜就能找到相关材料,你的程序好像是高斯积分的子程序,在做有限元?

斑竹,发问人问题解决,加点分吧,好久没吃分了,呵呵
发表于 2005-7-11 14:27:55 | 显示全部楼层 来自 清华大学

Re:在子程序中用ALLOCATABLE

呵呵,fortran90关于allocatable的规则如下,其中说明不能直接用作虚参,
a Is the name of the allocatable array; it must not be a dummy argument or function result.

具体如下:
ALLOCATABLE
Statement and Attribute: Specifies that an array is an allocatable array with a deferred shape. The shape of an allocatable array is determined when an ALLOCATE statement is executed, dynamically allocating space for the array.

The ALLOCATABLE attribute can be specified in a type declaration statement or an ALLOCATABLE statement, and takes one of the following forms:

Type Declaration Statement:

type, [att-ls,] ALLOCATABLE [att-ls,] :: a[(d-spec)] [, a[(d-spec)]] ...

Statement:

ALLOCATABLE [::] a[(d-spec)] [, a[(d-spec)]] ...

type
Is a data type specifier.

att-ls
Is an optional list of attribute specifiers.

a
Is the name of the allocatable array; it must not be a dummy argument or function result.

d-spec
Is a deferred-shape specification (: [, :] ...). Each colon represents a dimension of the array.
Rules and Behavior

If the array is given the DIMENSION attribute elsewhere in the program, it must be declared as a deferred-shape array.

When the allocatable array is no longer needed, it can be deallocated by execution of a DEALLOCATE statement.

An allocatable array cannot be specified in a COMMON, EQUIVALENCE, DATA, or NAMELIST statement.

Allocatable arrays are not saved by default. If you want to retain the values of an allocatable array across procedure calls, you must specify the SAVE attribute for the array.

Compatibility

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

See Also: Type declaration statements, Compatible attributes, DEALLOCATE, Arrays, Allocation of Allocatable Arrays, SAVE

Examples

  !Method for creating and allocating deferred-shape arrays.
  INTEGER, ALLOCATABLE :: matrix(:,
  REAL, ALLOCATABLE    :: vector(:)
  ...
  ALLOCATE(matrix(3,5),vector(-2:N+2))
  ...

The following example shows a type declaration statement specifying the ALLOCATABLE attribute:

  REAL, ALLOCATABLE :: Z(:, :, :)

The following is an example of the ALLOCATABLE statement:

  REAL A, B(:)
  ALLOCATABLE :: A(:,:), B

评分

1

查看全部评分

发表于 2005-7-11 14:37:18 | 显示全部楼层 来自 清华大学

Re:在子程序中用ALLOCATABLE

居然自动把(  :  )转成了(
发表于 2005-7-11 18:27:06 | 显示全部楼层 来自 北京

Re:在子程序中用ALLOCATABLE

在VF6.0中将子程序放入模块中加以引用是可以的,楼上的可以试试,不过VF6.0可能已经是FORTRAN95的协议了。
发表于 2005-7-11 22:05:16 | 显示全部楼层 来自 清华大学

Re:在子程序中用ALLOCATABLE

呵呵,我想在子程序里用allocate可以,但要把子程序的参数定义成allocatable,我回头试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 01:34 , Processed in 0.067115 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表