分类目录归档:Study

Fortran过程与intent属性

Fortran的intent属性用于过程的形参。以前我在彭国伦的书上学到的时候,觉得它仅仅是告诉编译器要检查形参在过程中是否满足intent属性所要求的:intent(in)要求形参在过程中不能重新被赋值,intent(out)要求形参必须改变其值,intent(inout)则无所谓。认为intent属性仅仅用于编译时的语法检查(比如你要写一个纯函数或逐元函数时就最好给形参加上intent(in),表明过程不会产生副作用),而与运行时的行为无关。但后来我在写类型绑定过程时遇到过几次错误,都与intent属性有关,所以整理了一下intent在运行时的影响,当然实际上都和有allocatable属性的数组有关(我怀疑指针也会碰到一些情况,以后也许会补充)。
继续阅读Fortran过程与intent属性

简单的Fortran回调函数例子

首先声明一下,其实我并不是很懂回调函数是什么。根据我看过几篇文章后留下的印象就是为某个过程/函数提供一个自行编写的过程/函数作为参数。

因为我也不是很懂,所以这篇文章只是提供两个例子供参考。更复杂的玩法或许需要更了解C语言以及Fortran与C语言混编的方法(即iso_c_binding模块)。目前网络上关于Fortran回调函数的较为详细的讨论我只看到这个:Type Casting in Callbacks,里面的例子感觉很trivial。
继续阅读简单的Fortran回调函数例子

Fortran过程中的数组

本文主要讨论的是Fortran过程(subroutine和function)中作为局部变量的数组。关于数组作为参数传递,看FAQ之 三种数组传递方式。本文参考了Modern Fortran in Practice

此外,本文讨论的作为局部变量的数组,其大小在整个程序可动态变化,不是固定大小的数组。

在Fortran中有三种类型的数组可实现动态大小:

  • 自动数组(automatic arrays)
  • 可分配大小数组(allocatable arrays)
  • 指针(pointers)

例子:

subroutine flexible_arrays(N)
  integer, intent(in) :: N
  integer, dimension(N) :: auto_arr ! 自动数组
  integer, dimension(:), allocatable :: alloc_arr ! 可分配大小数组
  integer, dimension(:), pointer :: ptr ! 指针
end subroutine

接下来分别简单讨论一下各种方式的细节。
继续阅读Fortran过程中的数组

Fortran初学者配置指南

选择现代Fortran

FORTRAN 77肯定是不要再学了,或者至少不要写F77(因为可能免不了要看旧代码,所以也许还是要学)。不够我想说的是,也不要一直留在Fortran 90/95,最好继续学习Fortran 2003/2008以及Fortran 2018的新特性。Fortran 2003/2008提供了近乎完全的面向对象(自定义类型、类型绑定过程、抽象类、继承、多态等)的支持,以及新的内置过程等。虽然不见得所有新特性都用得上,但我认为是值得学的。

关于书,彭国伦的《Fortran 95程序设计》还是很优秀的,选择用这本书入门完全可以。但是既然推荐继续学习Fortran 2003/2008,肯定要看更多的书。直接学习Stephen J. Chapman的《Fortran 95/2003程序设计》也可以,可惜这书的中译版质量有点那啥,比较在意的话还是看彭国伦的吧。其他的中文书就不太推荐了,比如《Fortran权威指南》,声称涵盖了F2003,实际上只是提了一下(不到4页的内容)。P.S. 今年(2019年)有一本新的中文Fortran书《FORTRAN程序设计权威指南》,看了一下目录,似乎介绍了F2003/2008的特性,也许值得一试(但仍然想吐槽标题用的是全部大写的FORTRAN)。
继续阅读Fortran初学者配置指南

Fortran do concurrent语句备忘

本文用于记录一些我了解到的关于Fortran do concurrent语句的信息。本文不是教程,是笔记,而且是可能存在错误、过时、或关于特定编译器的信息。

do concurrent语句是do循环的一个扩展,具体的语法和限制看Modern Fortran ExplainedIntel Fortran Compiler 19.0 Developer Guide and Reference即可。
继续阅读Fortran do concurrent语句备忘