如何使用GrADS读取/存储许多文件?

时间:2014-08-01 20:52:01

标签: file-io grads

我想知道是否有人可以帮助我在GrADS语言中找到有关此代码的问题。

我想阅读许多文件并计算和存储它们,但是当我在GraDS中执行此操作时,我对所有输入文件都有相同的答案。

有人可以帮我解决这个问题吗?

'reinit'

****Modify here******
var = v10

ano = 1980

while(ano <= 2013)

    *Desire point
    local = IAG
    **lat = -22.3
    **lon = 314.62

    latInitialP = -34.58
    lonInitialP = 305.43
    *******************************************************
    'sdfopen C:\Pesquisa_Michelle\dados_amandenha\V10m_'ano'.nc' 

    *Storing out
    'set gxout print'
    'set prnopts %10.2f 1 1'

    in = 1

    test = 1460
    if ( math_fmod(ano,4) = 0 )
      test = 1464
    endif

    while(in <= test)
        'set t 'in
        in2 = in + 3

        say in
        say in2 

        'define m = ave('var',t='in',t='in2')'
        'set lat 'latInitialP''
        'set lon 'lonInitialP''
        'd m'

        valor = sublin(result,2)
        lixo = write('C:\Pesquisa_Michelle\dados_amandenha\'var'_'ano'.txt',valor)
        in = in + 4
    endwhile
    lixo = close(''var'_'ano'.txt')
    ano = ano + 1
endwhile

更新

我没有收到有关此内容的错误(消息)。这很好,问题是结果文件。所有结果文件都有第一个结果,如文件复制。当我执行不使用循环,但更改&#34; ano&#34;的每个值时我自己得到了不同的结果。

在我看来,问题是命令:

&#39; sdfopen C:\ Pesquisa_Michelle \ dados_amandenha \ V10m _&#39; ano&#39; .nc&#39;

此命令不会替换每个&#34; ano&#34;的文件。

1 个答案:

答案 0 :(得分:1)

问题是您在主循环期间从不关闭输入数据文件或重置梯度。考虑这个我打开文件的例子:

% grads -l
ga-> open data/semicircle-qv14_s.ctl 
Scanning description file:  data/semicircle-qv14_s.ctl
Data file data/semicircle-qv14_00%y4_s.dat is open as file 1
LON set to -79.5 79.5 
LAT set to -79.5 79.5 
LEV set to 0.05 0.05 
Time values set: 0:7:3:0 0:7:3:0 
E set to 1 1 

请注意它是open as file 1。现在我将我的选择范围缩小到一个网格点并显示压力:

ga-> set lat 0
LAT set to 0.125 0.125 
ga-> set lon 0
LON set to 0.125 0.125 
ga-> set lev 5
LEV set to 4.92368 4.92368 
ga-> d prs
Result value = 55198.4 

压力为551hPa。看起来不错。现在让我们打开另一个数据文件而不关闭这个:

ga-> open data-fine/semicircle-qv14_s.ctl 
Scanning description file:  data-fine/semicircle-qv14_s.ctl
Data file data-fine/semicircle-qv14_00%y4_s.dat is open as file 2

请注意这是open as file 2。让我们显示来自此文件的压力:

ga-> d prs                                
Result value = 55198.4 
等等,这是相同的价值?是的,因为我们仍然在文件1中显示,所以此处prs与撰写prs.1相同。如果我们想要第二个文件的压力,我们需要使用prs.2

ga-> d prs.2
Result value = -9.99e+08 

不同的结果(由于第二个文件中此时没有数据,因此缺少此项。

有两种方法可以解决这个问题。

  1. 在循环中递增ano的位置,添加命令close 1。这将关闭输入数据文件,因此当下一个加载时,显示命令将正确显示其内容。

  2. 在循环的顶部,sdfopen之前添加reinit,这将重置许多内容,包括关闭所有打开的文件。您可以在每次循环迭代中设置输出,这对您来说不应该是一个问题。