- 积分
- 599
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2017-6-7
- 最后登录
- 1970-1-1
|
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
|
|