我想知道是否有人可以帮助我在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;的文件。
答案 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
不同的结果(由于第二个文件中此时没有数据,因此缺少此项。
有两种方法可以解决这个问题。
在循环中递增ano
的位置,添加命令close 1
。这将关闭输入数据文件,因此当下一个加载时,显示命令将正确显示其内容。
在循环的顶部,sdfopen
之前添加reinit
,这将重置许多内容,包括关闭所有打开的文件。您可以在每次循环迭代中设置输出,这对您来说不应该是一个问题。