Fortran Coder

查看: 9098|回复: 3
打印 上一主题 下一主题

[子程序] 求改正,输出多个子程序返回值的问题

[复制链接]

5

帖子

3

主题

0

精华

入门

F 币
50 元
贡献
27 点
跳转到指定楼层
楼主
发表于 2014-5-6 20:55:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写的第二个子程序中call sub1  但是值输出了一个数组,满足条件本是不只一个的,这个要怎么改,才能输出全部满足条件的值?谢谢~
[Fortran] 纯文本查看 复制代码
program main
implicit none
call sub2()
end program main

subroutine sub1(X,Y,T,a,b,c,d,ans)
implicit none
real::PI=3.1415926
real::PM=1
real::M=1
real::PL=1
real::PT=1
real,parameter::X0=20
real,parameter::Y0=20
real,parameter::T0=20
real::a(X0,Y0,T0)
real::b(X0,Y0,T0)
real::c(X0,Y0,T0)
real::d(X0,Y0,T0)
real::ans(X0,Y0,T0)
real X
real Y
real T 
real::x1,x2,dx,y1,y2,dy,t1,t2,dt
integer::i,j,k,Nx,Ny,Nt
x1=0.5
x2=10
y1=0.5
y2=10
t1=0.5
t2=10
dx=0.5
dy=0.5
dt=0.5
Nx=(x2-x1)/dx
Ny=(y2-y1)/dy
Nt=(t2-t1)/dt
open(unit=10,file="data1.txt")
do i=1,Nx+1
  X=x1+(i-1)*dx
    do j=1,Ny+1
          y=y1+(j-1)*dy
      do k=1,Nt+1 
      T=t1+(k-1)*dt
      a(i,j,k)=PM*M/(4*(PI**1)*(PL**0.5)*(PT**0.5)*(T**1))
      b(i,j,k)=-1/(2*PL*T)
      c(i,j,k)=((X-T)/(2*PL*T))**2
      d(i,j,k)=((X-T)**2)/(4*PL*T)+(y**2/(4*PT*T))
      ans(i,j,k)=(PM*M/(4*(PI**1)*(PL**0.5)*(PT**0.5)*(T**2)))*((-1/(2*PL*T))+((((X-T)/(2*PL*T))**2)**2))*(exp(-(((X-T)**2)/(4*PL*T)+(y**2/(4*PT*T)))))
      write(10,"('(',f5.2,',',f5.2,','f5.2')=',(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6))") X,Y,T,a(i,j,k),b(i,j,k),c(i,j,k),d(i,j,k),ans(i,j,k)
      end do
  end do
end do
return
end

subroutine sub2()
implicit none
integer,parameter:: i=20
integer,parameter:: j=20
integer,parameter:: k=20
real X
real Y
real T
real::a(i,j,k)
real::b(i,j,k)
real::c(i,j,k)
real::d(i,j,k)
real::ans(i,j,k)
    call sub1(X,Y,T,a,b,c,d,ans)
    open(unit=11,file='data2.txt')
    if (ans(i,j,k)>-0.01.and.ans(i,j,k)<0.01) then
    write(11,"('(',f5.2,',',f5.2,','f5.2')=',(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6))") X,Y,T,a(i,j,k),b(i,j,k),c(i,j,k),d(i,j,k),ans(i,j,k)
    end if
return 
end

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2014-5-6 21:10:07 | 只看该作者
输出多个,你需要循环啊。在 sub2 中循环,类似这样

[Fortran] 纯文本查看 复制代码
do i = 1 , ...
  do j = 1 , ...
    do k = 1 , ...
      if (ans(i,j,k)>-0.01.and.ans(i,j,k)<0.01) then
       write(11,"('(',f5.2,',',f5.2,','f5.2')=',(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6))") X,Y,T,a(i,j,k),b(i,j,k),c(i,j,k),d(i,j,k),ans(i,j,k)
      end if
    end do
  end do
end do

5

帖子

3

主题

0

精华

入门

F 币
50 元
贡献
27 点
板凳
 楼主| 发表于 2014-5-7 21:31:13 | 只看该作者
写成这样子也还是不对,出现以下错误,能不能帮忙具体改一下,有点着急,谢谢~
Compiling Fortran...
F:\0fortranzuoye\19\19.f90
F:\0fortranzuoye\19\19.f90(62) : Error: A specification expression object must be a dummy argument, a COMMON block object, or an object accessible through host or use association   [I]
integer i
--------^
F:\0fortranzuoye\19\19.f90(63) : Error: A specification expression object must be a dummy argument, a COMMON block object, or an object accessible through host or use association   [J]
integer j
--------^
F:\0fortranzuoye\19\19.f90(64) : Error: A specification expression object must be a dummy argument, a COMMON block object, or an object accessible through host or use association   [K]
integer k
--------^
Error executing df.exe.
19.exe - 3 error(s), 0 warning(s)
程序如下:
[Fortran] 纯文本查看 复制代码
subroutine sub2()
implicit none
integer,parameter:: i0=20
integer,parameter:: j0=20
integer,parameter:: k0=20
integer i
integer j
integer k
real X
real Y
real T
real::a(i,j,k)
real::b(i,j,k)
real::c(i,j,k)
real::d(i,j,k)
real::ans(i,j,k)
    call sub1(X,Y,T,a,b,c,d,ans)
    open(unit=11,file='data2.txt')
        do i1=1,i0
          do j1=1,j0
            do k1=1,k0
    if (ans(i,j,k)>-0.01.and.ans(i,j,k)<0.01) then
    write(11,"('(',f5.2,',',f5.2,','f5.2')=',(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6))") X,Y,T,a(i,j,k),b(i,j,k),c(i,j,k),d(i,j,k),ans(i,j,k)
    end if
        end do
  end do
end do
return 
end

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

地板
发表于 2014-5-8 09:50:15 | 只看该作者
本帖最后由 aliouying 于 2014-5-8 09:53 编辑

数组的定义必须有确定的大小或者动态数组
[Fortran] 纯文本查看 复制代码
subroutine sub2()
 implicit none
 integer,parameter:: i0=20
 integer,parameter:: j0=20
 integer,parameter:: k0=20
 integer i
 integer j
 integer k
 real X
 real Y
 real T
 real::a(i0,j0,k0)
 real::b(i0,j0,k0)
 real::c(i0,j0,k0)
 real::d(i0,j0,k0)
 real::ans(i0,j0,k0)
     call sub1(X,Y,T,a,b,c,d,ans)
     open(unit=11,file='data2.txt')
         do i=1,i0
           do j=1,j0
             do k=1,k0
     if (ans(i,j,k)>-0.01.and.ans(i,j,k)<0.01) then
     write(11,"('(',f5.2,',',f5.2,','f5.2')=',(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6),(2X,F9.6))") X,Y,T,a(i,j,k),b(i,j,k),c(i,j,k),d(i,j,k),ans(i,j,k)
     end if
         end do
   end do
 end do
 return 
 end
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-22 13:50

Powered by Tencent X3.4

© 2013-2024 Tencent

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