Fortran Coder

查看: 16860|回复: 16
打印 上一主题 下一主题

[流程控制] fortran循环,求助!!

[复制链接]

17

帖子

5

主题

0

精华

入门

F 币
86 元
贡献
52 点
跳转到指定楼层
楼主
发表于 2014-4-25 17:58:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我要编一个简单的循环程序,不太会,刚学,求指导,底下是我编的一个模子program main
implicit none
real*8 A,B,C,D,ref,Z0,Zi
real*8 E,H
real*8 daltf,f,s
real*8 A2,A3,A4,As,Al,A1
real,parameter::pi=3.14159
real i
integer,parameter::Zrs=5
integer k
real*8::Zr(Zrs)=(/2.0,4.0,6.0,8.0,10.0/)
common /group1/Zi
common /group2/Z0

do k=1,Zrs
  call Get_ref(Zr(k),E(k),H(k),ref(k))
write(*,*) k,ref(k),daltf/35.0
end do
stop
end
!!!!!!!!!
Z0=50.0
Zi=-3.0
!!!!!!!!
daltf=0  !!频率的变化
do i=0,0.35,0.0001

daltf=daltf+i

end do
write(*,*) daltf
end
stop

As=0.015*(1+daltf/35.0)
A2=0.25*(1+daltf/35.0)
A3=0.0689*(1+daltf/35.0)
A4=0.419*(1+daltf/35.0)
Al=0.4808*(1+daltf/35.0)
!!A1
A1=(1.0/2.0*pi)*atan(1.0/(1.0/tan(2.0*pi*As)+1.0/tan(2.0*pi*Al)))

A=(cos(2.0*pi*A2)+sin(2.0*pi*A2)/tan(2.0*pi*A3))*cos(2.0*pi*A4)-sin(2.0*pi*A2)*sin(2.0*pi*A4)

B=((cos(2.0*pi*A2)+sin(2.0*pi*A2)/tan(2.0*pi*A3))*sin(2.0*pi*A4)+sin(2.0*pi*A2)*cos(2.0*pi*A4))*Z0

C=((-1.0/tan(2.0*pi*A1)*cos(2.0*pi*A2)+sin(2.0*pi*A2)-(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))/tan(2.0*pi*A3))*cos(2.0*pi*A4)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))*sin(2.0*pi*A4))/Z0

D=(1.0/tan(2.0*pi*A1)*cos(2.0*pi*A2)-sin(2.0*pi*A2)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))/tan(2.0*pi*A3))*sin(2.0*pi*A4)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))*cos(2.0*pi*A4)
!!!E的表达式
subroutine Zr_to_E(Zr,E)
implicit none
real*8 A,B,C,D,E
real*8 Zr,Z0,Zi
common /group1/Zi
common /group2/Z0

E=(A*Zr*(D-C*Zi)+C*Zr*(B+A*Zi))/(((D-C*Zi)**2+Zr**2*C**2)*Z0)

return
end
!!!H的表达式
subroutine Zr_H(Zr,H)
implicit none
real*8 A,B,C,D,Zr,Zi,Z0,H
common /group1/Zi
common /group2/Z0

H=((B+A*Zi)*(D-C*Zi)-A*C*Zr**2)/(((D-C*Zi)**2+Zr**2*C**2)*Z0)

return
end
!!!ref反射系数
subroutine Get_ref(Zr,E,H,ref)
implicit none
real*8 E,H,Zr,ref

call Zr_to_E(Zr,E)
call Zr_H(Zr,H)

ref=((E**2-1+H**2)**2+4*H**2)/(((E+1)**2+H**2)**2)
return
end


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

17

帖子

5

主题

0

精华

入门

F 币
86 元
贡献
52 点
沙发
 楼主| 发表于 2014-4-25 18:01:01 | 只看该作者
我不知道该怎么做,我要用daltf,那我底下的ABCDEF的表达式要放在循环里吗

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

板凳
发表于 2014-4-25 19:21:20 | 只看该作者
一段程序,所有代码必须都能找到“归属”,要么属于某个子程序,要么属于主程序。

像这种
[Fortran] 纯文本查看 复制代码
 stop 
 end !// 此处是主程序结束
 !!!!!!!!!
 Z0=50.0
 Zi=-3.0
 !!!!!!!!
 daltf=0  !!频率的变化


主程序结束后,又有代码,这样是不行的。你打算让他们如何执行?

17

帖子

5

主题

0

精华

入门

F 币
86 元
贡献
52 点
地板
 楼主| 发表于 2014-4-25 19:28:50 | 只看该作者
chuxf 发表于 2014-4-25 19:21
一段程序,所有代码必须都能找到“归属”,要么属于某个子程序,要么属于主程序。

像这种

就是把daltf调入A,B,C,D,可是daltf是变化的,按步长0.001变化,我就不知道A,B,C,D是不是也要写成子函数的形式,然后编写子程序E,F(含有Zr),再调用子程序E,F,得到反射系数ref,然后输出ref,daltf/35.0,大概就是这个流程

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

5#
发表于 2014-4-25 19:41:24 | 只看该作者
你的算法我不懂。

循环是个很简单的事情。

daltf = 起始值
Do i = 1 , 总循环次数
  daltf = daltf + 0.001
  处理代码
End Do

如果 A B C D 是函数,那就写成函数的形式。

17

帖子

5

主题

0

精华

入门

F 币
86 元
贡献
52 点
6#
 楼主| 发表于 2014-4-25 19:48:05 | 只看该作者
chuxf 发表于 2014-4-25 19:41
你的算法我不懂。

循环是个很简单的事情。

谢谢你的回答,我还想问一下就是
(1)
As=0.015*(1+daltf/35.0)
A2=0.25*(1+daltf/35.0)
A3=0.0689*(1+daltf/35.0)
A4=0.419*(1+daltf/35.0)
Al=0.4808*(1+daltf/35.0)
!!A1
A1=(1.0/2.0*pi)*atan(1.0/(1.0/tan(2.0*pi*As)+1.0/tan(2.0*pi*Al)))

A=(cos(2.0*pi*A2)+sin(2.0*pi*A2)/tan(2.0*pi*A3))*cos(2.0*pi*A4)-sin(2.0*pi*A2)*sin(2.0*pi*A4)

B=((cos(2.0*pi*A2)+sin(2.0*pi*A2)/tan(2.0*pi*A3))*sin(2.0*pi*A4)+sin(2.0*pi*A2)*cos(2.0*pi*A4))*Z0

C=((-1.0/tan(2.0*pi*A1)*cos(2.0*pi*A2)+sin(2.0*pi*A2)-(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))/tan(2.0*pi*A3))*cos(2.0*pi*A4)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))*sin(2.0*pi*A4))/Z0

D=(1.0/tan(2.0*pi*A1)*cos(2.0*pi*A2)-sin(2.0*pi*A2)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))/tan(2.0*pi*A3))*sin(2.0*pi*A4)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))*cos(2.0*pi*A4)
这些式子里面只有daltf是变化的,那我要把上面这些式子daltf的循环里吗?
(2)
这儿daltf是从0开始增加的,步长为0.001,我上面那么写行吗
特别感谢!!!

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

7#
发表于 2014-4-25 19:53:56 | 只看该作者
1.我建议你写成一个函数,把daltf当做参数传递进去,然后循环调用这个函数既可。
2.这样写不行。要这样循环

[Fortran] 纯文本查看 复制代码
integer :: i
real :: daltf
daltf = 0.0
 Do i = 1 , int(0.35/0.001)
   daltf = daltf + 0.001
   处理代码
 End Do

17

帖子

5

主题

0

精华

入门

F 币
86 元
贡献
52 点
8#
 楼主| 发表于 2014-4-25 19:59:17 | 只看该作者
chuxf 发表于 2014-4-25 19:53
1.我建议你写成一个函数,把daltf当做参数传递进去,然后循环调用这个函数既可。
2.这样写不行。要这样循环 ...

好,我试试,谢谢你,哇哈哈

17

帖子

5

主题

0

精华

入门

F 币
86 元
贡献
52 点
9#
 楼主| 发表于 2014-4-26 22:34:43 | 只看该作者
chuxf 发表于 2014-4-25 19:53
1.我建议你写成一个函数,把daltf当做参数传递进去,然后循环调用这个函数既可。
2.这样写不行。要这样循环 ...

那个啥,我改完后有几个错误还是解决不了,麻烦你给指导指导,谢谢
[Fortran] 纯文本查看 复制代码
program main
implicit none
real*8 A,B,C,D,ref,Z0,Zi
real*8 E,H
real*8 f,s
real*8 A2,A3,A4,As,Al,A1
real,parameter::pi=3.14159
integer,parameter::Zrs=5
integer k
real*8::Zr(Zrs)=(/2.0,4.0,6.0,8.0,10.0/)
common /group1/Zi
common /group2/Z0
!!!!!!!!!
Z0=50.0
Zi=-3.0
!!!!!!!!
real::daltf=0.0
integer i
do i=1,int(0.35/0.001)
  do k=1,Zrs
daltf=daltf+0.001
  call Get_ref(Zr(k),E(k),H(k),ref(k))
write(*,*) k,ref(k)
write(*,*) daltf

end do
end do
stop
end
!!!!!!!As,A2,A3,A4,Al*************************
subroutine daltf_to_As(daltf,As)
implicit none
real*8 daltf,As
As=0.015*(1+daltf/35.0)
return
end

subroutine daltf_to_A2(daltf,A2)
implicit none
real*8 daltf,A2
A2=0.25*(1+daltf/35.0)
return
end

subroutine daltf_to_A3(daltf,A3)
implicit none
real*8 daltf,A3
A3=0.0689*(1+daltf/35.0)
return
end

subroutine daltf_to_A4(daltf,A4)
implicit none
real*8 daltf,A4
A4=0.419*(1+daltf/35.0)
return
end

subroutine daltf_to_Al(daltf,Al)
implicit none
real*8 daltf,Al
Al=0.4808*(1+daltf/35.0)
return
end
!!!!!!!!****************************************
!!A1,A,B,C,D************************************
subroutine Get_A1(daltf,As,Al,A1)
implicit none
real*8 As,Al,A1,daltf
real,parameter::pi=3.14159

call daltf_to_As(daltf,As)
call daltf_to_A1(daltf,Al)

A1=(1.0/2.0*pi)*atan(1.0/(1.0/tan(2.0*pi*As)+1.0/tan(2.0*pi*Al)))
return
end

subroutine Get_AB(daltf,A2,A3,A4,A,B)
implicit none
real*8 A2,A3,A4,A,B,Z0,daltf
real,parameter::pi=3.14259
common /group2/Z0

call daltf_to_A2(daltf,A2)
call daltf_to_A3(daltf,A3)
call daltf_to_A4(daltf,A4)

A=(cos(2.0*pi*A2)+sin(2.0*pi*A2)/tan(2.0*pi*A3))*cos(2.0*pi*A4)-sin(2.0*pi*A2)*sin(2.0*pi*A4)
B=((cos(2.0*pi*A2)+sin(2.0*pi*A2)/tan(2.0*pi*A3))*sin(2.0*pi*A4)+sin(2.0*pi*A2)*cos(2.0*pi*A4))*Z0
return
end

subroutine Get_CD(daltf,A1,A2,A3,A4,C,D)
implicit none
real*8 A1,A2,A3,A4,Z0,C,D,daltf,Al,As
real,parameter::pi=3.14259
common /group2/Z0

call Get_A1(As,Al,A1)
call daltf_to_A2(daltf,A2)
call daltf_to_A3(daltf,A3)
call daltf_to_A4(daltf,A4)

C=((-1.0/tan(2.0*pi*A1)*cos(2.0*pi*A2)+sin(2.0*pi*A2)-(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))/tan(2.0*pi*A3))*cos(2.0*pi*A4)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))*sin(2.0*pi*A4))/Z0

D=(1.0/tan(2.0*pi*A1)*cos(2.0*pi*A2)-sin(2.0*pi*A2)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))/tan(2.0*pi*A3))*sin(2.0*pi*A4)+(1.0/tan(2.0*pi*A1)*sin(2.0*pi*A2)+cos(2.0*pi*A2))*cos(2.0*pi*A4)
return
end
!!!*********************************************
!!!E的表达式
subroutine Get_E(Zr,A1,A2,A3,A4,E)
implicit none
real*8 A,B,C,D,E,A1,A2,A3,A4
real*8 Zr,Z0,Zi
common /group1/Zi
common /group2/Z0

call Get_AB(A2,A3,A4,A,B)
call Get_CD(A1,A2,A3,A4,C,D)

E=(A*Zr*(D-C*Zi)+C*Zr*(B+A*Zi))/(((D-C*Zi)**2+Zr**2*C**2)*Z0)

return
end
!!!H的表达式
subroutine Get_H(Zr,A1,A2,A3,A4,H)
implicit none
real*8 A,B,C,D,Zr,Zi,Z0,H,A1,A2,A3,A4
common /group1/Zi
common /group2/Z0

call Get_AB(A2,A3,A4,A,B)
call Get_CD(A1,A2,A3,A4,C,D)

H=((B+A*Zi)*(D-C*Zi)-A*C*Zr**2)/(((D-C*Zi)**2+Zr**2*C**2)*Z0)

return
end
!!!ref反射系数
subroutine Get_ref(Zr,E,H,ref)
implicit none
real*8 E,H,Zr,ref,A1,A2,A3,A4

call Get_E(Zr,A1,A2,A3,A4,E)
call Get_H(Zr,A1,A2,A3,A4,H)

ref=((E**2-1+H**2)**2+4*H**2)/(((E+1)**2+H**2)**2)
return
end

以下是错误提示
-------------------Configuration: tu11 - Win32 Debug--------------------
Compiling Fortran...
C:\Program Files\Microsoft Visual Studio\MyProjects\tu11\tu11.f90
C:\Program Files\Microsoft Visual Studio\MyProjects\tu11\tu11.f90(17) : Error: A specification statement cannot appear in the executable section.
real::daltf=0.0
^
C:\Program Files\Microsoft Visual Studio\MyProjects\tu11\tu11.f90(19) : Error: A specification statement cannot appear in the executable section.
integer i
^
C:\Program Files\Microsoft Visual Studio\MyProjects\tu11\tu11.f90(20) : Error: This name does not have a type, and must have an explicit type.   [I]
do i=1,int(0.35/0.001)
---^
C:\Program Files\Microsoft Visual Studio\MyProjects\tu11\tu11.f90(20) : Error: An INTEGER or REAL data type is required in this context.   [I]
do i=1,int(0.35/0.001)
---^
C:\Program Files\Microsoft Visual Studio\MyProjects\tu11\tu11.f90(22) : Error: This name does not have a type, and must have an explicit type.   [DALTF]
daltf=daltf+0.001
-^
Error executing df.exe.

tu11.obj - 5 error(s), 0 warning(s)

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

10#
发表于 2014-4-26 22:51:30 | 只看该作者
问题1:
[Fortran] 纯文本查看 复制代码
!!!!!!!!!
 Z0=50.0
 Zi=-3.0
 !!!!!!!!
 real::daltf=0.0
 integer i

换一下位置
[Fortran] 纯文本查看 复制代码
 real::daltf=0.0
 integer i
!!!!!!!!!
 Z0=50.0
 Zi=-3.0
 !!!!!!!!

Fortran 里的声明语句必须在所有执行语句前面

问题2:
Get_A1 函数有4个参数,但调用时只给了3个


您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-23 00:05

Powered by Tencent X3.4

© 2013-2024 Tencent

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