爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 28868|回复: 42

[经验总结] 分享我写FORTRAN程序(反距离权重法插值)的一些步骤和心得

  [复制链接]

新浪微博达人勋

发表于 2016-1-16 18:51:17 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 咕噜 于 2018-7-1 11:40 编辑

想要把再分析格点资料插值到站点,论坛里已经有不少相关的帖子和程序,我想做的是反距离权重法插值,格点资料是2.5x2.5的。大家可能都有这样的体会:别人的程序看不懂……之前下载的双线性插值法程序也是因为不明白(记不住)所有变量的含义所以看不下去。理都懂,所以想试试自己编一个看看。       
    我自己因为本科学过FORTRAN,并且大二、三、四、研,学校设置的课程、实习以及老师的安排都需要用FORTRAN,所以没有学完就丢掉,还是比较庆幸的。基础不算太差,但是我觉得大部分问题都能只用do循环、if语句等解决。

    下面讲我编程的拙见:

    首先确定问题。下面是在草稿本上写的,画了坐标示意图,公式很明确,要确定四个格点是主要的问题,尝试将四个格点的经纬度分别减去站点经纬度,取绝对值后,小于2.5,认为是离站点最近的四个格点。思路要清晰,记得以前老师上课时说写程序之前要画流程图,虽然没有做到那么仔细,但是一上手就写程序肯定是很困难的。

IMG_20170104_082848.jpg

    然后尝试写主要的步骤,格点乘上2.5,就是经纬度的值,与站点经纬度相减并取绝对值,简单的do和if语句就能搞定
2.PNG

之后就试着运行,试着输入台站号和经纬度,运行出了点问题,但是四个点都找到了,这就是最主要的部分,剩下的部分就是按公式,四则运算,修改修改修改,更好写了。
1.PNG 5.PNG



这是花了半个小时左右的成果,比起看不懂程序一天天不想做,来得更有动力些,希望能鼓励鼓励大家!
个人能力有限,一些见解不到位或者程序有错误请大力指正!!!
此程序!!!***局限于单个站点多时次插值***!!!!
2017年1月3号:收到论坛朋友的指正,发现了一些公式以及计算方法的问题,特此更正!


  1. implicit none
  2. real re(144,73,67),v1(67)  
  3. !re(144,73,67)是经过计算的再分析资料67年年平均值(1984-2014),2.5*2.5,纬度-90~90,经度0~360
  4. !后面有说明负值纬度的修正,v1(67)是即将计算的新插值序列
  5. real d,lat,lon,fenzi(67),fenmu  
  6. !d是距离的平方,因为计算距离d=sqrt(((i-1)*2.5-lon)**2+((j-1)*2.5-lat)**2),之后公式还是有平方,干脆不开方也不平方。
  7. !lat是输入的站点纬度,lon是输入的站点精度。此程序!!!***局限于单个站点多时次插值***!!!!
  8. !fenzi(67)是插值公式的分子,fenmu是插值公式的分母  
  9. integer i,j,t
  10. open(10,file='d:\wind\201602\data\1948_2014yrmean.grd',form='binary')
  11. open(20,file='d:\wind\201602\data\beijingchazhi.txt')  !北京插值为例
  12. read(*,*) lon,lat
  13. do t=1,67
  14. read(10)((re(i,j,t),i=1,144),j=1,73)
  15. enddo
  16. fenmu=0
  17. do j=1,73
  18.   do i=1,144
  19.     if(abs((i-1)*2.5-lon)<=2.5.and.abs((j-1)*2.5-lat)<=2.5)then   
  20.     !判断与站点经纬度差值的绝对值小于2.5视为最近的四个点。这里-1的原因是,计算格点
  21.     !的公式是,以2.5度、0~360经度为例,(360-0)/2.5+1=144。所以-1体现在此。
  22.     d=1/((((i-1)*2.5-lon)*111)**2+(((j-1)*2.5-lat)*111)**2) !距离的平方的倒数,同时格点1度大约是111千米
  23.     print*,d
  24.     fenmu=fenmu+d
  25.       do t=1,67
  26.         fenzi(t)=fenzi(t)+d*re(i,j+36,t)                                 
  27.         !j+36是将负值纬度调到正值。北京39.7N为例,计算得到相近两个纬向格点是16、17,但这前提是以赤道为格点1的起点,
  28.         !而-90~0度格点为1-37,因此要以格点37为赤道起点的话,16、17就要加上1和37的差值36。我说得不清楚或者不明白可以
  29.         !用grads自己试试,set x 16得到的纬度是-52.5,而加上36后,set x 52得到纬度37.5
  30.       enddo   
  31.     endif
  32.   enddo
  33. enddo
  34.   do t=1,67
  35.    v1(t)=fenzi(t)/fenmu
  36.   enddo
  37. write(20,'(1x,f10.5)') (v1(t),t=1,67)
  38.     end
复制代码

评分

参与人数 2金钱 +30 贡献 +8 体力 +20 收起 理由
mofangbao + 20 + 8
lqouc + 10 + 20 楼主加油

查看全部评分

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2016-1-16 19:52:27 | 显示全部楼层
此处必须有掌声!加油
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-16 20:14:11 | 显示全部楼层
{:5_213:}{:5_213:}为坚持不懈的人们鼓掌
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-16 20:17:49 | 显示全部楼层
必须鼓掌
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2016-1-16 20:50:41 | 显示全部楼层
给楼主掌声,加油
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-16 20:55:25 | 显示全部楼层
赞一个
楼主的方式我很喜欢  先数学化 然后在纸上程序化  最后再电脑里一下基本上就好了
写上注释  一切都好说
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-16 21:12:42 | 显示全部楼层
超赞!!!鼓励!!!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2016-1-16 22:14:43 | 显示全部楼层
楼主加油,棒
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-1-17 17:23:08 | 显示全部楼层
鼓励鼓励,
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2016-1-17 21:03:31 | 显示全部楼层
申请贡献呀~@mofangbao
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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