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过程中的数组