Fortran Coder

查看: 260|回复: 5

[文件读写] fortran读取txt格式二维数据年份、sst报错

[复制链接]

4

帖子

1

主题

0

精华

新人

F 币
18 元
贡献
9 点
发表于 2023-12-29 19:08:33 | 显示全部楼层 |阅读模式
刚学文件读取,运用module和function、sunbroutine输入读取得到的年份、温度数据来计算温度拟合结果写入新文件。新文件还是空白,debug显示应该是读文件出了问题,有没有人知道该怎修改?谢谢!
以下源代码
[Fortran] 纯文本查看 复制代码
program main
    use library
    implicit none
    real::a,b!要声明subroutine
    real::T(69,2)
    character*30::ans
    real,allocatable::y_nihe(:)
    integer::i,error
   
    n=69.0
    !读SST文件
   open(unit=10,file="Global_SST.txt")
   do i=1,n
       read(10,*) T(i,1:2)
       x(i)=T(i,1)
       y(i)=T(i,2)
       print*,'x=',x(i),'y=',y(i)
   end do
   close(10)
   
    call nihe(x,y,n,a,b,ans,y_nihe)!不能忘记
   
    !建拟合后数值文件
    open(unit=11,file="Global_SST_nihe.txt")
    do i=1,n
        write(11,*) x(i),y(i),y_nihe
    end do
    close(11)


end


module library
    !real,allocatable,save::x(:),y(:)
    real*8,allocatable,save::y(:)
    integer,allocatable,save::x(:)
    real,save::n!数据数
   
    contains
        !计算测试数据x(i)的平均值
        real function average_x(x,n)
            implicit none
            real::sum1!输入参数
            integer,allocatable::x(:)!要加(:)否则sub里调用会报错6637
            integer::i
            real::n
            sum1=0.0
            do i=1,n
                sum1=sum1+x(i)
            end do
            average_x=sum1/n
            return
        end
        
        !计算测试数据y(i)的平均值
        real function average_y(y,n)
            implicit none
            real::sum2!输入参数
            real*8,allocatable::y(:)!要加(:)否则sub里调用会报错6637
            integer::i
            real::n
            sum2=0.0
            do i=1,n
                sum2=sum2+y(i)
            end do
            average_y=sum2/n
            return
        end
     
        
        subroutine nihe(x,y,n,a,b,ans,y_nihe)
            implicit none
            real::a,b,ave_x,ave_y,suma,sumb,sumc,sumd,sume
            real*8,allocatable,intent(in)::y(:)
            integer,allocatable,intent(in)::x(:)
            real,allocatable::y_nihe(:)
            character*30,optional::ans
            character*10::ac,bc
            integer::i
            real::n
      
            ave_x=average_x(x,n)!测试数据平均值
            ave_y=average_y(y,n)
           
            !求b的公式计算            
            suma=0.0
            do i=1,n
                suma=suma+x(i)*y(i)
            end do
         
            sumb=0.0
            do i=1,n
                sumb=sumb+y(i)
            end do
         
            sumc=0.0
            do i=1,n
                sumc=sumc+x(i)
            end do
           
            sumd=0.0
            do i=1,n
                sumd=sumd+x(i)**2
            end do
         
            sume=sumc**2
            
            !b的公式计算
            b=(n*suma-sumb*sumc)/(n*sumd-sume)
            
            !求a的公式计算
            a=ave_y-b*ave_x
            
            !曲线公式输出
            write(ac,'(f5.3)')a!数字转字符串
            write(bc,'(f5.3)')b
            ans="y="//trim(ac)//"+"//trim(bc)//"*x"!要去空格,不然看不到ac后面的
            
            
            !拟合y的计算
            do i=1,n
                y_nihe(i)=a+b*x(i)
            end do
            
            return
        end subroutine

end module library


4

帖子

1

主题

0

精华

新人

F 币
18 元
贡献
9 点
 楼主| 发表于 2023-12-29 19:13:49 | 显示全部楼层
tet文件内容
1950        20.0961049397786
1951        20.1714002291362
1952        20.2491049766541
1953        20.2443106969198
1954        20.0819886525472
1955        20.0484790802002
1956        20.0665067036947
1957        20.2732753753662
1958        20.3031202952067
1959        20.2691286404928
1960        20.2360420227051
1961        20.2409720420837
1962        20.2072224617004
1963        20.2495829264323
1964        20.0672515233358
1965        20.1047460238139
1966        20.1955901781718
1967        20.1673062642415
1968        20.1893989245097
1969        20.3663450876872
1970        20.2267944018046
1971        20.0539709726969
1972        20.2768607139587
1973        20.2799997329712
1974        20.1227018038432
1975        20.0821773211161
1976        20.1148374875387
1977        20.2787280082703
1978        20.2211915651957
1979        20.3278311093648
1980        20.3143162727356
1981        20.2863869667053
1982        20.2568984031677
1983        20.3954254786174
1984        20.2790896097819
1985        20.2281266848246
1986        20.2801698048910
1987        20.4560572306315
1988        20.3847807248433
1989        20.3487602869670
1990        20.4344404538472
1991        20.3976322809855
1992        20.3218612670898
1993        20.3612923622131
1994        20.3886327743530
1995        20.4801934560140
1996        20.4360527992249
1997        20.5726725260417
1998        20.6212105751038
1999        20.3976710637410
2000        20.3863169352214
2001        20.4906733830770
2002        20.5209345817566
2003        20.5484811464946
2004        20.5385220845540
2005        20.5299703280131
2006        20.5224957466126
2007        20.4423691431681
2008        20.4357821146647
2009        20.5469978650411
2010        20.5540506045024
2011        20.4356409708659
2012        20.4943110148112
2013        20.5247028668722
2014        20.6103471120199
2015        20.7225526173910
2016        20.7179576555888
2017        20.6371006965637
2018        20.6169347763062

151

帖子

2

主题

1

精华

大师

Vim

F 币
930 元
贡献
453 点

规矩勋章

发表于 2023-12-29 19:36:36 | 显示全部楼层
可分配数组要先分配,然后才能使用 你的 x,y,y_nihe数组没分配就使用了

评分

参与人数 1F 币 +3 收起 理由
fcode + 3 赞一个!

查看全部评分

4

帖子

1

主题

0

精华

新人

F 币
18 元
贡献
9 点
 楼主| 发表于 2023-12-29 19:43:36 | 显示全部楼层
Transpose 发表于 2023-12-29 19:36
可分配数组要先分配,然后才能使用 你的 x,y,y_nihe数组没分配就使用了

你好,请问是哪里分配?我在module里声明了,在主程序call subroutine不行吗?之前直接在主程序录入测试数据不读取txt进行测试也是这样的步骤没有问题

151

帖子

2

主题

1

精华

大师

Vim

F 币
930 元
贡献
453 点

规矩勋章

发表于 2023-12-29 19:55:37 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
do i=1,n
       read(10,*) T(i,1:2)
       x(i)=T(i,1)
       y(i)=T(i,2)
       print*,'x=',x(i),'y=',y(i)
   end do

把T(i,1)赋值给x(i)之前,要保证x数组是已经分配的,不然是错的

4

帖子

1

主题

0

精华

新人

F 币
18 元
贡献
9 点
 楼主| 发表于 2023-12-29 20:39:31 | 显示全部楼层
Transpose 发表于 2023-12-29 19:55
[mw_shl_code=fortran,true]do i=1,n
       read(10,*) T(i,1:2)
       x(i)=T(i,1)

谢谢谢谢!我在主程序给x,y,y_nihe分配大小后能执行并且在新文件中有序写入了!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-2-25 13:46

Powered by Tencent X3.4

© 2013-2024 Tencent

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