微风拂面
forrtl severe 170 program exception stack overflow
金色的心 发表于 2011-07-24 23:25:33
解决办法:project-settings-link-catogery选output-stack allocations下,增加reserve的值(堆栈的大小)如100000000
Fortran输出grd接着输出ctl
金色的心 发表于 2011-07-07 11:04:56

open(3,file='*.grd',form='binary')
do i=1,n
do j=1,jtot
write(3)xwave(i,j)
write(3)
enddo
enddo
close(3)
write(ajtot,'(i3)')jtot
write(aan,'(i3)')n
open(5,file='*.ctl',form='formatted')
write(5,'(a)')'dset D:\……\*.grd'
write(5,'(a)')'UNDEF -9999.0'
write(5,'(a)')'xdef 1 linear 1 1'
write(5,'(a)')'ydef 1 linear 1 1'
write(5,'(a)')'zdef '//ajtot//' levels'
write(5,'(f13.6)')(period(i)*365,i=1,jtot)
write(5,'(a)')'TDEF '//aan//' LINEAR 16Aug2010 1dy'
write(5,'(a)')'vars 1'
write(5,'(a)')'w '//ajtot//' 99 wave'
write(5,'(a)')'endvars'
close(5)
Fortran中调用grads程序直接出图
金色的心 发表于 2011-07-07 10:50:27
USE DFLIB
LOGICAL(4) RESULT
RESULT=SYSTEMQQ('D:\……\*.bat')
注意程序中如果有IMPLICIT NONE,会提示systemqq未定义,不晓具体问题,直接注解掉implicit none。
2、创建.bat文件
C:\……\opengrads.exe -blcx d:\……\*.gs
运行程序即可。
更多操作可参考此贴:请问如何用visual fortran 创建文件夹?
Fortran读取9210格式的FY-2D/FY-2E数据
金色的心 发表于 2011-04-18 18:29:55
方案一:如果是visual fortran的话,可以open语句里加上,convert=big_endian,具体看帮助
方案二:在WIN XP下进行字节交换的程序(原来不知用convert=big_endian),WIN下recl最小是4格字节,不知SGI多长,但程序思路可借你参考,把1个4字节变为2个2字节。
module btye1_to_4
integer(1) m(4)
integer(4) m4
equivalence(m,m4)
end module btye1_to_4
program main
use btye1_to_4
PARAMETER(NX=40,NY=40)
integer(1) mm(4)
!integer(4) m4
open(11,FILE='test.dat',form='unformatted',access='direct',recl=1,status='old')
open(12,FILE='tttt.dat',form='unformatted',access='direct',recl=1)
INUMBER=0
DO 100 K=1,143628800/4
INUMBER=INUMBER+1
READ(11,REC=INUMBER) m4
mm(1)=m(4);mm(2)=m(3);mm(3)=m(2);mm(4)=m(1)
WRITE(12,REC=INUMBER) mm
100 CONTINUE
END
C=================================================
SUBROUTINE MYSWAP(INVAR,STARTP,NUM_BYTES)
!SWAP BYTE BETWEEN SEGMENT: INVAR(STARTP:STARTP+NUMBYTES)
BYTE INVAR(1),TEMP
INTEGER STARTP,NUM_BYTES
IF (NUM_BYTES .EQ. 2) THEN
TEMP = INVAR(STARTP);
INVAR(STARTP) = INVAR(STARTP + 1);
INVAR(STARTP + 1) = TEMP;
RETURN
ELSE IF(NUM_BYTES .EQ. 4) THEN
TEMP = INVAR(STARTP);
INVAR(STARTP) = INVAR(STARTP + 3);
INVAR(STARTP + 3) = TEMP;
TEMP = INVAR(STARTP + 1);
INVAR(STARTP + 1) = INVAR(STARTP + 2);
INVAR(STARTP + 2) = TEMP;
ENDIF
RETURN
END
C=================================================
方案三:我原来有些雷达资料是每个象素点,占一个字节,但WIN XP下得CVF每次读数据最少4个字节,因此也是通过
module btye1_to_4
integer(1) m(4)
integer(4) m4
equivalence(m,m4)
end module btye1_to_4
将一次读入的数据(4个字节)拆解为4个单字节。而你的问题可能类似,SGI可能也是一次最少读入4个字节数据,参考此方法分解为2个2字节数据。如果还有字节交换,也可在分解时同时进行交换。
其实你可用二进制文本编辑器,做一个文件,头三字节为0,第四字节为1,如以16进制表达:
00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04,
供16个字节,试试读前两个数是否是1和2,如果是则说明SGI一次读入4个字节数据;如果不是可能性较多,可能有字节交换问题,可能一次读入2或8个字节数据,假设多种方案试试。
方案四:CVF里的编译选项,project settings--fortran,在下面加上 /assume:byterecl,或在fortran data这个选项里,选Use Bytes as RECL= unit for unformatted Files //可以阅读一下visual fortran里Converting Unformatted Numeric Data的说明,里面对各种机型的字长都有说明,还是比较详细的。
采用方案四完美解决!
南支槽
金色的心 发表于 2011-04-11 21:14:25
据统计,地中海、孟加拉湾、北美西海岸和非洲西海岸是北半球四个南支槽活动最频繁的地区,孟加拉湾是其中首位。孟加拉湾南支槽生成一般有三类,大多影响我国南方。当华东沿海高压脊发展和地面华西倒槽加强时,是孟加拉湾较强南支槽东移的表征,可影响到长江流域。
孟加拉湾南支槽活动有明显的季节性,从表2中可以看出 10月~次年6月都有南支槽活动,其中3~5月最为活跃。而每年夏季副热带高压北进,西风带锋区北抬,25 °N以南为副高控制,因而7~9月基本上没有明显的移动性南支槽活动。5~6月和9~10月是季节转换期,也是南支槽趋向沉寂或活跃的转换期。6月份西太平洋副高加强西伸,则与东伸的伊朗副高间形成稳定的孟加拉湾低槽,长江中下游随之进入梅雨。这种低槽不再是南支波动,而是稳定性的,有人称之为梅雨“锚槽”。10月副高南退,南支波动重新趋于活跃。
南支槽的季节性变化与冷空气活动有着密切的关系。3~5月和11月春、秋季节天气忽冷忽热,冷空气最活跃。6~8月冷空气活动频数最少,而南支波动则是7~9月最不活跃,仅有一个月的相差。南支槽活跃的年份,历史上春季(3~4月)降水量最多的1977年和1987年,3~4月南支槽出现的频数都在20天以上(历年平均15天)。由此可以推断,南支槽的多寡与冷暖空气活动的密切相关,可能是冷暖空气激发的产物。
孟加拉湾南支槽的生成和东移
孟加拉湾南支波动的生成一般有如下三类:
1 地中海南支槽东移
地中海(25°N、35°E)是北半球低纬度南支槽的高频区域,并在孟加拉湾上游地区,影响我国南方的南支波动,有一部分来自该地区。上海气象台曾对55~65°E的咸海槽作过统计,当南支波动前部无强脊,后部无深槽时,大多会东移。安徽省气象台中期用欧洲500hPa等压面60°E时间剖面图低纬地区由西南风转为西北风时作为一次南支槽东移的判别指标,一般5天左右影响,平均移速6~9个经度/天。
2 高原西部大槽断裂,生成南支槽
巴尔喀什湖一带大槽东移,遇高原阻挡,气流分为北、南两支分别东移,北支移速稍快,南支移速偏慢,生成南支槽。用30°N上90-120°E高度差h来表示高原南侧南支槽槽脊活动。当差值h<0时,有南支东移,h>0时,高原有脊东移。
3 上游效应
中低纬度环流呈纬向型,盛行偏西气流时,当上游非洲西海岸、地中海到阿拉伯半岛一带有槽脊发展,波动振幅加大,下游高原南侧常会生成南支波动,向东传播。当南支波动东移到孟加拉湾地区时,受地形影响常常移速减慢或有停留,强度也有所加强,发展形成孟加拉湾南支槽。
注:部分内容参考了《东南亚和南亚的大气环流和天气》
多数据文件批处理的一个技巧
金色的心 发表于 2011-04-09 13:39:13
1、MATLAB
clc;clear;
%--将'e:/POP/data/'下的文件信息写入构架数组file_structure
file_structure = dir('e:/POP/data/');
%--file_structure.name下是'e:/POP/data/'内的文件名
for i=3:size(file_structure)
filename = strcat('e:/POP/data/',file_structure(i).name)
f=netcdf(filename,'nowrite');
a=['在此对f及里面的变量操作...']
close(f)
end
2、FORTRAN
program main
!==================================================
character(len=40) :: temp
character(len=57),dimension(17) :: filename
!===================================================
!--调用系统命令
!
call system('dir e:\POP\data\ > file_information.dat')
!
!=======================================================
!--从文件file_information.dat中读取文件名
!
open(1,file = 'file_information.dat',status='old')
do i = 1,7
read(1,*)
enddo
do j=1,17
read(1,'(a36,a57)') temp, filename(j)
enddo
print*,filename
!======================================================
!--操作文件
!
print*, '在此操作文件'
!=====================================================
end
