2023-10-21 shell脚本计时方法 shell脚本计时方法 本文收集几种对shell脚本计时的方法。测试脚本如下:#!/bin/bash # timing_case.sh echo "start now" sleep 10 echo "end now"方法1:time命令如果是对整个shell脚本计时,使用time命令即可。$ time ./timing_case.sh start now end now real 0m10.014s user 0m0.007s sys 0m0.000s其中real时间就是我们关心的脚本运行时间。方法2:date命令如果需要知道shell脚本中某一段运行时间,可以使用date命令。可以在shell代码段前后加上date +%s,然后相减就得到运行时间,如下所示#!/bin/bash start_time=`date +%s` echo "start now" sleep 10 echo "end now" end_time=`date +%s` runtime=$((end_time-start_ti... 2023年10月21日 615 阅读 0 评论
2023-10-21 NetCDF文件压缩功能 NetCDF文件压缩功能 无损压缩zlibnetCDF4格式支持无损压缩算法DEFLATE压缩文件节省文件存储空间。DEFLATE算法使用Lempel-Ziv编码和Huffman编码组合。无损压缩是相对于有损压缩说的,指压缩完的数据能够完全还原恢复。netCDF4/HDF5使用zlib库提供的压缩算法,这也是netcdf4安装需要zlib库原因。gzip压缩工具也是用的zlib压缩算法。压缩等级(即deflation level)从无压缩等级0到最大压缩等级9,数值越大,压缩率越高,但所需压缩时间也会越长。按照NCO文档说法,从最低等级(dfl_lvl=1)到最高等级(dfl_lvl=9),文件大小差异一般小于10%。对于一般的气候数据集deflation算法能够压缩30-60%。常用的两个nc4压缩命令:nccopy (netcdf4库自带命令)$ nccopy -4 -d N in.nc out.nc # N-压缩等级,0-9ncks (来自NCO工具包)$ ncks -4 -L N in.nc out.nc # N-压缩等级,0-9数据测试试验准备以一个模式初始场数据为例,原始数据格式是net... 2023年10月21日 329 阅读 0 评论
2023-10-21 MPI IO错误处理 MPI IO错误处理 本周遇到一个MPI IO的问题让我对MPI标准在遇到错误时如何处理有了更深入的了解,在此记录一下。问题问题是这样的:有一个MPI并行程序,IO部分是通过MPI IO函数并行读入(MPI_FILE_OPEN())一个文件,但程序执行时在没有找到该文件情况下仍然继续执行。由于我没对MPI_FILE_OPEN函数返回码进行检查,程序正常运行,但读入数组实际上值是0,根本不是期望的值。出问题后还不容易查找。这与我对文件IO出错处理理解不一样,比如对于Fortran open语句默认找不到文件程序会报错终止。原因通过查阅MPI标准说明,发现MPI标准规定了MPI库运行时一旦侦测到错误时会终止程序运行,但文件操作例外。MPI IO 产生错误不会像通信错误一样被认为是致命的(MPI_ERRORS_ARE_FATAL),仅仅是捕捉这些错误(函数返回码)并继续执行程序。MPI标准预定义了两个错误handlers:MPI_ERRORS_ARE_FATAL 致命错误,一旦侦测到,调用MPI_ABORT退出MPI_ERRORS_RETURN 仅仅返回错误码给用户,其它没有影响MPI IO文件处理的缺... 2023年10月21日 272 阅读 0 评论
2023-10-21 Fortran字符串处理下篇 Fortran字符串处理下篇 字符与数值类型转换通过ASCII表转换常用的字符与整数一一映射的编码表是ASCII表,规定了256个字符与0-255整数一一对应关系。下表是Fortran用于两者互相转换的内置函数,其中ACHAR与CHAR、IACHAR与ICHAR区别在于一个指定使用ASCII表,另一个是处理器使用的编码表,不一定是ASCII表。但通常两者是等价的。内置过程名功能ACHAR(I)返回整数对应的ASCII码表中字符CHAR(I,[,KIND])返回给定整数对应的处理器使用的编码序列字符IACHAR(C)返回ASCII表中字符对应的十进制整数ICHAR(C)返回处理器使用的编码表中字符对应的整数ASCII码表中字符A-Z、a-b、0-9都是有序、连续排列的,利用这个特点我们可以对字符串进行大小比较、大小写转换等操作。下面示例程序实现了一个转换大写字符串的功能。module string_utils implicit none contains function to_upper(str) implicit none character(len=*),intent(in) :... 2023年10月21日 255 阅读 0 评论
2023-10-21 Fortran字符串处理上篇 Fortran字符串处理上篇 Fortran中使用character声明单个字符或多个字符组成的字符(串)变量。Fortran标准也提供了一些内置函数用于字符串处理,但总体来说Fortran字符串处理能力和C语言一样都不是很强。说明:可以将character声明的变量理解成字符串变量。字符串变量声明与赋值声明!字符常量 character(len=5),parameter :: constr = 'Hello' character :: ch !单个字符变量 character(len=10) :: str !长度为10的字符(串)变量 character*10 :: str1 !使用*length 方式声明 character*10 :: str_arr(10) !长度为10的字符数组变量,数组有10个元素推荐使用character(len=length)声明字符串变字符串。赋值str = 'nice to' str1 = ' meet you' str_arr(1) = str !字符串变量之间赋值将一个字符串变量值赋给另一个字符串变量,不要求两个字符串变量长度相同,如果短字符串赋给长字符串... 2023年10月21日 273 阅读 0 评论
2023-10-21 Fortran Interface更多功能 Fortran Interface更多功能 过程重载过程重载类似C++中的函数重载功能,使用相同的过程名称,但根据接口匹配情况编译器调用不同的过程。编译器会根据实际调用过程的参数、返回值特征在接口块中匹配某个过程,如果匹配不上编译器会报错。过程重载定义要求接口块中多个过程的接口要有区别,不能有歧义,否则编译器不能确定使用哪个过程。一般会将多个功能相同、但传递参数区别的过程写在一个接口块中,实现过程重载功能。Fortran内置函数重度使用该功能,比如三角函数sin(x)可以对单精度、双精度、复数的参数x求sin,对应的函数是sin(x)、dsin(x)、csin(x)等。过程重载常用于函数库的编写,提供统一过程名称供用户使用。比如我们读写NetCDF数据时经常要根据处理变量的类型(整型、单双精度实型)、不同维数数组传递不同的参数给NetCDF提供的库函数。我们可以利用过程重载功能将这些细节进行封装,根据传递参数的不同编写多个处理过程,然后封装成一个接口过程供用户使用,用户不用处理这些繁琐的细节。以下是两个外部过程iadd,radd通过过程重载功能供主程序调用,我们既可以使用add这个接口名称,也可以直接使用特定的过程,比如对... 2023年10月21日 281 阅读 0 评论
2023-10-21 Fortran过程接口 Fortran过程接口 前言为了避免英文术语翻译成中文带来的歧义,首先解释下本文涉及的Fortran术语。procedure过程,简单理解就是指Fortran的函数(function)和子例程(subroutine)function函数,与C函数相同,在表达式中被调用评估(evalute)返回函数值subroutine子例程,CALL语句调用,没有返回值,类似C语言中返回类型是void的函数procedure interface过程接口,类似C语言中函数声明dummy argument哑元,也可以称为虚参,过程定义时参数actual argument实参,过程调用时传入的参数过程接口含义及分类每个过程都有一个接口说明:包括过程名称和特征,每个哑元的名称、特征及可能存在的过程被引用的通用generic标识符。上述过程特征包括:函数还是子例程如果是函数,返回值特征哑元特征是否是pure/impure/elemental是否有BIND属性哑元特征包括(也就是类型、属性登):类型和类型参数(有的话)shape/intent是否是optional是否是allocatable是否是pointer或target是否p... 2023年10月21日 280 阅读 0 评论
2023-10-21 Fortran现代化 Fortran现代化 前言Fortran作为一门非常古老的高级语言(1957年由IBM公司Backus等人设计实现),至今仍是科学工程计算领域主要编程语言之一。但由于Fortran没有跟上互联网时代现代软件开发实践,Fortran受欢迎程度在降低,使用场景逐渐被C++、Python等语言取代。大学里开设Fortran编程课程的也不多,导致Fortran生力军缺乏。下图是编程语言排行榜TIOBE Index统计的Fortran语言二十多年来的热门程度。最好的排名是在2002年排到了第10名;最低位置在2020年,第50名;目前最新排名是26名。Fortran优点Fortran语言以下设计理念及特点仍使其作为追求高性能数值计算的首选语言。目前气象数值模式领域依然将其作为主要编程语言。简单易学 正如Fortran名字由来“公式翻译器”,Fortran面向数值计算领域科学计算,语法简单易学,能够让科学家快速写出高性能的代码。Fortran强类型声明、指针的限制使用(虽然指针是C语言的最大特色)使程序不容易出错。高性能 Fortran与C/C++性能处于同一级别。作为静态强类型的编译型语言,编译器可以进行充分... 2023年10月21日 237 阅读 0 评论