fortran-micaps
fortran教程
fortran教程Fortran是一种编程语言,用于科学和工程计算。
它具有高性能和可靠性,适用于大规模的数值计算和数据处理。
Fortran的基本语法是由一系列语句组成的程序。
每个语句都以一个数字标签开头,可用于控制程序的执行顺序。
以下是Fortran的一些基本语法和常用功能。
1. 变量和数据类型Fortran支持多种数据类型,包括整数(Integer)、实数(Real)和字符(Character)。
变量声明可以在程序的开头部分完成,例如:```fortranINTEGER :: iREAL :: xCHARACTER(len=10) :: name```注意,每个变量声明必须以两个冒号(::)开头。
2. 数学运算Fortran提供了一系列的数学运算符,用于执行基本的算术和逻辑运算,例如加法(+)、减法(-)、乘法(*)、除法(/)和求余(MOD)。
运算符的使用与其他编程语言相似。
3. 控制结构Fortran支持常用的控制结构,例如条件语句(IF-ELSE)和循环语句(DO LOOP)。
条件语句可以根据条件来执行不同的代码块,例如:```fortranIF (i > 0) THENPRINT*, 'i is positive'ELSEPRINT*, 'i is non-positive'END IF```循环语句可以根据条件重复执行一部分代码,例如:```fortranDO i = 1, 10PRINT*, iEND DO```上述代码将打印出1到10的数字。
4. 数组和矩阵运算Fortran支持多维数组和矩阵运算。
声明数组时可以指定维度和元素类型,例如:```fortranREAL, DIMENSION(3,3) :: matrix```然后,可以使用多个索引访问数组元素,例如:```fortranmatrix(1,2) = 3.14```这将给数组中的第1行第2列的元素赋值为3.14。
fortran指令大全
附录C SCILAB 部分函数指令表(c)LIAMA. All rights reserved.(注解:本指令表只收集了部分常用指令, 有关全部指令请参照文档文件)+ 加- 减* 矩阵乘数组乘*.1. 通用指令^ 矩阵乘方数组乘方^.\ 反斜杠或左除help 在线帮助/ 斜杠或右除apropos 文档中关键词搜寻或.\ 数组除/.ans 缺省变量名以及最新表达式的运算结果== 等号~= 不等号clear 从内存中清除变量和函数< 小于exit 关闭SCILAB> 大于quit 退出SCILAB<= 小于或等于save 把内存变量存入磁盘>= 大于或等于exec 运行脚本文件&,and 逻辑与mode 文件运行中的显示格式|,or 逻辑或getversion 显示SCILAB 版本~,not 逻辑非ieee 浮点运算溢出显示模式选择: 冒号who 列出工作内存中的变量名( ) 园括号edit 文件编辑器[ ] 方括号type 变量类型{ } 花括号what 列出SCILAB 基本命令小数点.format 设置数据输出格式, 逗号chdir 改变当前工作目录; 分号getenv 给出环境值// 注释号mkdir 创建目录= 赋值符号pwd 显示当前工作目录' 引号evstr 执行表达式' 复数转置号转置号'.ans 最新表达式的运算结果2.运算符和特殊算符%eps 浮点误差容限, =2-52≈2.22×10-16%i 虚数单位= √(-1)%inf 正无穷大%pi 圆周率,π=3.1415926535897....3. 编程语言结构abort 中止计算或循环break 终止最内循环case 同select 一起使用continue 将控制转交给外层的for或while循环else 同if一起使用elseif 同if一起使用end 结束for,while,if 语句for 按规定次数重复执行语句if 条件执行语句otherwise 可同switch 一起使用pause 暂停模式return 返回select 多个条件分支then 同if一起使用while 不确定次数重复执行语句eval 特定值计算feval 函数特定值计算或多变量计算function 函数文件头global 定义全局变量isglobal 检测变量是否为全局变量error 显示错误信息lasterror 显示最近的错误信息sprintf 按格式把数字转换为串warning 显示警告信息4.基本数学函数acos 反余弦acosh 反双曲余弦acot 反余切acoth 反双曲余切acsc 反余割acsch 反双曲余割asin 反正弦asinh 反双曲正弦atan 反正切atanh 反双曲正切cos 余弦cosh 双曲余弦cotg 余切coth 双曲余切sin 正弦sinh 双曲正弦tan 正切tanh 双曲正切exp 指数log 自然对数log10 常用对数log2 以2为底的对数sqrt 平方根abs 绝对值conj 复数共轭imag 复数虚部real 复数实部ceil 向上(正无穷大方向)取整fix 向零方向取整floor 向下(负无穷大方向)取整round 四舍五入取整sign 符号函数gsort 降次排序erf 误差函数erfc 补误差函数gamma gamma 函数interp 插值函数interpln 线性插值函数intsplin 样条插值函数smooth 样条平滑函数spline 样条函数quarewave 方波函数sign 符号函数double 将整数转换为双精度浮点数5.基本矩阵函数和操作eye 单位阵zeros 全零矩阵ones 全1 矩阵rand 均匀分布随机阵genmarkov 生成随机Markov 矩阵linspace 线性等分向量logspace 对数等分向量logm 矩阵对数运算cumprod 矩阵元素累计乘cumsum 矩阵元素累计和toeplitz Toeplitz 矩阵disp 显示矩阵和文字内容length 确定向量的长度size 确定矩阵的维数diag 创建对角阵或抽取对角向量find 找出非零元素1的下标matrix 矩阵变维rot90 矩阵逆时针旋转90度sub2ind 据全下标换算出单下标tril 抽取下三角阵triu 抽取上三角阵conj 共轭矩阵companion 伴随矩阵det 行列式的值norm 矩阵或向量范数nnz 矩阵中非零元素个数null 清空向量或矩阵中的某个元素orth 正交基rank 矩阵秩trace 矩阵迹cond 矩阵条件数rcond 逆矩阵条件数inv 矩阵的逆lu LU分解或高斯消元法pinv 伪逆qr QR分解givens Givens 变换linsolve 求解线性方程lyap Lyapunov 方程hess Hessenberg 矩阵poly 特征多项式schur Schur 分解expm 矩阵指数expm1 矩阵指数的Pade逼近expm2 用泰勒级数求矩阵指数expm3 通过特征值和特征向量求矩阵指数funm 计算一般矩阵函数logm 矩阵对数sqrtm 矩阵平方根6. 特性值与奇异值spec 矩阵特征值gspec 矩阵束特征值bdiag 块矩阵, 广义特征向量eigenmarkov 正则化Markov 特征向量pbig 特征空间投影svd 奇异值分解sva 奇异值分解近似7. 矩阵元素运算cumprod 元素累计积cumsum 元素累计和hist 统计频数直方图max 最大值mean 平均值median 中值min 最小值prod 元素积sort 由大到小排序std 标准差sum 元素和trapz 梯形数值积分corr 求相关系数或方差8. 稀疏矩阵运算sparse 稀疏矩阵(只存储非零元素)adj2sp 邻接矩阵转换为稀疏矩阵full 稀疏矩阵转换为全矩阵mtlb_sparse 将SCILAB 稀疏矩阵转换为MA TLAB稀疏矩阵格式sp2adj 稀疏矩阵转换为邻接矩阵speye 稀疏矩阵方式单位阵sprand 稀疏矩阵方式随机矩阵spzeros 稀疏矩阵方式全零阵lufact 稀疏矩阵LU分解lusolve 稀疏矩阵方程求解spchol 稀疏矩阵Cholesky分解9. 输入输出函数diary 生成屏幕文本记录disp 变量显示file 文件管理input 用户键盘输入load 读已存的变量mclose 关闭文件mget 读二进制文件mgetl 按行读ASCII码文件mgetstr 读字符串中单个字mopen 打开文件mput 写二进制文件mfscanf 读ASCII 码文件print 将变量记录为文件read 读矩阵变量save 存变量为二进制文件strartup 启动文件write 按格式存文件xgetfile 对话方式获取文件路径x_dialog 建立Xwindow参数输入对话框Tk_Getvar 得到Tk文件变量Tk_EvalFile 执行Tk 文件10. 函数与函数库操作deff 在线定义函数edit 函数编辑器function 打开函数定义functions SCILAB 函数或对象genlib 在给定目录下建立所有文件的函数库get_function_path 读函数库的文件存储目录路径getd 读函数库中的全部文件getf 在文件中定义一个函数lib 函数库定义macro SCILAB函数或对象macrovar 输入变量个数newfun 输出变量个数11. 字符串操作code2str 将SCILAB数码转换为字符串convstr 字母大小转换emptystr 清空字符串grep 搜寻相同字符串part 字符提取str2code 将字符串转换为SCILAB数码string 字符串转换strings SCILAB 对象, 字符串strcat 连接字符strindex 字符串的字符位置搜寻strsubst 字符串中的字符替换12. 日期与时间date 日期getdate 读日期与时间timer CPU时间计时13. 二维图形函数plot2d 直角坐标下线性刻度曲线champ 2 维向量场champ1 由颜色箭头表示的2维向量场contour2d 等高线图errbar 曲线上增加误差范围框线条grayplot 应用颜色表示的表面xgrid 画坐标网格线histplot 统计频数直方图Matplot 散点图阵列14. 三维图形函数plot3d 三维表面plot3d1 用颜色或灰度表示的三维表面param3d 三维中单曲线param3d1 三维中多曲线contour 三维表面上的等高线图hist3d 三维表示的统计频数直方图geom3d 三维向二维上的投影15. 线条类图形xpoly 单线条或单多边形xpolys 多线条或多各多边形xrpoly 正多边形xsegs 非连接线段xfpoly 单个多边形内填充xfpolys 多个多边形内填充xrect 矩形xfrect 单个矩形内填充xrects 多个矩形内填充xarc 单个弧线段或弧园xarcs 多个弧线段或弧园xfarc 单个弧线段或弧园填充xfarcs 多个弧线段或弧园填充xarrows 多箭头16. 图形注释, 变换xstring 图形中字符xstringb 框内字符xtitle 图形标题xaxis 轴名标注plotframe 图形加框并画坐标网格线isoview 等尺寸比例显示(原图形窗口不改变)square 等尺寸比例显示(原图形窗口改变)xsetech 设置小窗口xchange 转换实数为图形象素坐标值subplot 设置多个子窗口17. 图形颜色及图形文字colormap 应用颜色图getcolor 交互式选择颜色图addcolor 增加新色于颜色图graycolormap 线性灰度图hotcolormap 热色(红到黄色)颜色图xset 图形显示方式设定xget 读当前图形显示方式设定getsymbol 交互式选择符号和尺寸18. 图形文件及图形文字xsave 将图形存储为文件xload 从磁盘中读出图形文件xbasimp 将图形按PS文件打印或存储为文件xs2fig 将图形生成Xfig 格式文件xbasc 取消图形窗及其相关内容xclear 清空图形窗driver 选择图形驱动器xinit 图形驱动器初始化xend 关闭图形xbasr 图形刷新replot 更改显示范围后的图形刷新xdel 关闭图形xname 改变当前图形窗名称19. 控制分析用图形bode 伯德图坐标gainplot 幅值图坐标(伯德图中的幅值图) nyquist 奈奎斯特图m_circle M-圆图chart 尼库拉斯图black Black-图evans 根轨迹图sgrid s 平面图plzr 零-极点图zgrid z 平面图20. 图形应用中的其它指令graphics 图形库指令表xclick 等待鼠标在图形上的点击输入locate 由鼠标点击读入图形中的多点位置坐标xgetmouse 由鼠标点击读入图形中的当前点位置坐标21. 系统与控制abcd 状态空间矩阵cont_mat 可控矩阵csim 线性系统时域响应dsimul 状态空间的离散时域响应feedback 反馈操作符flts 时域响应(离散、采样系统〕frep2tf 基于传递函数的频域响应freq 频域响应g_margin 幅值裕量imrep2ss 基于状态空间的脉冲响应lin 线性化操作lqe Kalman 滤波器lqg LQG补偿器lqr LQ补偿器ltitr 基于状态空间的离散时域响应obscont 基于观测器的控制器observer 观测器obsv_mat 观测矩阵p_margin 相位裕量phasemag 相位与幅值计算ppol 极点配置repfreq 频域响应ricc Riccati 方程rtitr 基于传递函数的离散时域响应sm2ss 系统矩阵到状态空间变换ss2ss 反馈连接的状态空间到状态空间变换ss2tf 状态空间到传递函数变换stabil 稳定性计算tf2ss 传递函数到状态空间变换time_id SISO系统最小方差辨识22. 鲁棒控制augment 被控对象增广操作bstap Hankel 矩阵近似ccontrg H∞控制器dhnorm 离散H∞范数h2norm H2 范数h_cl 闭环矩阵h_inf H∞控制器h_norm H∞范数hankelsv Hankel 矩阵奇异值leqr H∞控制器的LQ增益linf 无穷范数riccati Riccati 矩阵sensi 敏感函数23. 动态系统arma ARMA模型arma2p 基于AR模型中获得多项式矩阵armac ARMAX 辨识arsimul ARMAX系统仿真noisegen 噪声信号发生器odedi 常微分方程仿真检测prbs_a 伪随机二进制序列发生器reglin 线性拟合24. 系统与控制实例artest Arnold 动态系统bifish 鱼群人口发展的离散时域模型boucle 具有观测器的动态系统相位图chaintest 生物链模型gpech 渔业模型fusee 登陆火箭问题lotest Lorennz 吸引子mine 采矿问题obscontl可控可观系统portr3d 三维相位图portrait 二维相位图recur 双线性回归方程systems 动态系统tangent 动态系统的线性化tadinit 动态系统的交互初始化25. 非线性工具(优化与仿真〕bvode 边界值问题的常微分方程dasrt 隐式微分方程过零解dassl 代数微分方程datafit 基于测量数据的参数辨识derivative 导数计算fsolve 非线性函数过零解impl 线性微分方程int2d 二维定积分int3d 三维定积分intg 不定积分leastsq 非线性最小二乘法linpro 线性规划lmisolver 线性不等矩阵ode 常微分方程ode_discrete 离散常微分方程ode_root 常微分方程根解odedc 连续/离散常微分方程optim 非线性优化quapro 线性二次型规划semidef 半正定规划26. 多项式计算coeff 多项式系数coffg 多项式矩阵逆degree 多项式阶数denom 分母项derivat 有理矩阵求导determ 矩阵行列式值factors 因式分解hermit Hermit 型horner 多项式计算invr 有理矩阵逆lcm 最小公倍数ldiv 多项式矩阵长除numer 分子项pdiv 多项式矩阵除pol2des 多项式矩阵到表达式变换pol2str 多项式到字符串变换polfact 最小因式residu 余量roots 多项式根simp 多项式化简systmat 系统矩阵27. 信号处理%asn 椭圆积分%k Jacobi完全椭圆积分%sn Jacobi 椭圆函数analpf 模拟量低通滤波器buttmag Butterworth 滤波器响应cepstrum 倒谱计算cheb1mag Chebyshev 一型响应cheb2mag Chebyshev 二型响应chepol Chebyshev 多项式convol 卷积corr 相关, 协方差cspect 谱估计(应用相关法)dft 离散富立叶变换fft 快速富立叶变换filter 滤波器建模fsfirlin FIR滤波器设计hank 协方差矩阵到Hankel矩阵变换hilb Hilbert 变换iir IIR数字滤波器intdec 信号采样率更改kalm Kalman 滤波器更新mese 最大熵谱估计mfft 多维快速富立叶变换mrfit 频率响应拟合phc Markov 过程srkf Kalman 滤波器平方根sskf 稳态Kalman 滤波器system 观测更新wfir 线性相位FIR滤波器weiener Weiener(维纳)滤波器window 对称窗函数yulewalk 最小二乘滤波器zpbutt Buthererworth 模拟滤波器zpch1 Chebyshev 模拟滤波器28. 音频信号analyze 音频信号频域图auread 读*.au 音频文件auwrite 写*.au 音频文件lin2mu 将线性信号转换为µ率码信号loadwave 取*.wav 音频文件mapsound 音频信号图示mu2lin 将µ率码信号转换为线性信号playsnd 音频信号播放savewave 存*.wav 音频文件wavread 读*.wav 音频文件wavwrite 写*.wav 音频文件29. 语言与数据转换工具ascii 字符串的ASCII码excel2sci 读ASCII 格式的Excel 文件fun2string 将SCILAB 函数生成ASCII 码mfile2sci 将MA TLAB 的M 格式文件转换为SCI格式文件mtlb_load 取MA TLAB第4版本文件中变量matlb_save 按MA TLAB 第 4 版本文件格式存变量pol2tex 将多项式转换为TeX格式sci2for 将SCILAB 函数转换为FORTRAN格式文件texprint 按TeX 格式输出SCILAB 对象translatepaths 将子目录下的所有MA TLAB 文件转换为SCI文件格式一个公式写成Fortran语言代码program baiduinteger::I,J,Nreal*8::Cr,Treal*8,dimension(:),allocatable ::P,XN=3!变量X的个数Cr=5.0d0!常量Cr,自己设定T=4.0d0!常量T,自己设定allocate(P(N),X(N))! =======读入变量X的值do I=1,Nwrite(*,*)"请输入第",I," 个变量的值:"read(*,*)X(I)enddo! =======读入变量X的值do I=1,NP(I)=(-4.2d0/Cr**2*X(I)+2.9/Cr)*Twrite(*,*)“第”,I," 个变量X对应结果:",P(I)enddoend。
Fortran进行批处理地方法
Fortran中批量处理文件的方法总结—循环读取目录下的所有符合条件的文件=====================一、简单的介绍在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。
对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦!这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。
我总结的批处理方法大概可以用下面这个示意图来说明:|||将文件目录写入一个文本文件,供fortran循环读取|————手动输入文件名|————运行程序之前命令行工具导出文件名|————程序运行后,未开始计算之前,生成文件名| ————调用CMD命令生成| ————GETFILEINFOQQ方法生成| ————调用WIN32API生成||在程序运行时动态生成文件名||对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。
第二种方法主要是说明其思路。
二、方法的介绍1、将文件目录写入一个文本文件,供fortran循环读取1.1、手动输入文件名这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。
1.2、运行程序之前命令行工具导出文件名这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。
a、从运行工具打开你的CMD窗口;b、转到要处理的当前目录(可省略):CD /d 路径,如:CD /d e:\test这样可以快速到达e:\test目录c、使用DIR命令列出文件目录信息到指定的文件,通常使用的Dir *.*>新文件名这个命令在这里已经不能满足要求,因为会列出一堆对于我们处理而言无用的信息,现在要使用的命令是:DIR /b filter>newfile注意,其中的filter为文件筛选,必须自己修改为所需的,比如你可以把它改成*.txt,这样,就会列出当前目录下的所有txt结尾的文件了。
Fortran进行批处理地方法
Fortran进行批处理地方法Fortran中批量处理文件的方法总结—循环读取目录下的所有符合条件的文件=====================一、简单的介绍在一年之前,我写过一个程序,主要是对Micaps资料进行批量处理,将逐日资料处理为旬、月的数据,在那个程序中,始终有一个问题困扰我,就是如何自动生成该读取的下一个文件名,这使我真正开始关注fortran中的批处理,时隔一年,决定写下这些文字,将我用到的一些fortran批处理的方法和大家共享,交流。
对于那些只要会用程序,不求其中原理的朋友,请马上跳过这些文字,直接去下载附件吧!程序里有使用说明,但是,如果你不懂原理,估计现成的程序你使用起来也会碰壁哦!这里所说的批处理是指对某一个目录下的指定后缀的文件的批量读取和处理。
我总结的批处理方法大概可以用下面这个示意图来说明:|||将文件目录写入一个文本文件,供fortran循环读取|————手动输入文件名|————运行程序之前命令行工具导出文件名|————程序运行后,未开始计算之前,生成文件名| ————调用CMD命令生成| ————GETFILEINFOQQ方法生成| ————调用WIN32API生成||在程序运行时动态生成文件名||对于第一种方法,我将主要介绍如何将目录写入文件,然后举出一个小的示例来验证。
第二种方法主要是说明其思路。
二、方法的介绍1、将文件目录写入一个文本文件,供fortran循环读取1.1、手动输入文件名这是最基本的方法啦,如果文件个数不多,而且文件名中包含了空格等特殊字符的话,建议使用这种方法,在这里就不多说啦,至于在fortran中的处理,等几个小方法介绍完之后会有一个例子来说明。
1.2、运行程序之前命令行工具导出文件名这是一个既高效又保险的方法,主要思路就是通过强大的CMD命令列出目录下的文件到一个指定的文件中,然后由fortran去循环读取该文件中的文件名信息,从而批量处理。
fortran语法手册
1 FORTRAN77四则运算符+ - * / ** (其中**表示乘方)在表达式中按优先级次序由低到高为: +或-→*或/→**→函数→()2 FORTRAN77变量类型2.1 隐含约定:I-N规则凡是以字母I,J,K,L,M,N六个字母开头的,即认为是整型变量,其它为实型变量。
2.2 用类型说明语句确定变量类型:可以改变I-N规则2.3 用IMPLICIT语句将某一字母开头的全部变量指定为所需类型如 IMPLICIT REAL (I,J)三种定义的优先级别由低到高顺序为:I-N规则→IMPLICIT语句→类型说明语句,因此,在程序中IMPLICIT语句应放在类型说明语句之前。
2.4 数组的说明与使用使用I-N规则时用DIMENSION说明数组,也可在定义变量类型同时说明数组,说明格式为:数组名(下标下界,下标上界),也可省略下标下界,此时默认为1,例:DIMENSION IA(0:9),ND(80:99),W(3,2),NUM(-1:0),A(0:2,0:1,0:3)REAL IA(10),ND(80:99)使用隐含DO循环进行数组输入输出操作:例如WRITE(*,10) ('I=',I,'A=',A(I),I=1,10,2)10FORMAT(1X,5(A2,I2,1X,A2,I4))2.5 使用DATA语句给数组赋初值变量表中可出现变量名,数组名,数组元素名,隐含DO循环,但不许出现任何形式的表达式:例如DATA A,B,C/-1.0,-1.0,-1.0/DATA A/-1.0/,B/-1.0/,C/-1.0/DATA A,B,C/3*-1.0/CHARACTER*6 CHN(10)DATA CHN/10*' '/INTEGER NUM(1000)DATA (NUM(I),I=1,500)/500*0/,(NUM(I),I=501,1000)/500*1/3 FORTRAN77程序书写规则程序中的变量名,不分大小写;变量名称是以字母开头再加上1到5位字母或数字构成,即变更名字串中只有前6位有效;一行只能写一个语句;程序的第一个语句固定为PROGRAM 程序名称字符串某行的第1个字符至第5个字符位为标号区,只能书写语句标号或空着或注释内容;某行的第1个字符为C或*号时,则表示该行为注释行,其后面的内容为注释内容;某行的第6个字符位为非空格和非0字符时,则该行为上一行的续行,一个语句最多可有19个续行;某行的第7至72字符位为语句区,语句区内可以任加空格以求美观;某行的第73至80字符位为注释区,80字符位以后不能有内容。
Fortran语法(中级)
Fortran语法(中级)!-----------------------------------------------------------------------EXTERNAL属性和哑过程 (哑元为外部过程,即哑过程)指定EXTERNAL语句或属性说明实元实际上是外部过程类型定义语句:类型,EXTERNAL :: 外部函数名[,外部函数名]…或EXTERNAL语句:EXTERNAL [外部函数名][,⼦程序名][,块数据名]…哑元也可以是⼀个过程,这时作为哑元的过程称为哑过程。
(⾄少两层调⽤)例如:!-----------------------------------------------------------------------Programm mainReal x,yExternal Plus !外部过程名作实元,必须⽤External说明,或者具有External属性x=1.0 ; y=2.0Print,* Calculate(x,y,Plus) !调⽤Calculate函数,实元为外部过程PlusEnd Program mainReal Function Plus(a,b) !(第⼆层被调⽤的外部函数)Real, Intent(In) :: a,bPlus=a+bEnd Function PlusReal Function Calculate (x,y,func)Real, Intent(In) :: x,yReal, External func !类型定义语句, 说明哑元时⼀个外部过程, 也可以直接⽤External说明Calculate=func(x,y) !调⽤⾃定义的外部函数End Function Calculate!-----------------------------------------------------------------------或者将 Real, External func 改为接⼝程序:InterfaceReal Function Plus(a,b) !Plus被接⼝块说明为⼀个哑元,即⼀个哑过程Real, Intent(In) :: a,bEnd Function PlusEnd InterfaceINTENT属性 (过程的哑元说明)在类型定义语句中:类型,INTENT(意图说明符) :: 哑元名表或⽤INTENT语句: INTENT(意图说明符) :: 哑元名表意图说明符为以下字符串:IN 指明哑元仅⽤于向过程提供数据,过程的执⾏期间哑元不能被重定义或成为未定义的,相联合的实元可以是常数、变量、数组以及它们的算术表达式。
fortran 调用C函数
data wg / & 0.555555555555555555556D+00,
& 0.888888888888888888889D+00, & 0.555555555555555555556D+00 / data wk / & 0.104656226026467265194D+00, & 0.268488089868333440729D+00, & 0.401397414775962222905D+00, & 0.450916538658474142345D+00, & 0.401397414775962222905D+00, & 0.268488089868333440729D+00, & 0.104656226026467265194D+00 / data xg / & -0.77459666924148337704D+00, & 0.0D+00, & 0.77459666924148337704D+00 / data xk / & -0.96049126870802028342D+00, & -0.77459666924148337704D+00, & -0.43424374934680255800D+00, & 0.0D+00, & 0.43424374934680255800D+00, & 0.77459666924148337704D+00, & 0.96049126870802028342D+00 /
fortran编译器操作
fortran编译器操作关于fortran语⾔的编译器使⽤问题此⽂是⼀个简明教程,仅适合初学者来使⽤。
⽼鸟们⼤⽜们就不⽤在看了。
本⽂档的⽬的是为了⽅便初学者快速的掌握基本的fortran编译器的使⽤。
⼀、关于cvf(compaq virtual fortran)CVF操作⽅便,限制不多。
⼀般常⽤的有两种新建⼯程的⽅法:a)打开cvf,点击新建file----new,弹出选择对话框,简单的程序可以选择fortran console application。
在左侧projectname处填写⼯程名字,在location处填写(选择)⼯程保存路径。
注意cvf中要求不允许出现汉语路径。
操作顺序图如下第⼀步:第⼆步:第三步:第四步:运⾏⾄此,所有步骤完成。
b)直接打开cvf,点击新建⽂档(new)然后单击保存,弹出保存对话框,选择保存路径及⽂件夹,⽂件名改为“⼯程名.f90”格式此处注意如果是fortran⾃由格式,请保存为*.f90或*.f95格式,如果是固定格式请保存为*.for或*.f格式。
因为编译器是根据后缀的不同调⽤不同的语⾔编译器,否则将出错。
保存⽂件的路径和⽂件夹即为该⼯程所在的路径和⽂件夹。
同样不能有汉语。
⽰意图如下:第⼀步第⼆步、第三步、⾄此,所有的⼯程完成。
⼆、关于CVF的调试(debug)在相应代码编辑框左侧发灰⾊的竖线部分,⿏标变为反三⾓⽅向的形状时即可右键⿏标,选择insert/remove BreakPoint选项,在代码左侧可以看到⼀个红⾊的标⽰(代码⾏尽量不要设在代码最后。
可以设置到⾃认为可能发⽣错误的地⽅。
或者尽量靠前设置),此时就可以按F5进⼊调试状态。
可以在watch窗⼝查看各个变量,数组的值与内容。
按F11进⾏单步运⾏。
查看错误出处。
具体的更细致的调试,请参看相关⽂献或书籍。
这类书籍不少。
具体操作如下:6三、关于IVF (intel virtual fortran )编译器的使⽤由于ivf 要求⽐较严格,且⾃⾝不带IDE 窗⼝。
fortran里minloc的使用 -回复
fortran里minloc的使用-回复Fortran is a programming language commonly used in scientific and engineering applications. One useful function in Fortran is`minloc`, which allows programmers to find the position of the smallest element in an array. In this article, we will explore the various aspects of using `minloc` in Fortran, step by step.1. Introduction to `minloc`:The `minloc` function in Fortran returns the position of the smallest element in an array, along with its value. The function is defined as `minloc(array, dim, mask)` where `array` is the input array, `dim` specifies the dimension along which the minimum value is sought, and `mask` is an optional argument that allows selective searching.2. Basic usage:The simplest usage of `minloc` involves finding the index of the smallest element in an array along a given dimension. For example, consider the following array `A`:fortranreal :: A(3) = [5.0, 2.0, 7.0]To find the position of the smallest element, we can write:fortranminloc_index = minloc(A)In this case, `minloc_index` will be equal to 2, corresponding to the index of the element with value 2.0.3. Specifying the dimension:In Fortran, arrays can be multidimensional. To find the minimum value along a specific dimension, we need to specify the `dim` argument. For instance, consider a two-dimensional array `B`: fortranreal :: B(2, 3) = reshape([1.0, 4.0, 3.0, 2.0, 7.0, 5.0], [2, 3])If we want to find the position of the smallest element along the first dimension (rows), we can write:fortranminloc_index = minloc(B, dim=1)Here, `minloc_index` will be an array of size 2, containing the indices of the smallest elements for each row.4. Selective searching using the mask:The `mask` argument in `minloc` allows us to perform selective searching for the minimum value based on certain conditions. This can be useful when dealing with large arrays or complex data structures. Suppose we have an array `C` with both positive and negative values:fortranreal :: C(4) = [-1.0, 3.0, -2.0, 4.0]To find the position of the smallest positive element, we can define a mask based on a logical condition:fortranmask = C > 0.0minloc_index = minloc(C, mask=mask)In this case, `minloc_index` will be equal to 2, corresponding to the index of the positive element with the smallest value.5. Handling tie-breakers:In some cases, the array may contain multiple elements with the same minimum value. By default, `minloc` returns the first occurrence. However, we can specify the `back` optional argumentto change this behavior. For example, consider an array `D` with multiple occurrences of the smallest element:fortranreal :: D(5) = [2.0, 1.0, 3.0, 1.0, 4.0]To obtain the last occurrence of the smallest element, we can write:fortranminloc_index = minloc(D, back=.true.)Here, `minloc_index` will be equal to 4, corresponding to the index of the last occurrence of the smallest element.6. Handling arrays with zero elements:If the array passed to `minloc` contains zero elements, the function returns an array of zeros. To handle this, we can check the size of the result and take appropriate actions if necessary. For example:fortranif (size(minloc_index) == 0) then! Handle the case when the array is empty...else! Process the result...endifIn summary, the `minloc` function in Fortran is a powerful tool for finding the position of the smallest element in an array. By specifying the desired dimension and using the optional `mask` and `back` arguments, programmers can perform advanced searching and handle various scenarios. Understanding and utilizing `minloc` can greatly enhance the functionality and efficiency of Fortran programs.。
fortran 教程
fortran 教程Fortran是一种古老而强大的编程语言,最初在1957年开发。
它被广泛用于科学和工程计算,特别是对大型和复杂的计算任务。
Fortran之所以如此受欢迎,是因为它在数学计算领域表现出色。
它拥有丰富的数学函数和运算符,并且支持高精度计算。
此外,Fortran还具有强大的数组处理能力,可以轻松处理大规模数据。
Fortran的语法相对简单,易于学习和使用。
它使用英语类似的语法,语句以换行符结束。
Fortran中的语句通常以关键字开始,例如"PROGRAM","SUBROUTINE"和"DO"等。
Fortran具有自己的变量类型,包括整数(INTEGER)、实数(REAL)和字符(CHARACTER)等。
变量必须在使用之前先声明,并且可以指定其大小和精度。
Fortran还支持过程式编程,包括子程序和函数的定义。
子程序可以接受输入参数,并返回结果。
这种模块化的编程方法可以提高代码的可读性和可维护性。
Fortran程序通常由一个主程序(PROGRAM)和若干个子程序(SUBROUTINE)组成。
主程序是程序的入口点,而子程序则可以被主程序或其他子程序调用。
Fortran还提供了许多控制结构,包括条件语句(IF-THEN-ELSE)和循环语句(DO)等。
这些结构可以帮助程序在不同的情况下做出不同的决策和重复执行特定的代码块。
在写Fortran程序时,编码风格非常重要。
良好的编码风格可以使程序更易于阅读和理解,减少错误的发生。
在Fortran中,常用的编码风格包括正确缩进、适当的变量命名和注释的使用等。
总结起来,Fortran是一种强大而易于学习的编程语言,特别适用于数学计算和科学工程领域。
通过掌握Fortran的基本语法和编码风格,您将能够编写高效且可靠的程序。
Fortran编程必备参考
/share/detail/24946126Just as in Basic we use TAB and PRINT USING commands to more precisely control program output, in Fortran we can usewrite commands with format statements. While these can get complicated, the most commonly used options are pretty easy to use. A typical write statement iswrite (*,20) x, y, z .The "*" in the parentheses instructs Fortran to write to the screen, while "20" refers to the label ofthe format statement for thiswrite command. The x, y, and z are the variables to be printed.A format statement for this write command might be20 format (3f10.4) .Inside the parentheses, the "3" indicates that 3 entities will be printed, the "f" denotes that these willbe floating point real numbers (not exponential notation), the "10" stipulates that 10 places will be used for printing (counting the sign, decimal point, and the digits), and ".4" mandates 4 digits after the decimal point. Some printouts formatted this way are12345.6789 , -1234.5678 , 10002.3400 .The letter "f" in this context is a format code letter; here are some of the more commonly used format code letters, with their implications:f real number, floating point formate single precision real number, exponential notationd double precision real number, exponential notationi integera text string (character)x space/vertical space (line feed)t tab indicatorStrings (in quotes) may be placed in format statements, separated by commas. Here are examples of write statements with corresponding format statements; at the right of each is a description of the corresponding output:write (*,10) n, x, y10 format (i4,4x,f10.4,2x,f10.4)integer n printed using 4 places, then 4 spaces, then real numbers x and y printed with 2 spaces between, each using 10 places and 4 decimal placeswrite (*,20) area20 format ("The area is ",f8.5)string in quotes is printed, then the real number area is printed, using 8 places with 5 decimal placeswrite (*,30) "The area is ", area30 format (a,f8.5)same output as immediately abovewrite (*,40) x, y, z 40 format (3d20.14)3 double precision numbers x, y, z printed, each reserving 20 spaces, with 14 decimal placeswrite (*,50) student, score 50 format (a20,4x,i3)student, a text string up to 20 characters, is printed, then 4 spaces, then score, an integer using a maximum of 3 placeswrite (*,60) r, A60 format (t10,f4.2,/,t10,f6.2)tabs to column 10, prints real number r, goes to next line, tabs to column 10, prints real number AYou can use loops with format statements to print arrays; here are examples:do i = 1, 10 write (*,70) a(i) end do an array a of real numbers, indexed from 1 to 10, is printed; each entry occupies 5 places with70 format (f5.2) 2 decimal places, and is printedon a separate linewrite (*,80) (a(i), i = 1, 10)80 format (f5.2)same output as immediately abovewrite (*,90) (a(i), i = 1, 10) 90 format (10f5.2)same output as above, except that all entries are printed on the same linedo i = 1, 5write (*,7) (m(i,j), j = 1, 6) 7 format (6i3)end do prints a 5 x 6 two-dimensional array m of integers, with each integer entry m(i,j) occupying 3 places. Each row of the matrix appears on its own line.Following are examples of stored values, formatting specifications for printing the values, and resulting output. (The "^" symbol indicates a blank).Stored Value Format Specifier Output1.234567f8.2^^^^1.230.00001f5.30.000-12345i5*****-12345i6-1234512345i6^123450.00001234e10.3^0.123E-040.0001234e12.4^^0.1234E-031234567.89e9.2^0.12E+07aloha a8^^^aloha1.23456789123D0d17.10^0.1234567891E+01 Fortran format格式说明2. 字符返回。
Fortran常用函数
1、RANDOM_NUMBERSyntax ['sintæks] n. 语法CALL RANDOM_NUMBER (harvest结果)Intrinsic Subroutine(固有子程序):Returns a pseudorandom number greater than or equal to zero and less than one from the uniform distribution.返回大于或等于0且小于1,服从均匀分布的随机数2、RNNOA/ DRNNOA (Single/Double precision)Generate pseudorandom numbers from a standard normal distribution using an acceptance/rejection method.产生服从标准正态分布的随机数Usage(用法)CALL RNNOA (NR, R)Arguments(参数)NR— Number of random numbers to generate. (Input) 要产生随机数的个数R— Vector of length NR containing the random standard normal deviates. (Output)输出长度为NR,随机正态分布的向量Comments(注解)The routine RNSET can be used to initialize the seed of the random number generator. The routine RNOPT can be used to select the form of the generator.程序RNSET可以用来初始化随机数发生器的种子ExampleIn this example, RNNOA is used to generate five pseudorandom deviates from a standard normal distribution.INTEGER ISEED, NOUT, NRREAL R(5)EXTERNAL RNNOA, RNSET, UMACHCCALL UMACH (2, NOUT)NR = 5ISEED = 123457CALL RNSET (ISEED)CALL RNNOA (NR, R)WRITE (NOUT,99999) R99999 FORMAT (' Standard normal random deviates: ', 5F8.4)ENDOutputStandard normal random deviates: 2.0516 1.0833 0.0826 1.2777 -1.22603、RESHAPEIntrinsic Function(内部函数)Constructs an array of a specified shape from the elements of another array. 构造规定形式的数组Syntax(语法)result = RESHAPE (source, shape [ , pad][ , order])source(Input) Any type. Array whose elements will be taken in standard Fortran array order (see Remarks), and then placed into a new array.shape(Input) Integer. One-dimensional array that describes the shape of the output array created from elements of source. 描述输出数组的大小的一维数组,The elements of shape are the sizes of the dimensions of the reshaped array in order. If pad is omitted 省略, the total size specified by shape must be less than or equal to source.pad 可选参数(Optional; input) Same type as source. Must be an array. If there are not enough elements in source to fill the result array, elements of pad are added in standardFortran array order. If necessary, extra copies of pad are used to fill the array.order 可选参数(Optional; input) Integer. One-dimensional array. Must be the same length as shape.Permutes the order of dimensions in the result array. The value of order must be a permutation of (1, 2,...n) where n is the size of shape.Return Value(返回值)The result is an array the same data type and kind as source and a shape as defined in shape.ExamplesINTEGER AR1( 2, 5)REAL F(5,3,8)REAL C(8,3,5)AR1 = RESHAPE((/1,2,3,4,5,6/),(/2,5/),(/0,0/),(/2,1/))! returns 1 2 3 4 5! 6 0 0 0 0!! Change Fortran array order to C array orderC = RESHAPE(F, (/8,3,5/), ORDER = (/3, 2, 1/))END4、SUMIntrinsic Function(内部函数)Sums elements of an array or the elements along an optional dimension. The elements summed can be selected by an optional mask.将数组中的元素求和Syntax(语法)result = SUM (array [ , dim] [ , mask])array(Input) Integer, real, or complex. Array whose elements are to be summed.dim 可选参数(Optional; input) Integer. Dimension along which elements are summed.1 ≤dim≤n, where n is the number of dimensions in array.mask 可选参数(Optional; input) Logical. Must be same shape as array. If mask is specified, only elements in array that correspond to .TRUE. elements in mask are summed.Return Value(返回值)Same type and kind as array and equal to the sum of all elements in array or the sum of elements along dimension dim. If mask is specified, only elements that correspondto .TRUE. elements in mask are summed. Returns a scalar if dim is omitted or array is one-dimensional. Otherwise, returns an array one dimension smaller than array.ExamplesINTEGER array (2, 3), i, j(3)array = RESHAPE((/1, 2, 3, 4, 5, 6/), (/2, 3/))! array is 1 3 5! 2 4 6i = SUM((/ 1, 2, 3 /)) ! returns 6j = SUM(array, DIM = 1) ! returns [3 7 11]WRITE(*,*) i, jEND5、SEEDRun-Time Subroutine Changes the starting point of the pseudorandom number generator. 改变随机数发生器的起始点ModuleUSE MSFLIBSyntax(语法)CALL SEED (iseed)iseed(Input) INTEGER(4). Starting point for RANDOM.Remarks(注解)SEED uses iseed to establish the starting point of the pseudorandom number generator.A given seed always produces the same sequence of values from RANDOM.If SEED is not called before the first call to RANDOM, RANDOM always begins with a seed value of one. If a program must have a different pseudorandom sequence each time it runs, pass the constant RND$TIMESEED (defined in MSFLIB.F90) to the SEED routine before the first call to RANDOM.ExampleUSE MSFLIBREAL randCALL SEED(7531)CALL RANDOM(rand)6、RANDOMPurposeRun-Time Subroutine Returns a pseudorandom number greater than or equal to zero and less than one from the uniform distribution. 返回大于或等于0且小于1,服从均匀分布的随机数ModuleUSE MSFLIBSyntaxCALL RANDOM (ranval)ranval(Output) REAL(4). Pseudorandom number, 0 ≤ranval< 1, from the uniformdistribution.RemarksA given seed always produces the same sequence of values from RANDOM.If SEED is not called before the first call to RANDOM, RANDOM begins with a seed value of one. If a program must have a different pseudorandom sequence each time it runs, pass the constant RND$TIMESEED (defined in MSFLIB.F90) to SEED before the first call to RANDOM.All the random procedures (RANDOM, RAN, and RANDOM_NUMBER, and the PortLib functions DRAND, DRANDM, RAND, IRANDM, RAND, and RANDOM) use the same algorithms and thus return the same answers. They are all compatible and can be used interchangeably. (The algorithm used is a “Prime Modulus M Multiplicative Linear Congruential Generator,” a modified version of t he random number generator by Park and Miller in “Random Number Generators: Good Ones Are Hard to Find,” CACM, October 1988, Vol. 31, No. 10.)CompatibilityCONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIBExampleUSE MSFLIBREAL(4) ranCALL SEED(1995)CALL RANDOM(ran)7、FFT2BCompute the inverse Fourier transform of a complex periodic two-dimensional array.计算二维复数数组的逆傅里叶变换Usage(用法)CALL FFT2B (NRCOEF, NCCOEF, COEF, LDCOEF, A, LDA)Arguments(参数)NRCOEF— The number of rows of COEF. (Input) 数组COEF的行数NCCOEF— The number of columns of COEF. (Input) 数组COEF的列数COEF—NRCOEF by NCCOEF complex array containing the Fourier coefficients to be transformed. (Input) NRCOEF行NCCOEF列数组LDCOEF— Leading dimension of COEF exactly as specified in the dimension statement of the calling program. (Input)A—NRCOEF by NCCOEF complex array containing the Inverse Fourier coefficients of COEF. (Output) NRCOEF行NCCOEF列复数数组,包含数组COEF的逆傅里叶系数LDA— Leading dimension of A exactly as specified in the dimension statement of the calling program. (Input)Comments(注解)1.Automatic workspace usage isFFT2B4 * (NRCOEF + NCCOEF) + 32 + 2 *MAX(NRCOEF, NCCOEF) units, orDFFT2B8 * (NRCOEF + NCCOEF ) + 64 + 4 *MAX(NRCOEF, NCCOEF) units.Workspace may be explicitly provided, if desired, by use of F2T2B/DF2T2B. The reference isCALL F2T2B (NRCOEF, NCCOEF, A, LDA, COEF, LDCOEF,WFF1, WFF2, CWK, CPY)The additional arguments are as follows:WFF1— Real array of length 4 *NRCOEF + 15 initialized by FFTCI. The initialization depends on NRCOEF. (Input)WFF2— Real array of length 4 *NCCOEF + 15 initialized by FFTCI. The initialization depends on NCCOEF. (Input)CWK— Complex array of length 1. (Workspace)CPY— Real array of length 2 *MAX(NRCOEF, NCCOEF). (Workspace)2.The routine FFT2B is most efficient when NRCOEF and NCCOEF are the product of small primes.3.The arrays COEF and A may be the same.4.If FFT2D/FFT2B is used repeatedly, with the same values for NRCOEF and NCCOEF, then use FFTCI to fill WFF1(N = NRCOEF) and WFF2(N = NCCOEF). Follow this with repeated calls to F2T2D/F2T2B. This is more efficient than repeated calls toFFT2D/FFT2B.AlgorithmThe routine FFT2B computes the inverse discrete complex Fourier transform of a complex two-dimensional array of size (NRCOEF = N) ⨯ (NCCOEF = M). The method used is a variant of the Cooley-Tukey algorithm , which is most efficient when N and M are both products of small prime factors. If N and M satisfy this condition, then the computational effort is proportional to N M log N M. This considerable savings has historically led people to refer to this algorithm as the "fast Fourier transform" or FFT.Specifically, given an N⨯M array c = COEF, FFT2B returns in aFurthermore, a vector of Euclidean norm S is mapped into a vector of normFinally, note that an unnormalized inverse is implemented in FFT2D. The routine FFT2B is based on the complex FFT in FFTPACK. The package FFTPACK was developed by Paul Swarztrauber at the National Center for Atmospheric Research.ExampleIn this example, we first compute the Fourier transform of the 5 ⨯ 4 arrayfor 1 ≤n≤ 5 and 1 ≤m≤ 4 using the IMSL routine FFT2D. The resultis then inverted by a call to FFT2B. Note that the result is an array a satisfying a = (5)(4)x = 20x. In general, FFT2B is an unnormalized inverse with expansion factor N M.INTEGER LDA, LDCOEF, M, N, NCA, NRACOMPLEX CMPLX, X(5,4), A(5,4), COEF(5,4)CHARACTER TITLE1*26, TITLE2*26, TITLE3*26INTRINSIC CMPLXEXTERNAL FFT2B, FFT2D, WRCRNCTITLE1 = 'The input matrix is below 'TITLE2 = 'After FFT2D 'TITLE3 = 'After FFT2B 'NRA = 5NCA = 4LDA = 5LDCOEF = 5C Fill X with initial dataDO 20 N=1, NRADO 10 M=1, NCAX(N,M) = CMPLX(FLOAT(N+5*M-5),0.0)10 CONTINUE20 CONTINUECCALL WRCRN (TITLE1, NRA, NCA, X, LDA, 0)CCALL FFT2D (NRA, NCA, X, LDA, COEF, LDCOEF)CCALL WRCRN (TITLE2, NRA, NCA, COEF, LDCOEF, 0)CCALL FFT2B (NRA, NCA, COEF, LDCOEF, A, LDA)CCALL WRCRN (TITLE3, NRA, NCA, A, LDA, 0)CENDOutputThe input matrix is below1 2 3 41 ( 1.00, 0.00) ( 6.00, 0.00) ( 11.00, 0.00) ( 16.00, 0.00)2 ( 2.00, 0.00) ( 7.00, 0.00) ( 12.00, 0.00) ( 17.00, 0.00)3 ( 3.00, 0.00) ( 8.00, 0.00) ( 13.00, 0.00) ( 18.00, 0.00)4 ( 4.00, 0.00) ( 9.00, 0.00) ( 14.00, 0.00) ( 19.00, 0.00)5 ( 5.00, 0.00) ( 10.00, 0.00) ( 15.00, 0.00) ( 20.00, 0.00) After FFT2D1 2 3 41 ( 210.0, 0.0) ( -50.0, 50.0) ( -50.0, 0.0) ( -50.0, -50.0)2 ( -10.0, 13.8) ( 0.0, 0.0) ( 0.0, 0.0) ( 0.0, 0.0)3 ( -10.0, 3.2) ( 0.0, 0.0) ( 0.0, 0.0) ( 0.0, 0.0)4 ( -10.0, -3.2) ( 0.0, 0.0) ( 0.0, 0.0) ( 0.0, 0.0)5 ( -10.0, -13.8) ( 0.0, 0.0) ( 0.0, 0.0) ( 0.0, 0.0) After FFT2B1 2 3 41 ( 20.0, 0.0) ( 120.0, 0.0) ( 220.0, 0.0) ( 320.0, 0.0)2 ( 40.0, 0.0) ( 140.0, 0.0) ( 240.0, 0.0) ( 340.0, 0.0)3 ( 60.0, 0.0) ( 160.0, 0.0) ( 260.0, 0.0) ( 360.0, 0.0)4 ( 80.0, 0.0) ( 180.0, 0.0) ( 280.0, 0.0) ( 380.0, 0.0)5 ( 100.0, 0.0) ( 200.0, 0.0) ( 300.0, 0.0) ( 400.0, 0.0)8、TIMEFPurposePortLib Function Returns the number of seconds since the first time it is called, or zero.ModuleUSE PORTLIBSyntaxresult=TIMEF ( )Return ValueREAL(8). Number of seconds that have elapsed since the first time TIMEF( ) was called. The first time called, TIMEF returns 0.0D0.CompatibilityCONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIBExampleUSE PORTLIBINTEGER i, jREAL(8) elapsed_timeelapsed_time = TIMEF() DO i = 1, 100000j = j + 1END DOelapsed_time = TIMEF() PRINT *, elapsed_time END。
一些免费的Fortran编译器
一些免费的Fortran编译器Free Fortran Compilers取自This page lists free Fortran compilers for various operating systems. Some of the compilers are compliant with the ANSI Fortran 77 specifications, others with Fortran 95, and so on. Some of them may also come complete with debuggers, editors and an integrated development environment (IDE).If you need a book on Fortran, you may want to check out the selection of books available at .DisclaimerThe information provided on this page comes without any warranty whatsoever. Use it at your own risk. Just because a program, book or service is listed here or has a good review does not mean that I endorse or approve of the program or of any of its contents. All the other standard disclaimers also apply.Free Fortran Compilers and IDEsSun Studio Compilers and ToolsSun Studio Compilers and Tools for Linux and Solaris OS on Sparc and x86/x64 platforms includes command line tools as well as a NetBeans-based IDE for developing, compiling and debugging C, C++ and Fortran programs. It also includes performance analysis tools.Intel Fortran Compiler for LinuxThe Intel Fortran Compiler for Linux is free for personal, non-commercial use (registration required). It features an optimizing compiler, the Intel Debugger (GUI and command-line), mixed language support (C and Fortran), full compliance with the ISO Fortran 95 standard, support for the evolving Fortran 2003standard, multi-threaded application support (OpenMP and auto-parallelization), ability to handle big-endian data files, compatibility with various Linux tools (like make, gdb and Emacs), substantial compatibility with Compaq Visual Fortran, etc. The optimizing compiler supports interprocedural optimization, profile guided optimization, automatic vectorizer, etc.G95G95 is an open source Fortran 95 compiler. At the time this was written, most of the ISO Fortran 95 standard has been implemented. Platforms supported include Linux(x86, Intel IA64, AMD x86_64), Windows, Macintosh OS X, FreeBSD, Sparc Solaris and HP-UX.Gfortrangfortran is a Fortran 95 compiler. It runs on Linux and Windows (under cygwin).Salford FTN95 Fortran 95 CompilerSalford FTN95 is a Fortran 95 compiler that supports Fortran 77, Fortran 90 and Fortran 95. The compiler generates exectuables for Win32 (but Win32 console and GUI applications) and the Microsoft .NET framework. It comes with CHECKMATE, a tool that lets programmers check the correctness of their code at runtime. Also included is Plato 3 (an IDE), full source level debugging, documentation and examples. You may only generate code for your personal use on your home computer, and all executables will display a banner on execution.Salford FTN77 PE ANSI Fortran 77 CompilerThe Salford FTN77 PE (Personal Edition) comes with a full optimising ANSI Fortran 77 compiler with support for various common extensions (including MIL-STD-1753), linker, libraries, make utility, librarian and a full screen debugger. The compilerhas a built-in assembler for inline assembly, and the ability to link with code from other sources (such as C++ Fortran 90 and Fortran 95 code). It is free for personal use and for use by students. It supports Windows 95, 98 and NT.Open Source Watcom / OpenWatcom Fortran CompilerThe Watcom (now OpenWatcom) Fortran 77 compiler is now available free of charge, complete with source code. This compiler, which generates code for Win32, Windows 3.1 (Win16), OS/2, Netware, MSDOS (16 and 32 bit), etc, was a well-known compiler some years back (until Sybase terminated it).MinGW'S G77 (GNU Fortran)This system comes with the GNU G77 Fortran compiler (among other things, including a C/C++ compiler), which you can use to generate Win32 executables from F77 code. Like many systems based on the GNU tools, Mingw32 comes with complete with various programming tools, such as a program maintainence program (ie, make), text processing tools (sed, grep), lexical analyser generator (flex), parser generator (bison), etc.DJGPP GNU G77 (Fortran 77) for MSDOSThis is a development system based on the well-known GNU compiler system that includes compilers for Fortran 77, C, C++, Objective C, etc. It generates 32 bit MSDOS executables that is Windows 95 long-filename-aware. It is a very complete system with IDEs, graphics libraries, lexical analyser generators (flex), parser generators (bison), text processing utilities (like grep, sed), a program maintainence utility (ie, make), a dos extender, and so on. The compiler, utilities and libraries come with source code.f2j - Fortran to Java Compilerf2j translates Fortran 77 source code to Java class files. It isdistributed under the GNU GPL and runs on Linux, SunOS/Solaris.F2C - Fortran to C TranslatorThis is a well-known Fortran to C converter that comes with source code. The site also includes pre-compiled binaries (executables) for MSDOS and Microsoft Windows, although these are by no means the only systems supported - the compiler works on Unix systems like BSD, Linux, etc. You have to compile the compiler yourself on those systems. Libraries containing the runtime support needed (together with the C source code) are also included. You need a C compiler to generate binaries from your Fortran sources.FORCE Project - Fortran Compiler and EditorFORCE is actually just an IDE for Fortran 77 that integrates the GNU Fortran 77 compiler (G77).Emx/Rsx G77 (GNU Fortran)This is another GNU Fortran port. The RSX port compiles DOS extended console applications for Win32 and the EMX port generates MSDOS extended applications as well as OS/2 applications. The compiler supports the Fortran 77 syntax.Lcc-Win32 Fortran CompilerLCC-Win32 is primarily a free C compiler and its programming environment for Win32, but it also appears to have a Fortran compiler available for download from their website. It apparently compiles Fortran 77 code (with some common extensions) to C which is subsequently compiled by the C compiler to generate a Win32 native executable. The entire process is integrated seamlessly into the IDE so you might not even realise that intemediate C files were being generated (they are deleted automatically when they are no longer needed). The IDE supports syntax highlighting in C and Fortran.Compaq Fortran for Linux AlphaThis Fortran compiler is for Linux Alpha systems only. It implements the full Fortran-95 language as well as a few language extensions. It comes with a debugger (ladebug), an extended maths library (the Compaq Extended Math Library, CXML) containing technical and scientific subroutines. The licence for the free version allows it to be used for personal and educational purposes, and prohibits its use in any commercial venture.。
fortran马格纳斯公式
fortran马格纳斯公式Fortran中的马格纳斯公式是用于计算矩阵指数函数的一种方法。
它的公式如下:exp(A) = I + A + (1/2!)A^2 + (1/3!)A^3 + ... + (1/n!)A^n + ...其中,A是一个n×n的矩阵,I是n×n的单位矩阵,n!表示n的阶乘。
在Fortran中,可以使用以下代码实现马格纳斯公式:program matrix_expimplicit noneinteger, parameter :: n = 3real :: A(n,n), expA(n,n)integer :: i, j, k, mreal :: factorial, termA = reshape([1,2,3,4,5,6,7,8,9], [n,n])expA = 0.0do i = 0, n-1factorial = 1.0do j = 1, ifactorial = factorial * jend doterm = 1.0 / factorialdo j = 0, iterm = term * AexpA = expA + termend doend dowrite(*,*) "A = "do i = 1, nwrite(*,*) (A(i,j), j=1,n)end dowrite(*,*) "exp(A) = "do i = 1, nwrite(*,*) (expA(i,j), j=1,n)end doend program matrix_exp在这个例子中,我们计算了一个3×3的矩阵A的指数函数。
我们使用了一个嵌套的循环来计算每个项,并将它们相加以得到最终的结果。
最后,我们输出了原始矩阵A和计算出的指数函数exp(A)。
fortran与c语言接口参数传递混合编程
Sun Studio 12:Fortran 编程指南•Previous: 第10 章并行化第11 章C-Fortran 接口本章论述Fortran 与C 的互操作性方面的问题,内容仅适用于Sun Studio Fortran 95 和C 编译器的特定情况。
11.9 Fortran 2003 与C 的互操作性简要说明了Fortran 2003 标准第15 部分中提到的C 绑定功能。
(此标准可以从国际Fortran 标准Web 站点获得)。
Fortran 95 编译器实现了标准中所述的这些功能。
如不特别注明,32 位x86 处理器视为与32 位SPARC 处理器等同。
对于64 位x86 处理器和64 位SPARC 处理器也是如此,只是x86 系统未定义REAL*16 和COMPLEX*32 数据类型,这些数据类型只能用于SPARC。
11.1 兼容性问题大多数 C-Fortran 接口必须在以下这些方面全部保持一致:•函数和子例程的定义及调用•数据类型的兼容性•参数传递(按引用或按值)•参数的顺序•过程名(大写、小写或带有结尾下划线(_))•向链接程序传递正确的库引用某些C-Fortran 接口还必须符合:•数组索引及顺序•文件描述符和stdio•文件权限11.1.1 函数还是子例程?函数一词在 C 和Fortran 中有不同的含义。
根据具体情况做出选择很重要:•在C 中,所有的子程序都是函数;但void函数不会返回值。
•在Fortran 中,函数会传递一个返回值,但子例程一般不传递返回值。
当Fortran 例程调用C 函数时:•如果被调用的C 函数返回一个值,则将其作为函数从Fortran 中调用。
•如果被调用的C 函数不返回值,则将其作为子例程调用。
当C 函数调用Fortran 子程序时:•如果被调用的Fortran 子程序是一个函数,则将其作为一个返回兼容数据类型的函数从 C 中调用。
•如果被调用的Fortran 子程序是一个子例程,则将其作为一个返回int(与Fortran INTEGER*4兼容)或void值的函数从C 中调用。
micaps数据格式转换
2·2 数据格式转换原始数据获取后,还须转换成MICAPS的数据格式,并放入指定的目录中,才能由MICAPS 系统正常使用。
MICAPS定义了19类文件格式(见用户手册附录)。
MICAPS系统的数据接口程序能够自动将原始数据转换成MICAPS格式,并放入本地数据库中(MICAPS系统安装后,各数据目录已经自动建立)。
这些程序将在“定时程序:mtimer.exe和数据传输程序:transdat.exe”的控制下定时地自动运行。
MICAPS系统安装后,在datatran子目录中可以找到所有格式转换程序,下面各节将描述这些格式转换程序。
2·2·1 常规数据转换程序常规报数据在服务器的 /dmsg 子目录中。
这些数据被接收到后,一般来说,应该放在本地的datatran子目录中。
常规数据的预处理和格式转换是由一组程序完成的,其流程如下:常规数据处理时,首先把所有的报文文件拷贝到一个单一的文件fn.dat中,以减少打开文件的次数。
同时由makewsdat.exe程序根据机器时钟产生日期文件wsdat.dat,所有的常规数据处理程序都将根据此文件中的日期确定自己要处理的数据的日期和时次(因此通过设置wsdat.dat中的日期,常规数据处理程序也可以处理历史数据)。
然后运行ptrans0.exe程序对报文进行译码,产生中间文件aaxx1.dat和ttaa1.dat。
然后运行ptransax.exe或ptranstp.exe产生综合填图和单要素填图数据,运行ptransbx.exe和ptransbb.exe程序处理船舶报并加入到填图数据中,运行ptranscs.exe产生城市预报数据,同时产生中间文件dm????.dat和gg????.dat。
然后运行pwdemi.exe或pwgako.exe程序产生等值线和流线数据。
最后运行ptransty.exe和ptransto.exe程序产生台风路径数据。
FORTRAN内部函数库
FORTRAN内部函数用FORTRAN解题往往要用到一些专门运算,如求三角函数sinx, cosx,对数lnx,指数ex,求一组数中最大数和最小数等。
FORTRAN提供了一些系统函数(称为内部函数)来完成这些运算。
程序设计者不必自己设计进行这些运算的语句组(即程序段或子程序),只需写出一个函数的名字以及给出一个或若干个自变量,就可以得到所需的值,例如:SQRT(4.0)求出4.0的平方根,SIN(2.0)求出2(弧度)的正弦值,EXP(3.5)求出e3.5,LOG(3.0)求出3,常用的函数如下表,FORTRAN77提供的全部函数明细见FORTRAN77内部函数。
函数名含义应用例子相当于数学上的运算ABS 求绝对值ABS(A) |a|EXP 指数运算EXP(A) e^aSIN 正弦值SIN(X) sin xCOS 余弦值COS(X) cos xASIN 反正弦ASIN(X) sin^(-1)aACOS 反余弦ACOS(X) cos-1aTAN 正切TAN(X) tan xATAN 反正切ATAN(A) tan^(-1)aLOG 自然对数LOG(A) lna,或loge(a)LOG10 常用对数LOG10(A) log10aINT 取整INT(A) int(a),取a的整数部分MOD 求余MOD(A1,A2) a - int(a1/a2)*a2SIGN 求符号SIGN(A1,A2) |a1|(若a2>0) -|a1|(若a2<0)REAL 转换为实型REAL(I)MAX 求最大值MAX(A1,A2,A3) max(a1,a2,a3)MIN 求最小值 MIN(A1,A2,A3) min(a1,a2,a3)说明:(1)FORTRAN77将这些系统函数分别编成一个个子程序,组成函数库,存贮于外部介质(如磁盘)上。
在完成源程序的编译之后,用LINK命令实现连接,即将已翻译成二进制指令的目标程序与函数库连接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
! read 20090416/high/height;temper;t-td;uv! lon 32~160 interval: 4 degree! lat 12~80 interval: 4 degree! time 1~12: 2009.04.16.20:00~04.22.08:00 interval: 12 hours! U,v,height,t: 1000,925,850,700,500,400,300,250,200,150,100 hpa! BeiJing Time!: 2010.11.27,REAL,PARAMETER :: Omega=7.292e-5,R=6371e+3,PI=3.1415926,Delta=4,DeltaT=12,epsilonPhi=1.e3,epsilonPsi=1.e3INTEGER,PARAMETER :: nx=33,ny=18,nz=11,nt=12REAL F,EE,AA,BB,signINTEGER WtTopLevel(NX,NY,NT),Pn,Qn,Ltotal,LnumREAl P(NZ),deltP(10),lat(ny),lon(nx),sigmadeltD,dx,dy,epsilon,aaa,bbbCHARACTER timefile(12)*12 ,levelfile(11)*4real,allocatable :: temper(:,:,:,:),q(:,:,:,:),u(:,:,:,:), &v(:,:,:,:),height(:,:,:,:),w(:,:,:,:), &qu(:,:,:,:),qv(:,:,:,:),adq(:,:,:,:), &adqv(:,:,:,:),theta(:,:,:,:),Wt(:,:,:,:), &vorg(:,:,:,:),voro(:,:,:,:),div(:,:,:,:), &deltD(:,:,:),ttd(:,:,:,:),thetaP(:,:,:,:), &phi(:,:,:,:),residual(:,:,:,:), &psi(:,:,:,:),advoro(:,:,:,:),advorg(:,:,:,:)allocate (temper(NX,NY,NZ,NT),q(NX,NY,nz,NT),u(NX,NY,NZ,NT), &v(NX,NY,NZ,NT),height(NX,NY,NZ,NT),w(NX,NY,NZ,NT), &qu(NX,NY,NZ,NT),qv(NX,NY,NZ,NT),adq(NX,NY,NZ,NT), &adqv(NX,NY,NZ,NT),theta(NX,NY,NZ,NT),Wt(NX,NY,NZ,NT), &vorg(NX,NY,NZ,NT),voro(NX,NY,NZ,NT),div(NX,NY,NZ,NT), &deltD(NX,NY,NT),ttd(NX,NY,NZ,NT),thetaP(NX,NY,NZ,NT), &phi(NX,NY,NZ,NT),residual(NX,NY,NZ,NT), &psi(NX,NY,NZ,NT),advoro(NX,NY,NZ,NT),advorg(NX,NY,NZ,NT))!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DATA P /1000,925,850,700,500,400,300,250,200,150,100/DATA deltP/75, 75, 50, 200,100,100,50, 50, 50, 50/DATAtimefile/'09041620.000','09041708.000','09041720.000','09041808.000','09041820.000','090419 08.000', &'09041920.000','09042008.000','09042020.000','09042108.000','09042120.000','09042208.000'/ DATA levelfile/'1000','925','850','700','500','400','300','250','200','150','100'/do i=1,nxlon(i)=32+(i-1)*Deltalon(i)=lon(i)*pi/180.enddodo i=1,nylat(i)=12+(i-1)*Deltalat(i)=lat(i)*pi/180.enddo!--------------read temperature----------------DO IZ=1,NZ ! levelDO IT=1,NT ! timeOPEN(11,file='c:\micaps\temper\'//trim(levelfile(iz))//'\'//timefile(it))do i=1,4read(11,*)enddodo ij=NY,1,-1read(11,*)(temper(ii,ij,iz,it),ii=1,NX) ! CenddoCLOSE(11)ENDDOENDDO!--------------read u,v -------------------------DO IZ=1,NZ ! levelDO IT=1,NT ! timeOPEN(11,file='c:\micaps\uv\'//trim(levelfile(iz))//'\'//timefile(it))do i=1,3read(11,*)enddodo ij=NY,1,-1read(11,*)(u(ii,ij,iz,it),ii=1,NX) ! m/senddodo ij=NY,1,-1read(11,*)(v(ii,ij,iz,it),ii=1,NX) ! m/senddoCLOSE(11)ENDDOENDDO!--------------read t-td -------------------------DO IZ=1,NZ ! levelDO IT=1,NT ! timeOPEN(11,file='c:\micaps\t-td/'//trim(levelfile(iz))//'\'//timefile(it))do i=1,4read(11,*)enddodo ij=NY,1,-1read(11,*)(ttd(ii,ij,iz,it),ii=1,NX) ! CenddoCLOSE(11)ENDDOENDDO!--------------read height -------------------------DO IZ=1,NZ ! levelDO IT=1,NT ! timeOPEN(11,file='c:\micaps\height\'//trim(levelfile(iz))//'\'//timefile(it))do i=1,4read(11,*)enddodo ij=NY,1,-1read(11,*)(height(ii,ij,iz,it),ii=1,NX) ! 10 menddoCLOSE(11)ENDDOENDDOheight=height*10.!@@@@@@@@@@@@@@@@@@@@ read end @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@!======== t,td => specific humidity:DO IT=1,NTDO IZ=1,NZdo ix=1,NXdo iy=1,NYif(temper(ix,iy,iz,it).ge.-15)thenAA=17.2693882BB=35.86elseif(temper(ix,iy,iz,it).le.-40)thenAA=21.8745584BB=7.66else !!!! ?????????????????????????????????????AA=21.8745584+(17.2693882-21.8745584)/(-15-(-40.))*(temper(ix,iy,iz,it)-(-40))BB=7.66+(35.86-7.66)/(-15-(-40.))*(temper(ix,iy,iz,it)-(-40))endifEE=6.1078*exp( AA*(temper(ix,iy,iz,it)-ttd(ix,iy,iz,it))/(273.16+(temper(ix,iy,iz,it) & -ttd(ix,iy,iz,it))-BB) )q(ix,iy,iz,it)=622.*EE/(P(iz)-0.378*EE)enddoenddoENDDOENDDO!=====t => T:temper=temper+273.16!######################## geostrophic wind vorticity ########################### print*,'geostrophic wind vorticity'vorg=1.e+36DO it=1,NTDO iz=1,NZdo i=1+1,NX-1do j=1+1,NY-1F=Omega*2*sin(lat(j))vorg(i,j,iz,it)=9.8/(F*R**2)*( (height(i+1,j,iz,it)+height(i-1,j,iz,it)- &2*height(i,j,iz,it))/(Delta*pi/180*cos(lat(j)))**2 + &(height(i,j+1,iz,it)+height(i,j-1,iz,it)- &2*height(i,j,iz,it))/(Delta*pi/180)**2 - &(height(i,j+1,iz,it)-height(i,j-1,iz,it))/(Delta*pi/180*2)*tan(lat(j)) )enddoenddoENDDOENDDO!######################## vorticity of observed wind ######################## print*,'vorticity of observed wind'voro=1.e+36DO it=1,NTDO iz=1,NZdo i=1+1,NX-1do j=1+1,NY-1voro(i,j,iz,it)=1/(R*2)*( (v(i+1,j,iz,it)-v(i-1,j,iz,it))/(Delta*pi/180*cos(lat(j))) - &(u(i,j+1,iz,it)-u(i,j-1,iz,it))/(Delta*pi/180) + &2*u(i,j,iz,it)*tan(lat(j)) )enddoenddoENDDOENDDO!######################## advection of vorticity ########################print*,'vorticity of observed wind'advoro=1.e+36advorg=1.e+36DO it=1,NTDO iz=1,NZdo i=2+1,NX-2do j=2+1,NY-2advoro(i,j,iz,it)=-u(i,j,iz,it)*(voro(i+1,j,iz,it)-voro(i-1,j,iz,it))/(2*R*Delta*pi/180.*cos(lat(j))) - &v(i,j,iz,it)*(voro(i,j+1,iz,it)-voro(i,j-1,iz,it))/(2*R*Delta*pi/180.)advorg(i,j,iz,it)=-u(i,j,iz,it)*(vorg(i+1,j,iz,it)-vorg(i-1,j,iz,it))/(2*R*Delta*pi/180.*cos(lat(j))) - &v(i,j,iz,it)*(vorg(i,j+1,iz,it)-vorg(i,j-1,iz,it))/(2*R*Delta*pi/180.) enddoenddoENDDOENDDO!######################## divergence ########################### print*,'divergence'div=1.e+36DO it=1,NTDO iz=1,NZdo i=1+1,NX-1do j=1+1,NY-1div(i,j,iz,it)=1./(2*R)*( (u(i+1,j,iz,it)-u(i-1,j,iz,it))/(Delta*pi/180*cos(lat(j))) + &(v(i,j+1,iz,it)-v(i,j-1,iz,it))/(Delta*pi/180) - &2*v(i,j,iz,it)*tan(lat(j)) )enddoenddoENDDOENDDO!######################## vertical velocity ########################### print*,'vertical velocity 'w=1.e+36DO it=1,NTDO iz=2,NZdo i=1+2,NX-2do j=1+2,NY-2w(i,j,1,it)=0.w(i,j,iz,it)=w(i,j,iz-1,it)+0.5*(div(i,j,iz,it)+div(i,j,iz-1,it))*(p(iz-1)-p(iz))enddoenddoENDDOENDDO!-------- correct w --------------!- - - - - thermaldynamic method for w at the top level - - - - - - -!- - - - - 100,150hpa: reference to 100,150,200 hpatheta=1.e+36wt=1.e+36DO IT=1,NTDO IZ=1,NZdo i=1,NXdo j=1,NYtheta(i,j,iz,it)=temper(i,j,iz,it)*(1000/p(iz))**0.286enddoenddoENDDOENDDOiz=NZ ! 100hpaDO it=1,nt-1do i=1+1,NX-1sign=0.thetaP(i,j,iz,it)=1.e+36IF(theta(i,j,iz-1,it)-theta(i,j,iz,it).ne.0)THENsign=1thetaP(i,j,iz,it)=(theta(i,j,iz-1,it)-theta(i,j,iz,it))/deltP(iz-1) ! 100hpa: forward interpolationELSEiz=NZ-1 ! 150 hpaif(theta(i,j,iz-1,it)-theta(i,j,iz+1,it).ne.0)thensign=1thetaP(i,j,iz,it)=(theta(i,j,iz-1,it)-theta(i,j,iz+1,it))/(deltP(iz-1)+deltP(iz)) ! 150hpa: central difference interpolationelseif(theta(i,j,iz,it)-theta(i,j,iz+1,it).ne.0)thensign=1thetaP(i,j,iz,it)=(theta(i,j,iz,it)-theta(i,j,iz+1,it))/deltP(iz) ! 150hpa: backward interpolationendifENDIF! if(thetaP(i,j,iz,it).ne.1.e+36)thetaP(i,j,iz,it)=thetaP(i,j,iz,it) ! hpa=>pa: it's unnecessaryWt(i,j,iz,it)=( (theta(i,j,iz,it+1)-theta(i,j,iz,it))/(DeltaT*60*60)+ &u(i,j,iz,it)*(theta(i+1,j,iz,it)-theta(i-1,j,iz,it))/(2*R*cos(lat(j))*Delta*pi/180.)+ &v(i,j,iz,it)*(theta(i,j+1,iz,it)-theta(i,j-1,iz,it))/(2*R*Delta*pi/180.) ) &/(-1.*thetaP(i,j,iz,it))if(sign.eq.0)Wt(i,j,iz,it)=1.e+36WtTopLevel(i,j,it)=iz ! the Top level of WtenddoenddoENDDO!- - - - -do i=1+2,NX-2do j=1+2,NY-2!!!!!!!!!!!!!!: first revised scheme!sigmadeltP=0.!do iz=1,WtTopLevel(i,j,it)-1!sigmadeltP=sigmadeltP+deltP(iz)!enddo! IF(Wt(i,j,WtTopLevel(i,j,it),it).ne.1.e+36)THEN! deltD(i,j,it)=(w(i,j,WtTopLevel(i,j,it),it)-Wt(i,j,WtTopLevel(i,j,it),it))/sigmadeltP ! do iz=1+1,WtTopLevel(i,j,it)! w(i,j,iz,it)=w(i,j,iz,it)-(P(1)-P(iz))*deltD(i,j,it)! div(i,j,iz,it)=div(i,j,iz,it)-deltD(i,j,it)! enddo! ELSE! w(i,j,:,it)=1.e+36! ENDIF!!!!!!!!!!!!!!: second revised schemesigmadeltP=0.do iz=1,INT((1000.-P(WtTopLevel(i,j,it)))/10)sigmadeltP=sigmadeltP+izenddoIF(Wt(i,j,WtTopLevel(i,j,it),it).ne.1.e+36)THENdeltD(i,j,it)=(w(i,j,WtTopLevel(i,j,it),it)-Wt(i,j,WtTopLevel(i,j,it),it))/sigmadeltPdo iz=1+1,WtTopLevel(i,j,it)w(i,j,iz,it)=w(i,j,iz,it)-((1000-P(iz))/10)*((1000-P(iz))/10+1)/2.0*deltD(i,j,it) div(i,j,iz,it)=div(i,j,iz,it)-((1000-P(iz))/10)/10*deltD(i,j,it)enddoELSEw(i,j,:,it)=1.e+36ENDIFenddoenddoENDDO!############### vapor flux & vapor flux divergence ##################print*,'vapor flux & vapor flux divergence'w(:,:,:,nt)=1.e+36w(1,:,:,:) =1.e+36w(:,1,:,:) =1.e+36w(nx,:,:,:)=1.e+36w(:,ny,:,:)=1.e+36adq =1.e+36adqv=1.e+36qu=1.e+36qv=1.e+36DO IT=1,ntDO IZ=1,nzDO i=1+1,NX-1DO j=1+1,NY-1qv(i,j,iz,it)=q(i,j,iz,it)*v(i,j,iz,it)/9.8qu(i,j,iz,it)=q(i,j,iz,it)*u(i,j,iz,it)/9.8adq(i,j,iz,it)=u(i,j,iz,it)*((q(i+1,j,iz,it)-q(i-1,j,iz,it))/(2*R*cos(lat(j))*Delta*pi/180)) + &v(i,j,iz,it)*((q(i,j+1,iz,it)-q(i,j-1,iz,it))/(2*R*Delta*pi/180)) adqv(i,j,iz,it)=(q(i,j,iz,it)*div(i,j,iz,it)+adq(i,j,iz,it))*1e5/9.8ENDDOENDDOENDDOENDDO!################## stream function #################!################## velocity potential #################!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OPEN(8,FILE='c:\dignostic\shixi\out-micaps.grd',form='binary')do it=1,ntWRITE(8) (((u(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((v(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((q(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((temper(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((height(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((voro(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((vorg(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((div(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((advoro(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((advorg(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((adqv(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((qu(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((qv(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((adq(i,j,iz,it)*1e5/9.8,i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((q(i,j,iz,it)*div(i,j,iz,it)*1e5/9.8,i=1,nx),j=1,ny),iz=1,nz)WRITE(8) (((w(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)! WRITE(8) (((psi(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)! WRITE(8) (((phi(i,j,iz,it),i=1,nx),j=1,ny),iz=1,nz)enddoCLOSE(8)!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@deallocate (temper,q,u,v,height,w,qu,qv,adq,adqv,theta,Wt, &vorg,voro,div,deltD,ttd,thetaP,phi,residual,psi,advoro,advorg)END。