【问题标题】:Double complex matrix derived type in FortranFortran中的双复数矩阵派生类型
【发布时间】:2014-10-29 14:03:41
【问题描述】:

我是 fortran 的新手,我想编写一个包含 Matrix 元素的双复数矩阵派生类型。我需要做的是定义类型并初始化矩阵,定义一个以可读形式将矩阵类型写入文件的例程,然后在我的屏幕上打印这个矩阵。我试过这个程序,它应该将值 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

【问题讨论】:

  • “它不起作用”是什么意思?在好的问题中避免使用这个短语。
  • 我收到以下错误:var%aa(ii,jj)=var%aa 1 错误:在 (1) 使用矩阵 1 的分配中不兼容的排名 0 和 2 致命错误:无法打开模块文件 'matrices.mod' 在 (1) 处读取
  • 如果它是可分配的,你在哪里ALLOCATE(var(2,3))
  • 如果AAtype(matrix) 那么AA%aa = 2d0 应该初始化这些值,而不是AA = matrix(2d0)
  • 我认为当你定义我想要分配给矩阵的值时你得到了分配。我想错了吗?我应该先分配,然后分配价值吗?在这种情况下,我应该简单地将矩阵定义为:double complex, dimension(2,3) :: a ??

标签: matrix fortran


【解决方案1】:

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

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

假设arr 在处理使用它的语句时是复数值的秩为2 的数组。在显示的代码中,2d0 不是复数的 rank-2 数组,所以难怪编译器会拒绝表达式。最新的编译器是必要的,因为这种自动分配是该语言的最新特性。

当然,就目前的情况而言,编译器永远不会在那里出错,它拒绝编译模块matrices。我怀疑它找到了这个语句

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

最令人反感的是,将一个数组(在右轴上)分配给同一数组的一个元素(在左轴上)。那可能永远行不通。我不知道那个函数是做什么的,我会删除它并让其余的代码工作。一件事肯定是没有必要的,而且做得不好,就是分配复杂的数组并为其设置值。我看到它没有在代码的其他地方使用。

回到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 位实部和虚部的复数。

【讨论】:

  • 非常感谢!这很有帮助,但还有两个问题:当我使用 iso_fortran_env “错误:无法打开模块文件 'iso_fortran_nv.mod' 以在 (1) 处读取”时收到此消息。其次,当我尝试打印矩阵时,我收到以下消息:“(1) 处的 WRITE 语句中的语法错误”。你能帮我进一步吗?我知道我完全不擅长使用 fortran,但这是我的第一次。
  • 顺便说一句,你用的是什么编译器?
  • 抱歉迟到了。我正在使用 gfortran!
  • re OP 的评论:无法打开模块文件 'iso_fortran_nv.mod' 仔细阅读我的代码(和您的代码),编译器的要求非常精确。至于 WRITE 语句中的语法错误 - 什么 write 语句?对于进一步的问答,请提出另一个问题,我们不要在 cmets 中继续,我们不要在聊天中继续。
猜你喜欢
  • 2016-07-15
  • 2012-10-23
  • 2019-03-02
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多