爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4634|回复: 2

水汽流函数

[复制链接]

新浪微博达人勋

发表于 2017-12-21 17:06:35 | 显示全部楼层 |阅读模式
Fortran
系统平台: FORTRAN
问题概况: FORTRAN编写程序求解水汽流函数
问题截图: -
我看过提问的智慧: 看过
自己思考时长(天): 3

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

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

x
请问,用FORTRAN编写程序求解水汽流函数时,为什么边界与初值不能设为0,要进行边界订正,但求解势函数的时候可以?
订正边界后计算的水汽流函数很奇怪,反而设边界为0,结果还比较正常,想从原理上请教各位。
程序调了很长时间,最后发现问题时出在边界订正上。求解流函数程序如图,数据不是全球的。边界订正的前提是四周的水汽和为0,是不是问题出在这里?
!!!!!!!!!!!计算水汽流函数(850hPa)steam function!!!!!!!!!!!
!流函数steam的边条件
dingzh=0.0
loop=0.0
loop_abs=0.0
do t=1,tim
  do z=1,level  
    do j=1,n0
       do i=1,m0
         !速度的环路积分
         loop(z,t)=loop(z,t)+a*dlam*(-cos(fy(1))*gqvy(i,1,z,t)+cos(fy(n0))*gqvy(i,n0,z,t)+gqvx(m0,j,z,t)-gqvx(1,j,z,t))
         !速度绝对值的环路积分
         loop_abs(z,t)=loop_abs(z,t)+a*dlam*(cos(fy(1))*abs(-gqvy(i,1,z,t))+cos(fy(n0))*abs(gqvy(i,n0,z,t))+&
         abs(gqvx(m0,j,z,t))+abs(-gqvx(1,j,z,t)))
       enddo
    enddo
    !东南西北边界的订正系数
    dingzh(z,t)=-loop(z,t)/loop_abs(z,t)
  enddo
enddo
!订正流函数边界上的gqvx,gqvy分量
do t=1,tim
  do z=1,level
    do j=1,n0
         do i=1,m0
            gqvxx(i,j,z,t)=gqvx(i,j,z,t)+dingzh(z,t)*abs(gqvx(i,j,z,t))
            gqvyy(i,j,z,t)=gqvy(i,j,z,t)+dingzh(z,t)*abs(gqvy(i,j,z,t))
         enddo
    enddo
  enddo
enddo
!边界上的steam值
steam=0.0
do t=1,tim
  do z=1,level
    do i=1+1,m0
        !j=n0上的steam
        steam(i,n0,z,t)=steam(i-1,n0,z,t)+(gqvyy(i-1,n0,z,t)+gqvyy(i,n0,z,t))/2*a*dlam*cos(fy(n0))
    enddo
  enddo
enddo
do t=1,tim
  do z=1,level
    do j=n0-1,1,-1
        !i=1.and.i=m0上的steam
        steam(1,j,z,t)=steam(1,j+1,z,t)+(gqvxx(1,j+1,z,t)+gqvxx(1,j,z,t))/2*a*dlam
        steam(m0,j,z,t)=steam(m0,j+1,z,t)+(gqvxx(m0,j+1,z,t)+gqvxx(m0,j,z,t))/2*a*dlam
    enddo
  enddo
enddo
do t=1,tim
  do z=1,level
    do i=1+1,m0
        !j=1上的steam
        steam(i,1,z,t)=steam(i-1,1,z,t)+(gqvyy(i-1,1,z,t)+gqvyy(i,1,z,t))/2*a*dlam*cos(fy(1))
    enddo
  enddo
enddo
!!!!!!!!!!!计算水汽流函数(850hPa)steam function!!!!!!!!!!!
RR=0.0
RR1=1.e-7
n=0
do t=1,tim
  do z=1,level
    do while(RR1(1,1,z,t)>1.e-8)
       n=n+1 !迭代次数
       do j=1+1,n0-1
          do i=1+1,m0-1
             !初始估计值不是真值,与该点的散度存在偏差RR,称为残差或余差
             RR(i,j,z,t)=(steam(i+1,j,z,t)+steam(i-1,j,z,t))/((a*dlam*cos(fy(j)))**2)+(steam(i,j+1,z,t)+steam(i,j-1,z,t))&
             /((a*dlam)**2)-(2.0/((a*dlam*cos(fy(j)))**2)+2.0/((a*dlam)**2))*steam(i,j,z,t)-gqvksei(i,j,z,t)
          enddo
       enddo
       do j=1+1,n0-1
          do i=1+1,m0-1   
             steam(i,j,z,t)=steam(i,j,z,t)+RR(i,j,z,t)/(2*(1.0/((a*dlam*cos(fy(j)))**2)+1.0/((a*dlam)**2)))     
          enddo
       enddo
      !find MAX,令RR1(1,1,z,t)=max
       do j=1,n0
         do i=1,m0
           RR1(i,j,z,t)=abs(RR(i,j,z,t))
         enddo
       enddo
      do j=1,n0
        do i=1,m0
          if(RR1(1,1,z,t)<=RR1(i,j,z,t))then
            RR1(1,1,z,t)=RR1(i,j,z,t)
          endif
        enddo
      enddo
    enddo
  enddo
enddo

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

新浪微博达人勋

发表于 2017-12-21 19:00:13 | 显示全部楼层
你这个在订正流函数边界后计算的边界值都很奇怪(因为在后面不断迭代的时候边界值并没有迭代减小误差),中间的值应该的正确的。
还有你程序中间在积分边界的时候写错了,要把i,j分开循环,你那样做在层次、时间、j,不变的时候,不断循环i,会使(1,j),(mo,j)重复累加很多次,导致边界积分有误,订正值有误。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-12-21 19:27:35 | 显示全部楼层
的确是边界值错了,但不知道错在哪里了,你说的错误“程序中间在积分边界的时候写错了,要把i,j分开循环”,请问是哪里呀?
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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