-1

我想知道是否有人可以帮助我以 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

更新

我没有收到有关此的错误(消息)。效果很好,问题是结果文件。所有结果文件都有第一个结果,如文件复制。当我不使用循环执行该操作,而是自己更改“ano”的每个值时,我得到了不同的结果。

在我看来,问题是命令:

'sdfopen C:\Pesquisa_Michelle\dados_amandenha\V10m_'ano'.nc'

此命令不会替换每个“ano”的文件。

4

1 回答 1

1

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

% 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 

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

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. 在循环的顶部,在sdfopenadd之前reinit,这将重置很多东西,包括关闭所有打开的文件。您在每次循环迭代中设置输出,所以这对您来说应该不是问题。

于 2014-08-02T13:30:14.073 回答