Fortran中的双复矩阵派生类型

时间:2014-10-29 14:03:42

标签: matrix fortran

我是fortran的新手,我想编写一个包含Matrix元素的双复矩阵派生TYPE。我需要做的是定义类型并初始化矩阵,定义一个以可读形式写入Matrix TYPE文件的例程,然后在我的屏幕上打印这个矩阵。我试过这个程序,它应该将值1d0分配给矩阵的每个元素我不知道什么是错的,但它不起作用。有人能帮助我吗?

这是我的程序

module matrices
   type matrix
      double complex, dimension(:,:), allocatable :: aa
   end type

    contains
   function assign(var)
      type(matrix) :: var
         integer*4 ii, jj
        do ii = 1, 2
     print *, ii
             do jj = 1, 3
        var%aa(ii, jj) = var%aa
     end do
         end do
   end function
end module matrices

program test
   use matrices
   type(matrix) :: AA
   AA = matrix(2d0)
   integer :: kk, ll
   do kk = 1, 2
      do ll = 1, 3
         write (*, *) AA(kk, ll)
      end do
   end do

end program test

1 个答案:

答案 0 :(得分:2)

如果你有一个最新的编译器,你可以简单地写

type(matrix) :: AA
AA = matrix(arr)

前提是arr在处理使用它的语句时,是复数值的rank-2数组。在显示的代码中2d0不是复数值的rank-2数组,因此毫无疑问编译器barfs表达式。最新的编译器是必需的,因为这种自动分配是该语言的最新功能。

当然,由于编译器永远不会在那里使用barf,它拒绝编译模块matrices。我怀疑它找到了这个陈述

var%aa(ii, jj) = var%aa

最令人反感的是,将一个数组(在rhs上)分配给同一个数组的一个元素(在lhs上)。这可能永远不会奏效。我无法弄清楚该函数的用途,我将其删除并使其余代码正常工作。有一件事当然没有必要,也没有做好,就是分配复杂的数组并为它设置值。我发现代码中没有使用它。

返回AA的复杂数组组件的自动分配,此语句

AA = matrix(arr)

确实要求arr是(双)复数值的rank-2数组。为了简洁和密集,您可以简单地写

AA = matrix(reshape([((2d0,1d0),ix=1,6)],[2,3]))

如果我的语法正确,则将复数值(2d0,1d0)分配给2x3数组的每个元素。

哦,在我写作的时候,一句无端的评论:double complex就是上个世纪。不要学习糟糕的旧方法,更好的方法是

use iso_fortran_env

complex(real64), dimension(:,:), allocatable :: aa

标准模块iso_fortran_env定义了,用于声明64位实数的标准常量,或者,这里是包含64位实部和虚部的复数。