2014-10-29 64 views
0

我是fortran中的新成員,我想寫一個包含矩陣元素的double複數矩陣派生類型。我需要做的是定義類型並初始化矩陣,定義一個例程,以可讀形式寫入Matrix TYPE文件,然後在屏幕上打印此矩陣。我試着用這個程序,它應該給矩陣的每個元素賦值1d0,我不知道什麼是錯誤的,但它不起作用。有誰能夠幫助我?Fortran中雙複雜矩陣派生類型

這是我的計劃

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 
+3

什麼意思是「它不工作」?避免使用這個短語。 – 2014-10-29 14:34:20

+0

我得到以下錯誤:VAR%AA(II,JJ)= VAR%AA 錯誤:不兼容的行列0和2中分配在(1) 使用矩陣致命錯誤:無法打開模塊文件' (1) – 2014-10-29 14:50:48

+0

如果它是可分配的,你在哪裏'ALLOCATE(var(2,3))'? – ja72 2014-10-29 15:08:31

回答

2

如果你有一個最新的編譯器,你可以簡單的寫提供

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

arr是,在使用它處理語句,一個秩2個複數值數組。在顯示的代碼2d0不是一個複雜值的rank-2數組,因此難怪表達式上的編譯器barfs。最新的編譯器是必要的,因爲這個自動分配是該語言的最新功能。

當然,就目前情況而言,編譯器永遠不會到達barf那裏,它拒絕編譯模塊matrices。我懷疑它發現這種說法

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

最攻勢,分配一個數組(上右)在同一陣列中的一個元素(上左)。這可能永遠不會起作用。我無法弄清楚這個功能是什麼,我會刪除它並讓代碼的其餘部分工作。有一件事情當然沒有必要,而且做得不好,就是分配複雜數組併爲其設置值。我發現它沒有用在代碼中的其他地方。

返回的AA複雜陣列部件的自動分配,這種說法

AA = matrix(arr) 

的確需要arr是(雙)複數值的秩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位實部和虛部。

+0

非常感謝!這很有幫助,但還有兩個問題:當我使用iso_fortran_env時出現此消息「錯誤:無法打開模塊文件'iso_fortran_nv.mod'以在(1)處讀取」。其次,當我嘗試打印矩陣時,出現以下消息:「(1)中WRITE語句中的語法錯誤」。你能進一步幫助我嗎?我知道我在使用fortran時完全不好,但這是我第一次。 – 2014-10-29 16:15:50

+0

順便說一句,你使用什麼編譯器? – ja72 2014-10-29 18:14:19

+0

對不起,遲到了。我正在使用gfortran! – 2014-10-30 07:15:44