爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5919|回复: 8

[求助] 缺测值处理的一个小程序

[复制链接]

新浪微博达人勋

发表于 2015-3-24 14:56:34 | 显示全部楼层 |阅读模式

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

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

x

   我使用了NCEP的大气温度逐月资料,缺测值为-9.96921e+36,我编了一个小程序来计算每年的一个平均值,之前一直用的这个程序,今天突然发现这个缺测值的处理上(就是红色字体的地方),我是不是编的有问题啊?麻烦各位帮我看一下


program main
integer,parameter::  nx=105,ny=17,nt=384,mo=12,my=32
integer i,j,t,kk,iy,im
real tmsu(nx,ny,nt),tmsu2(mo,my,nx,ny),tmsu_ave(my,nx,ny),tmsu_sum(my,nx,ny)
open(1,file='D:\by\evalution_MSU_AMSU_BT\evalution\MSU_AMSU\AMSU\long_term\total_ocean\air_lev700_jp.grd',form='binary')
do t=1,nt
read(1) ((tmsu(i,j,t),i=1,nx),j=1,ny)
enddo
close(1)

do iy=1,my
do im=1,mo
kk=(iy-1)*12+im
do i=1,nx
do j=1,ny
tmsu2(im,iy,i,j)=tmsu(i,j,kk)
end do
end do
end do
end do

do iy=1,my
do i=1,nx
do j=1,ny
tmsu_sum(iy,i,j)=0.0
tmsu_ave(iy,i,j)=0.0
do im=1,mo
if(tmsu2(im,iy,i,j).ne.-9.96921e+36) then
tmsu_sum(iy,i,j)=tmsu_sum(iy,i,j)+tmsu2(im,iy,i,j)
else
tmsu_sum(iy,i,j)=-9.96921e+36
endif
enddo
if(tmsu_sum(iy,i,j).ne.-9.96921e+36)then
tmsu_ave(iy,i,j)=tmsu_sum(iy,i,j)/real(mo)
else
tmsu_ave(iy,i,j)=-9.96921e+36
endif
enddo
enddo
enddo


open(10,file='D:\by\evalution_MSU_AMSU_BT\evalution\MSU_AMSU\AMSU\long_term\total_ocean\air_lev700_aveyear.grd',form='binary')
do iy=1,my
write(10) ((tmsu_ave(iy,i,j),i=1,nx),j=1,ny)
enddo
close(10)
end
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-3-24 15:56:59 | 显示全部楼层
唉,最近fortran版真是没人气啊,难得有个发帖的,不过楼主你这提问的水平真的值得提高哈,有空一定要看看“提问的智慧”,地址如下http://bbs.06climate.com/forum.php?mod=viewthread&tid=4571
现在说一下你提出的问题,简单来说就是想在平均的时候考虑缺测值是吧。但是你没说清你到底要怎样处理缺测值,是只要有一次缺测平均结果就为缺测?还是缺测值不参与计算。这样算法的设计是不同的,虽然都很简单。还有你说让大家给你看,虽然标出了问题代码,但是好歹描述一下你的问题,给点错误的结果出来啊。你来一句“我是不是编的有问题啊?”,这是问谁呢?
好了不啰嗦了,好在程序短小,我看完了,简单说下程序,缺测部分不管你想用哪种处理方法,这么写肯定是不对的了,我猜测你的思路应该是只要有一次缺测就赋缺测值。改动如下:
do iy=1,my
do i=1,nx
do j=1,ny
tmsu_ave=0.0; cc=0 ! 那个sum没用了,这里先声明一个整形计数器
do im=1,mo
if(tmsu2(im,iy,i,j).ne.-9.96921e+36) then
tmsu_ave(iy,i,j)=tmsu_ave(iy,i,j)+tmsu2(im,iy,i,j)
else
cc=cc+1
endif
enddo
if(cc.eq.0)then
tmsu_ave(iy,i,j)=tmsu_ave(iy,i,j)/real(mo)
else
tmsu_ave(iy,i,j)=-9.96921e+36
endif
enddo
enddo
enddo
你可以试一下,然后友情赠送一下你前面的问题,数组的读取(红色前面的部分)简直太麻烦了,给你精简下:
do iy=1,my
do im=1,mo
read(1) ((tmsu2(im,iy,i,j),i=1,nx),j=1,ny)   ! nt和tmsu(i,j,t) 这两个变量就没用了,省内存啊
enddo
enddo

嗯就这样吧

点评

谢谢共享: 5.0
谢谢共享: 5
  发表于 2016-10-8 16:39

评分

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

查看全部评分

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

新浪微博达人勋

 楼主| 发表于 2015-3-25 22:16:48 | 显示全部楼层
lqouc 发表于 2015-3-24 15:56
唉,最近fortran版真是没人气啊,难得有个发帖的,不过楼主你这提问的水平真的值得提高哈,有空一定要看看 ...

谢谢版主!!以后改进帖子的提问方式。  还想问一下,像下面这样子写法来是不是就不用计数器了?
do im=1,mo
      do iy=1,my
      do i=1,nx
      do j=1,ny
      If(tmsu2(im,iy,i,j).ne.-9.99e+33.and.df(im,i,j).ne.-9.99e+33)then
        tmsu2(im,iy,i,j)=tmsu2(im,iy,i,j)/df(im,i,j)
      else
         tmsu2(im,iy,i,j)=-9.99e+33
      endif
      end do
end do
end do
end do

点评

谢谢共享: 5.0
谢谢共享: 5
  发表于 2016-10-8 16:38
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-3-25 23:14:28 | 显示全部楼层
呼啦呼啦 发表于 2015-3-25 22:16
谢谢版主!!以后改进帖子的提问方式。  还想问一下,像下面这样子写法来是不是就不用计数器了?
do im ...

额,没看出来你这个df哪里来的,你这个是用来完全替代之前红字部分?没看到累加过程啊。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-3-26 09:46:46 | 显示全部楼层
lqouc 发表于 2015-3-25 23:14
额,没看出来你这个df哪里来的,你这个是用来完全替代之前红字部分?没看到累加过程啊。

上面这一小段这是我编的一个类似程序里的一段,是用来求标准化距平的,完整的程序如下,里面也有很多对缺测的处理,我主要是想不考虑缺测,缺测不参与运算,还麻烦版主再帮我看一下,下面这个程序在处理缺测方面是否正确
    program main
      parameter(mo=12,my=32,nx=105,ny=16,mt=384)
      real tmsu2(mo,my,nx,ny),avf(mo,nx,ny),df(mo,nx,ny)
      real tmsu(nx,ny,mt),tmsu3(nx,ny,mt)
      integer cc

      open(1,file='D:\by\evalution_MSU_AMSU_BT\evalution\MSU_AMSU\AMSU\
     &long_term\total_ocean\lev700_TMT_1981_2012.grd',form='binary')
      do it=1,mt
      read(1) ((tmsu(i,j,it),i=1,nx),j=1,ny)
        end do
   
      do iy=1,my
      do im=1,mo
       kk=(iy-1)*12+im
       do i=1,nx
       do j=1,ny
      tmsu2(im,iy,i,j)=tmsu(i,j,kk)
        end do
        end do
        end do
        end do
     
      do im=1,mo
      do i=1,nx
      do j=1,ny
      avf(im,i,j)=0.0
        cc=0
      do iy=1,my
      if(tmsu2(im,iy,i,j).ne.-9999.000) then
      avf(im,i,j)=avf(im,i,j)+tmsu2(im,iy,i,j)
        else
      cc=cc+1
        endif
        end do
        if(cc.eq.0) then
        avf(im,i,j)=avf(im,i,j)/real(my)
        else
      avf(im,i,j)=-9999.000
        endif
        end do
        end do
        end do

      do im=1,mo
      do iy=1,my
      do i=1,nx
      do j=1,ny
      if(tmsu2(im,iy,i,j).ne.-9999.000.and.avf(im,i,j).ne.-9999.000)then
      tmsu2(im,iy,i,j)=tmsu2(im,iy,i,j)-avf(im,i,j)
      else
      tmsu2(im,iy,i,j)=-9999.000
      endif
        end do
        end do
        end do
        end do

       do  im=1,mo
       do  i=1,nx
       do  j=1,ny
       df(im,i,j)=0.0
        cc=0
       do iy=1,my
      if(tmsu2(im,iy,i,j).ne.-9999.000)THEN
        df(im,i,j)=df(im,i,j)+tmsu2(im,iy,i,j)*tmsu2(im,iy,i,j)
        else
          cc=cc+1
      endif
      end do
        if(cc.eq.0)then
           df(im,i,j)=SQRT(df(im,i,j)/real(my))
        else
         df(im,i,j)=-9999.000
        endif
      end do
        end do
        end do


      do im=1,mo
      do iy=1,my
      do i=1,nx
      do j=1,ny
      If(tmsu2(im,iy,i,j).ne.-9999.000.and.df(im,i,j).ne.-9999.000)then
        tmsu2(im,iy,i,j)=tmsu2(im,iy,i,j)/df(im,i,j)
      else
         tmsu2(im,iy,i,j)=-9999.000
      endif
      end do
        end do
        end do
        end do

      do  iy=1,my
      do  im=1,mo
      kk=(iy-1)*12+im
      do i=1,nx
      do j=1,ny
      tmsu3(i,j,kk)=tmsu2(im,iy,i,j)
      end do
        end do
        end do
        end do


      open(2,file='D:\by\evalution_MSU_AMSU_BT\evalution\MSU_AMSU\AMSU\
     &long_term\total_ocean\TMT_zhun_lev700.grd',form='binary')
       do it=1,mt
       write(2)((tmsu3(i,j,it),i=1,nx),j=1,ny)
       end do
      END
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-14 11:19:41 | 显示全部楼层
为什么我试了一下后,觉得赋初值 tmsu_ave=0.0的位置不太对??
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-9-1 11:30:31 | 显示全部楼层
lqouc 发表于 2015-3-24 15:56
唉,最近fortran版真是没人气啊,难得有个发帖的,不过楼主你这提问的水平真的值得提高哈,有空一定要看看 ...

那请问如果想要缺测值不参与计算该怎么办呢?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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