爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 3613|回复: 6

[求助] fortran循环问题

[复制链接]

新浪微博达人勋

发表于 2017-4-16 22:26:23 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
代码是这样的,求线性系数
program main
    implicit none
    integer,parameter ::a=407,b=32
    integer :: i,j,year(a,b),yr(b)
    real :: lat(a),lon(a),raw(b),norm(b),wind(a,b),relation
    character*5 station(a)
    real sfenzi,sfenmu1,sfenmu2,s1,s2  
    real amean,bmean  
     
   open(10, file="C:\Users\Lsz\Desktop\datasets\Observation\407stations.txt",status="old")
    do i=1,a
        read(10,*)station(i),lat(i),lon(i)
    end do
    close(10)
   
    do i=1,a
        open(11,file="C:\Users\Lsz\Desktop\datasets\Average(new)\summer\yearly\300hPa\"//station(i)//".txt",status="old")
        do j=1,b
            read(11,*)year(i,j),wind(i,j) !stid(i,j),
        end do
        close(11)
    end do
   
    open(12, file="C:\Users\Lsz\Desktop\datasets\Average(new)\summer\EASM.txt",status="old")
    do j=1,b
        read(12,*)yr(j),raw(j),norm(j)
    end do
    close(12)
    s2=0.00
    bmean=0
    do j=1,b
         s2=s2+raw(j)
         bmean=s2/b
    enddo
   
    open(13,file="C:\Users\Lsz\Desktop\300!!!!!!!.txt",status="unknown")
   
    do i=1,a
         s1=0.00
         
         sfenzi=0.00
         sfenmu1=0.00
         sfenmu2=0.00
         amean=0
         do j=1,32
         s1=s1+wind(i,j)
         amean=s1/32         
         

         sfenzi=sfenzi+(wind(i,j)-amean)*(raw(j)-bmean)
         sfenmu1=sfenmu1+(wind(i,j)-amean)**2
         sfenmu2=sfenmu2+(raw(j)-bmean)**2
   
         end do
    relation=sfenzi/sqrt(sfenmu1*sfenmu2)
    write(13,100)relation !station(i),lat(i),lon(i),
    enddo
100 format(f10.5) !i5,f8.2,f8.2,
   
    end program main

是这样的,所求的sfenzi,sfenmu1,sfenmu2中所用的amean应该是32次循环后最终的amean,而现在是每一层的amean都用上了,但是循环体内部又不能同时出现两个循环,我该怎么办?主要牵扯到二维数组数据文件的提取,所以挺麻烦的,求大神解答下!

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-17 08:55:54 | 显示全部楼层
你把s1=s1+wind(i,j)放在do =1,32循环外面 不就行了??是我对你问题的描述理解有误吗
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-4-17 10:29:23 | 显示全部楼层
扫眉才子 发表于 2017-4-17 08:55
你把s1=s1+wind(i,j)放在do =1,32循环外面 不就行了??是我对你问题的描述理解有误吗

可能是我没说清楚,不可以放外面,因为j循环中还要做wind(i,1)到wind(i,32)的累加求平均
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-17 11:09:09 | 显示全部楼层
不知道有无理解错,楼主试试将红色那块程序换成,看看能不能行

do j=1,32
    s1=sum(wind(i,:))
    amean=s1/32         
    sfenzi=sfenzi+(wind(i,j)-amean)*(raw(j)-bmean)
    sfenmu1=sfenmu1+(wind(i,j)-amean)**2
    sfenmu2=sfenmu2+(raw(j)-bmean)**2
end do
或者——————————————————————————

do j=1,32
    s1=s1+wind(i,j)
    amean=s1/32   
enddo

do j=1,32
    sfenzi=sfenzi+(wind(i,j)-amean)*(raw(j)-bmean)
    sfenmu1=sfenmu1+(wind(i,j)-amean)**2
    sfenmu2=sfenmu2+(raw(j)-bmean)**2
end do

评分

参与人数 1金钱 +6 收起 理由
lqouc + 6

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-17 11:21:21 | 显示全部楼层
本帖最后由 金色牛神 于 2017-4-17 11:31 编辑

哈哈,这倒没那么复杂。既然已经知道不能交叉循环,那就把amean的计算单独提出一个循环算成结果就行了,循环逻辑写错了。
do j=1,32
         s1=s1+wind(i,j)
         amean=s1/32   
上面代码改一下:
DO K = 1,32
    s1=s1+wind(i,K)     
END DO
amean=s1/32
do j=1,32
  继续下面计算sfenzi...之类的

评分

参与人数 1金钱 +6 收起 理由
lqouc + 6

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-4-17 23:04:25 | 显示全部楼层
stcya 发表于 2017-4-17 11:09
不知道有无理解错,楼主试试将红色那块程序换成,看看能不能行

do j=1,32

可以的,就是这个意思。不过循环是二层循环,改一下就可以了!多谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-4-17 23:04:41 | 显示全部楼层
金色牛神 发表于 2017-4-17 11:21
哈哈,这倒没那么复杂。既然已经知道不能交叉循环,那就把amean的计算单独提出一个循环算成结果就行了,循 ...

嗯嗯可以的,多谢了大神
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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