2024-11-03 Fortran标准库系列:查询变量占用内存大小 Fortran标准库系列:查询变量占用内存大小 C语言提供sizeof()运算符计算数据类型对象占用内存字节数,常用于malloc分配对象空间时使用。那么Fortran语言中是否有类似函数计算对象大小?Fortran标准实际上提供了STORAGE_SIZE和C_SIZEOF内置函数可以实现该功能,此外GNU编译器提供了额外的扩展SIZEOF支持该功能。STORAGE_SIZEFortran 2008标准内置函数,函数返回参数A的存储大小,单位是bits。RESULT = STORAGE_SIZE(A [, KIND])参数A是任意类型的标量或者数组。可选参数KIND是标量整型常量表达式,用于指定返回值的整型KIND。需要注意的是,如果传入的参数A是数组,返回的是数组一个元素占有的位数,而不是整个数组存储空间大小。SIZEOFGNU扩展,不是Fortran标准内置函数。计算参数X占用的存储字节数,单位是字节(bytes)。函数假设数组连续。N = SIZEOF(X)返回值类型是INTEGER(C_SIZE_T),值是参数占用的字节数。如果参数是POINTER属性,返回指向的存储区域字节数。如果参数是包含POINTER或ALLOC... 2024年11月03日 115 阅读 0 评论
2024-09-22 Fortran Sequential二进制文件读入问题诊断 Fortran Sequential二进制文件读入问题诊断 问题现有一个二进制文件rain_clmn_202306.0000.dat及对应的GrADS CTL数据描述文件,使用GrADS绘图正常显示,但通过Fortran程序读入数据会报错。CTL数据描述文件如下所示:DSET ^rain_clmn_202306.0000.dat OPTIONS sequential big_endian UNDEF 9999.000 TITLE Result for CTRL,MWR, XDEF 45 linear 5.0000 9.0000 YDEF 8 levels 3.0000 6.0000 9.0000 12.0000 15.0000 18.0000 21.0000 24.0000 ZDEF 1 levels 0.000 TDEF 30 linear 00Z01JUN2023 1dy VARS 12 CTRL1 1 0 CTRL (TS) CTRL2 1 0 CTRL (MISSED) CTRL3... 2024年09月22日 175 阅读 0 评论
2024-08-10 Fortran标准库系列:MOD vs MODULO Fortran标准库系列:MOD vs MODULO 取余运算 vs 取模运算取余运算(remainder)在计算商时,会将商向0方向舍入。这意味着取余运算尽可能让余数的绝对值最小。取模运算(modulus)在计算商时,会将商向负无穷方向舍入。取模运算尽可能让商的值最小。当两个数都是正数时,取余运算和取模运算的结果是一样的,因为它们的商都是向0方向舍入的。然而,当两个数符号不同时,取余运算和取模运算的结果会不同。Fortran标准提供取余函数MOD和取模函数MODULO。MOD函数计算A除以P的余数。R=MOD(A,P)参数A是INTEGER或者REAL类型的标量。参数P必须与A相同类型和精度,不能为0。函数返回结果是$A-(INT(A/P)* P)$ ,返回值R符号与参数A相同,且$|R|<|P|$。MODULO计算A对P取模结果。R=MODULO(A,P)参数A是INTEGER或REAL类型的标量。参数P必须与A相同类型和精度,。返回结果类型和精度与参数相同,且返回值R符号与P相同,且$|R|<|P|$。。如果A和P是INTEGER类型,返回结果R满足$A=Q*P+R$ ,其中Q是一个整数,$R\in [0,P)$ ... 2024年08月10日 299 阅读 0 评论
2024-08-10 Fortran面向对象(三) Fortran面向对象(三) 继续Fortran面向对象的学习。Unlimited polymorphic typesclass(*) 类型称为无限制多态类型,必须拥有pointer或allocatable属性。括号中用*代替具体的类名表示可以是任意类。(联想C语言中void *通用指针概念)一般不直接使用无限制多态类型,常用作过程的哑元,使用select type结构转换为指定类型使用。CLASS(*), POINTER :: unlimited_ptr unlimited_ptr => base_target SELECT type(unlimited_ptr) TYPE IS (base) PRINT *, "base type: component value: ", unlimited_ptr%i TYPE IS (child) PRINT *, "child type: component values: ", unlimited_ptr%i,unlimited_ptr%j END SELECTpass ... 2024年08月10日 338 阅读 1 评论
2024-07-31 Fortran面向对象 二 Fortran面向对象 二 面向对象编程核心概念包括封装、继承及多态。下面介绍Fortran的类继承及多态语法。Fortran类继承Fortran中类继承使用扩展(extends)关键字定义继承哪个父类。type mytype integer :: value end type mytype ! extend from mytype type, extends(mytype) :: mynewtype real :: extra end type mynewtype新的类mynewtype除了继承mytype中成员value,还定义了新成员extra。module mytypes implicit none type mytype integer :: value contains ! => 过程别名 procedure,public :: write => write_mytype end type mytype type, extends(mytype) :: mynewtype real :: extra end ty... 2024年07月31日 125 阅读 0 评论
2024-07-31 Fortran面向对象 Fortran面向对象 从Fortran 2003开始标准加强了面向对象(OOP)语法支持,通过使用模块(module)及复用派生类型关键字(type)定义Fortran的类。Fortran主要参照C++ OOP模型进行设计,两者对比如下表所示。 C++Fortran成员在类中定义在'type'中定义方法在类中定义在'type'中声明interface;在module中实现构造函数default或explicit没有对象本身this第一个参数对象方法引用点操作符'.’%操作符Fortran类组织方式在模块文件定义类(module ...type ...contains ... end type ...contains ... end module)type...contains...end type定义类(包括数据成员及类方法声明)实际方法定义在模块contains部分实现类方法的第一个参数是对象本身module A type B ! data members integer :: c contains procedure :: d end type cont... 2024年07月31日 154 阅读 0 评论
2024-07-31 Fortran BLOCK结构 Fortran BLOCK结构 Fortran 2008标准提出了BLOCK语法结构,其作用是创建一个独立的命名空间,在里面可以定义一个可以包含声明的可执行代码块。BLOCK语法如下:[block_name:] BLOCK ! declartion ! executable statements END BLOCK [block_name]其中block_name可选,对block结构起一个名字可以让代码更加清晰。BLOCK结构中声明对象包括变量、type定义、外部过程等,这些声明的对象作用域(生命周期)只限于该BLCOK结构,不会影响到BLOCK外的变量,这意味着你可以在BLOCK内声明一个与外部相同的变量名,在BLOCK内声明的变量如与外部变量名相同,外部变量会暂时被”抑制“。program main implicit none integer :: x = 10 block integer :: x x = 4 print*, "Inside a block, x=",x end block print*, "Out... 2024年07月31日 110 阅读 0 评论
2023-10-21 Fortran代码格式化工具fprettify Fortran代码格式化工具fprettify 作为程序员,可能读代码的时间要比写代码的时间还要长。在你不得不阅读那些“没有缩进、嵌套分支代码太长不能确定对应的代码段等”糟心代码时,可能一款格式化工具能够帮助你抚平暴怒的心情。fprettify就是一款针对Fortran项目代码的自动化格式工具。项目地址:https://github.com/pseewald/fprettify安装fpretty是基于Python开发的脚本工具,依赖Python3 (最新版本不再支持Python 2.7)。使用pip或者conda安装即可。$ pip install --upgrade fprettify #or $ conda install -c conda-forge fprettify使用查看fprettify选项说明$ fprettify -h常用选项-i INDENT, --indent INDENT相对缩进宽度,默认是3个空格-l LINE_LENGTH, --line-length LINE_LENGTH每行最多列数(默认132列)-w {0,1,2,3,4}, --whitespace {0,1,2,3,4}控制插入白空格... 2023年10月21日 472 阅读 0 评论