TypechoJoeTheme

MetMan's Blog

网站页面
搜索到 13 篇与 的结果 ———
2025-03-22

Fortran数组转置

Fortran数组转置
数组转置(transpose)是一个常见的操作。二维数组转置Fortran标准有一个内置函数transpose可以对Rank-2数组进行转置操作。program main implicit none integer :: a3,43,4 = reshape[1,2,3,4,5,6,7,8,9,10,11,12],[3,4][1,2,3,4,5,6,7,8,9,10,11,12], [3,4] integer,allocatable :: b:,::,: b = transposeaa print*, 'shapebb = ', shapebb print*, 'b = ', b end program更高维数组转置但对于高维数组,如何转置?显式循环使用显式嵌套循环进行数组转置,下面使用do concurrent结构对一个4维数组转职。dims = shapexx allocateres(dims(4res(dims(4, dims33, dims22, dims11)) do concurrenti=1:dims(1i = 1:dims(1, j = 1:dims22, k = 1:dims33, l = 1:dims44) ...
2025年03月22日
35 阅读
0 评论
2025-03-22

Fortran Associate结构学习

Fortran Associate结构学习
只要代码写得多,总能Get新知识。Fortran 2003标准中associate结构应该不常用,但associate结构用好可以简化复杂语句,增加代码的可读性。可以将associate关联名字看成是要指向的表达式或者变量的别名(引用),供后续代码使用。语法name:name: ASSOCIATE assocentity[, assocentity]...assoc-entity[, assoc-entity]...    block END ASSOCIATE namename其中name是可选的,associate结构名称,如果指定,后面的end assoicate也必须加上相同的名称。assoc-entity语法为assoicate-name => selector,其中selector是一个表达式或者变量,而associate-name是关联selector的别名。block是零条或者多条Fortran语句/结构。示例:program associateTest implicit none integer :: a=1,b=1 associatex=>ab x => a*b ! 表达式的引用 ...
2025年03月22日
35 阅读
0 评论
2024-12-02

ODC库编程实践

ODC库编程实践
前面提到过odb-2数据格式看成是二维表格型数据,但表格中每列的数据类型可以不同。开发人员可能考虑到通用性以及读写性能,在实现时将表格数据统一处理成双精度的二维数组(也可以看成更一般的一维数组)。real88, target :: datancols,nrowsncols, nrows rc = encoder%set_datadata,columnmajordata, column_major此时需要解决两个问题:二维数组在内存中的布局,即以列主元还是行主元的内存布局。如果column的类型不是双精度,那么就存在数据类型转换,对于数值类型还算简单,但字符类型如何处理?第一个问题,我们从ODC API看起。C API odc_encoder_set_data_array函数用于设置编码的输入数组。函数第二个参数是指定的输入数组,这里使用const void*类型符,通用类型指针。第三个参数是指数组(表格)的宽度,以字节为单位。第四个参数是数组的行数。最后一个参数是指列主元布局每列宽度,以字节为单位,一般为8字节,如果是行主元,传入0值。对应的Fortran API,则是类对象encoder的成员函数set_data,查看...
2024年12月02日
91 阅读
0 评论
2024-11-03

如何查阅Fortran语言标准

如何查阅Fortran语言标准
如果你对Fortran的语法细节感兴趣,希望了解标准如何定义的,可以阅读官方Fortran标准说明文档。各大编译器厂商基本上按照Fortran标准实现自家的编译器,再加上一些各自的扩展功能。由于ISO组织拥有Fortran最终标准的版权,无法免费获取正式标准的电子文档,需要花钱购买它们的纸质或电子文档。但有一个网上公开合法获取Fortran标准说明文档途径是美国Fortran编程语言标准技术委员会(J3)提供的内部工作版本。Fortran标准由"Working Group 5 of Sub-Committee 22 of the Joint Technical Committee 1 of the International Organization for Standardization and the International Electrotechnical Commission IECIEC"(ISO/IEC JTC1/SC22/WG5)负责开发,这个小组简称为WG5。官方网站:https://wg5-fortran.org而前面提到的J3是ISO/IEC JTC1/SC...
2024年11月03日
151 阅读
0 评论
2024-11-03

Fortran标准库系列:查询变量占用内存大小

Fortran标准库系列:查询变量占用内存大小
C语言提供sizeof运算符计算数据类型对象占用内存字节数,常用于malloc分配对象空间时使用。那么Fortran语言中是否有类似函数计算对象大小?Fortran标准实际上提供了STORAGE_SIZE和C_SIZEOF内置函数可以实现该功能,此外GNU编译器提供了额外的扩展SIZEOF支持该功能。STORAGE_SIZEFortran 2008标准内置函数,函数返回参数A的存储大小,单位是bits。RESULT = STORAGE_SIZEA[,KIND]A [, KIND]参数A是任意类型的标量或者数组。可选参数KIND是标量整型常量表达式,用于指定返回值的整型KIND。需要注意的是,如果传入的参数A是数组,返回的是数组一个元素占有的位数,而不是整个数组存储空间大小。SIZEOFGNU扩展,不是Fortran标准内置函数。计算参数X占用的存储字节数,单位是字节(bytes)。函数假设数组连续。N = SIZEOFXX返回值类型是INTEGERCSIZETC_SIZE_T,值是参数占用的字节数。如果参数是POINTER属性,返回指向的存储区域字节数。如果参数是包含POINTER或ALLOC...
2024年11月03日
120 阅读
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 TSTS CTRL2 1 0 CTRL MISSEDMISSED CTRL3...
2024年09月22日
178 阅读
0 评论
2024-08-10

Fortran标准库系列:MOD vs MODULO

Fortran标准库系列:MOD vs MODULO
取余运算 vs 取模运算取余运算(remainder)在计算商时,会将商向0方向舍入。这意味着取余运算尽可能让余数的绝对值最小。取模运算(modulus)在计算商时,会将商向负无穷方向舍入。取模运算尽可能让商的值最小。当两个数都是正数时,取余运算和取模运算的结果是一样的,因为它们的商都是向0方向舍入的。然而,当两个数符号不同时,取余运算和取模运算的结果会不同。Fortran标准提供取余函数MOD和取模函数MODULO。MOD函数计算A除以P的余数。R=MODA,PA,P参数A是INTEGER或者REAL类型的标量。参数P必须与A相同类型和精度,不能为0。函数返回结果是A(INT(A/P)P)A-(INT(A/P)* P) ,返回值R符号与参数A相同,且R<P|R|<|P|。MODULO计算A对P取模结果。R=MODULOA,PA,P参数A是INTEGER或REAL类型的标量。参数P必须与A相同类型和精度,。返回结果类型和精度与参数相同,且返回值R符号与P相同,且R<P|R|<|P|。。如果A和P是INTEGER类型,返回结果R满足A=QP+RA=Q*P+R ,其中Q是一个整数,R[0,P)R\in [0,P) ...
2024年08月10日
304 阅读
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 typeunlimitedptrunlimited_ptr TYPE IS basebase PRINT *, "base type: component value: ", unlimited_ptr%i TYPE IS childchild PRINT *, "child type: component values: ", unlimited_ptr%i,unlimited_ptr%j END SELECTpass ...
2024年08月10日
346 阅读
1 评论
登录
X
用户名
密码