fortran高级技巧.docx

fortran高级技巧.docx

Fortran95/2003高级技巧的整理,主要依据Stephen J. Chapman著,刘瑾等译的《Fortran95/2003程序设计》。选择的都是平常少用又重要的高级特性。粗体表示重点或需注意的地方,蓝色表示Fortran2003才有的新特性。 1. 隐式DO循环 隐式DO循环可以用在数组初始化或读写文件中。格式为 (arg1, arg2, ..., index = istart, iend, incr) 可见,隐式DO循环可以一次返回多个值(arg1, arg2, ...)。以此可以产生复杂的模式。例如下面的语句 integer, dimension(25) :: array = (/ ((0, i = 1, 4), 5 * j, j = 1, 5) /) 初始化array中不能整除5的元素为0,其他元素为5的倍数。结果是 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 15, 0, 0, 0, 0, 20, 0, 0, 0, 0, 25 2. 静态变量 声明一个变量时如果附加save属性,则这个变量成为静态变量,其值一旦初始化后一直存在。也可以用单独的save语句来声明静态变量。 2.1 子程序中的静态变量 在子程序中声明的静态变量,其值在退出子程序后仍然保留,当下次调用子程序时,可以直接使用上次保留的值。例如 subroutine test(reset) ????logical, intent(in) :: reset ????integer, save :: cnt ????if (reset) then ????????cnt = 0 ????else ????????cnt = cnt + 1 ????endif ????write(*, *) cnt end subroutine test 在主程序中调用它: program main implicit none integer :: i call test(.true.) do i=1, 3 ????call test(.false.) end do end program 程序的输出将是 0 1 2 3 因为上次调用test后变量cnt的值保留,下次调用时直接使用。 需要注意的是,在子程序中变量声明时直接初始化的变量隐含具有save属性。即 integer :: cnt = 0 等价于 integer, save :: cnt = 0 这种变量的初始化操作只会进行一次,而不是每次进入子程序都初始化!所以下面的程序 subroutine test() ????integer :: cnt = 0 ???? ????write(*, *) cnt ????cnt = cnt + 1 end subroutine test program main implicit none integer :: i? do i = 1, 3 ????call test end do end program 结果为 1 2 3 2.2 模块中的静态变量 在模块中用save命令,则其后定义的变量均成为静态变量。所有引用该模块的程序都可以使用并改变静态变量的值,在其他模块中此改变继续有效。事实上,这种静态变量相当于其他语言中的全局变量。 3. where结构 where结构的作用是对于给定逻辑数组中每个真值,对目的数组的相应元素进行某中操作。例如 where (a 0) ????b = 1 elsewhere ????b = 0 end where 相当于 b(a0) = 1 b(a=0) = 0 但where结构运行效率更高。 使用where结构的限制是对于每个元素的操作都不应该与其他元素有关。 4. forall结构 forall结构严格来讲不是一种循环结构,而是使编译器能够对每个数组元素启动一个单独的进程来处理,从而能够实现并行运算。例如 forall (i = 1 : n, j = 1 : n, i j) ????a(i, j) = sqrt(a(i, j)) end forall 使得编译器对于a中ij的每个元素启动一个单独的进程求其平方根从而提高效率。对于大型计算机或有多个CPU的计算机,当数组很大时,能够显著地提高效率。 因为每个元素独立运算,forall结构与where类似,其中不应该涉及与其他元素有关的操作。如果forall结构中包括了不止一条语句,那么处理机会等第一条语句的每个进程都完成后才进行下一条操作。 另外,forall结构中调用的函数或过程必须是纯的(见第6条)。 5. 动态数组 5.1 动态数组的分配和赋值 动态数组声明时具有allocatable属性,在需要的时候用allocate语句分配空间,并用dea

文档评论(0)

1亿VIP精品文档

相关文档