TypechoJoeTheme

MetMan's Blog

网站页面
搜索到 7 篇与 的结果 ———
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日
37 阅读
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日
36 阅读
0 评论
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日
34 阅读
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日
36 阅读
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日
33 阅读
0 评论
2023-11-11

MPI版本混用问题诊断

MPI版本混用问题诊断
MPI作为消息通信工业标准,在高性能计算中被广泛使用。MPI标准定义了库函数语法、语义,开发商根据标准开发实现具体的MPI软件版本,比如常见的MPICH、OpenMPI、Intel MPI、MVAPICH等。为了满足不同的需求,HPC计算平台一般会安装多个MPI实现版本,如果用户开发环境设置混乱,可能会导致MPI版本混用情况,从而引发意想不到的错误,包括编译时和运行时错误。比如笔者遇到如下情况:依赖库使用一种MPI实现编译,模式使用另一种MPI实现编译链接,在运行时出现很奇怪的错误,这种错误有时候不容易联想到是MPI混用导致的。下面总结MPI混用引起的编译时和运行时错误。代码示例示例项目有两个源代码文件:sum.f90和main.f90,其中主程序main(main.f90)依赖模块mod_sum(sum.f90)。!sum.f90 module mod_sum use mpi implicit none contains subroutine sum_global() implicit none integer :: id,total,ierr ...
2023年11月11日
161 阅读
0 评论
2023-10-27

Segmentation Faults错误排查解决思路

Segmentation Faults错误排查解决思路
前言Segmentation Faults可能是每一个programmer都回避不了的错误,国内甚至还有一个以它命名的网站(思否,segmentfault.com)。在诊断、解决这个常见程序错误时,我们可以借助编译器提供的功能快速定位。本文译自Intel® Developer Zone上文章Determining Root Cause of Segmentation Faults SIGSEGV or SIGBUS errors文中主要介绍通过Intel Fortran编译器提供的功能诊断解决Fortran程序段错误。问题当我运行由Intel Fortran编译器编译的代码时,在Linux平台得到SISGEGV错误提示(或Mac OS X平台SIGBUS)。这份代码在<XX编译器/平台>上运行多年没出问题。这是Intel编译器一个bug吗?运行环境:linux 或 Mac OS X根本原因:有许多可能原因。段错误(segmentation fault)(Mac OS X下是bus error)是一个有多种原因的通用错误。下面我们描述可能的原因并给出建议以避免段错误。可...
2023年10月27日
187 阅读
0 评论

互动读者

标签云

最新回复

暂无回复

登录
X
用户名
密码