2014-03-12 65 views
3

我無法在下面的代碼中刪除此錯誤。有3個功能; dev,norm和clcMatA。前兩個函數在第三個函數中被調用。但它們不被認爲是功能。我已經將它們定義爲像我爲其他功能所做的那樣,但是我之前沒有遇到過這樣的錯誤。錯誤#6404:此名稱沒有類型,並且必須有明確類型

的錯誤:

Error 1 error #6404: This name does not have a type, and must have an explicit type. [DEV] D:\Users\Vahid\Documents\Visual Studio 2008\Projects\Tst\Tst\Source1.for 66 

Error 2 error #6404: This name does not have a type, and must have an explicit type. [NORM] D:\Users\Vahid\Documents\Visual Studio 2008\Projects\Tst\Tst\Source1.for 78 

我真的很感激任何幫助。謝謝。

的代碼(以固定的格式;。對於):

 module parameters 

     implicit none 
     save 
     integer :: i,j 

     real*8 :: pi = 3.14159265358979323846,KP = 5.e-8, M = 0.5 
     real*8 :: expValPStran, expValDStran, expValVolume 

     end module 

***********************************  
     program empty 

     end program 

***********************************  
     function norm(matrix) 
     use parameters 
     implicit none 
     real*8, allocatable, intent(in) :: matrix(:) 
     real*8 :: norm,sum 
     integer :: dim 

     dim = size(matrix,1) 

     sum = 0. 
     do i=1,dim 
     sum = sum + matrix(i)**2 
     end do 
     norm = sqrt(sum) 


     end function  
***********************************  
!  calculates the deviatoric part of the current stress cStress 
     function dev(cStress,I_dev,ntens) 
     use parameters 
     implicit none 

     integer :: ntens 
     real*8 :: cStress(ntens),I_dev(ntens,ntens) 
     real*8 :: dev(ntens) 


     dev = matmul(I_dev,cStress) 


     end function 

***********************************  
     function clcMatA(cStress,D,I_dev,dtime,ndi,ntens) 
     use parameters 
     implicit none 

     integer :: ndi,ntens 
     real*8 :: Z(2,ntens), dProductIDev(ntens,ntens), 
    1clcMatA(ntens,ntens),D(ntens,ntens),I_dev(ntens,ntens), 
    2cStress(ntens),dProductSigmadev2(ntens,ntens), 
    3sigmaDevDyadicProduct(ntens,ntens),identity(ntens,ntens), 
    4sigmaDev(ntens),alpha, beta,dtime 


     alpha = expValVolume/(2*expValDStran) 
     beta = (6*expValVolume/(pi*expValPStran))**(1/M)*KP 
     sigmaDev = dev(cStress,I_dev,ntens) 
     dProductIDev = matmul(D,I_dev) 

     do i=1,ntens 
     do j=1,ntens 
      sigmaDevDyadicProduct(i,j)= sigmaDev(j)*sigmaDev(i) 
     end do 
     end do 


     do i=1,ntens 
     clcMatA(i,:) = dtime*((alpha+beta* 
    1 norm(sigmaDev)**(1./m-1.))*dProductIDev(i,:) + beta*(1./m-1.)* 
    2 norm(sigmaDev)**(1./m-3.)) 
     end do 


     end function 

回答

5

源文件包含一個模塊,一個程序和三個功能。您已注意在功能中使用關聯模塊,以便您可以在功能中使用該模塊的參數。但是您沒有撰寫任何聲明,也沒有撰寫代碼,因此功能clcMatA有任何normdev的知識。將所有三個函數的定義夾在同一個源文件中將不會提供編譯器所需的信息。

一個簡單的解決方案是將功能包含在模塊中。在參數聲明之後插入包含單詞contains的行,然後剪切並越過containsend module之間的函數代碼。

雖然我寫:

爲什麼地球上是在2014年,你用固定格式源代碼?

use parameters在你沒有真正使用模塊中定義的任何實體的函數中似乎很奇怪。

你的功能norm是寫

norm = sqrt(sum(matrix*matrix)) 

注意,我用的命名sum這裏的固有功能,一個長篇大論辦法,我強烈建議你不要使用sum作爲變量名。你不會混淆編譯器,你可能會迷惑自己。

+0

謝謝。將他們包括在模塊中工作。但是我也必須將「標準」這個名稱改爲別的。我不知道爲什麼! 這是ABAQUS子程序的一部分,該子程序默認接受.for或.obj文件。但它也可以通過一些修改以自由格式編寫。其實我還沒有查過兩種格式之間的根本區別。我會。 感謝您的提示。 – user3410012

+2

或者只是使用Fortran 2008中的函數'norm2'。 –

3

作爲子程序,您的功能normdev未知於clcMatA。你必須告訴它,他們是什麼:

real*8, external :: dev, norm 

然而,這是不夠的,因爲這兩個功能devnorm需要一個明確的接口,因爲dev返回數組值結果,並norm具有僞參數與可分配屬性(從頂部到底部讀取this頁面)。所以,你必須寫出明確的界面,這樣你的clcMatA可以更多地瞭解它們,或者將它們放在一個模塊中。

編輯:修正了錯誤的鏈接

+0

謝謝。我現在會投票,但我沒有足夠的聲譽。 – user3410012

+0

嘆息 - 鏈接已經腐爛。 –

相關問題