2017-03-10 9 views
0

Also habe ich einige Berechnungsprobleme in den Werten einer Zustandsgleichung Simulator überprüft. Nach einer Überprüfung habe ich gesehen, dass die Modulkonstanten die Werte nicht in die Unterroutinen ziehen, die zu Beginn deklariert wurden. Ich möchte diese Variablen nicht jedes Mal deklarieren, wenn ich sie benutze. Was soll ich tun? Deklariere ein Unterprogramm mit den Werten und benutze es jedes Mal, wenn ich die Parameter brauche?FORTRAN Array Fehlberechnung

MODULE Constantes 
Implicit None 
!Lista de constantes para funciones a y b usadas para calcular Z 
!Real,dimension(4)::y 
!Real::T,P 
Real,Parameter,Dimension(4)::Tc=(/ 190.56, 132.85, 304.12, 126.2 /) 
Real,Parameter,Dimension(4)::Pc=(/ 45.992, 34.94, 73.74, 33.98 /) 
Real,Parameter,Dimension(4)::w=(/ 0.011, 0.045, 0.225, 0.037 /) 
Real,Parameter,Dimension(4)::na=(/ 0.072, 0.608, 0.974, 25765.2 /) 
Real,Parameter,Dimension(4)::ma=(/15.68, 9.62, 34.04, 0.00 /) 
Real,Parameter,Dimension(4)::ba=(/ 6.48, 66.2, 14.04, 0.000928699 /) 
Real,Parameter,Dimension(4)::da=(/ 0.025, 0.03, 0.061, 0.00 /) 
Real,Parameter,Dimension(4)::ha=(/30.56, 48.16, 34.67, 30.0 /) 
Real,Parameter,Dimension(4)::ua=(/ 13.45, 14.84, 20.79, 0.0 /) 
Real,Parameter,Dimension(4)::ka=(/ 1.0, 1.0, 1.0, 1.13 /) 
Real,Parameter::c0=0.48,c1=1.574,c2=-0.176,eps=1,sig=0 
Double Precision,Parameter::omega=0.08664035,psi=0.42748023 
!Variables input para constante A 
!Variables input para A y B 
Contains 
Subroutine CA(y,T,At,ap,aij,D,n) 
     Implicit None 
    Double precision::psi 
Double precision,intent(out)::At,D 
    Double Precision,Dimension(4),intent(out)::ap 
    Double Precision,Dimension(4,4),intent(out)::aij 
    Real,Dimension(4)::Tc,Pc,w 
    Real::c0,c1,c2 
    Double precision,intent(in)::T,n 
    Double precision,dimension(4),intent(in)::y 
    Integer::i,j 
    Do i=1, 4 !Array de constantes a individuales 
     ap(i)=Tc(i)*Tc(i) 
     !ap(i)=(psi*(83.14*83.14*Tc(i)*Tc(i))/Pc(i))!*((1+((c0+c1*w(i)+c2*w(i)*w(i))*(1-sqrt(T/Tc(i)))))**(2))   
    End do 
    Do i=1,4 
     Do j=1,4 
      aij(i,j)=y(i)*y(j)*sqrt(ap(i)*ap(j))!Constantes duales de a 
     End do 
    End Do 
    At=sum(sum(aij,dim=1)) !A total independiente de n 
    D=At*n*n !A total dependiente de n 
    End Subroutine CA 
    Subroutine CB(y,Bt,bi,B,bij,n) 
    Implicit none 
    Real,Dimension(4)::Tc,Pc 
    Double precision, intent(in)::n 
    Double Precision,Dimension(4),intent(out)::bi 
    Double precision,dimension(4),intent(in)::y 
Double precision::omega,bm 
Double precision,intent(out)::Bt,B 
    Double precision,Dimension(4,4),intent(out)::bij 
Integer::i,j 
    Do i=1,4 !Array de constantes b individuales 
     bi(i)=omega*83.14*Tc(i)/Pc(i) 
    End Do 
    Do i=1,4 !Array constantes duales de b 
     Do j=1,4 
      bij(i,j)=0.5*(bi(i)+bi(j)) 
     End Do 
    End Do 
    BT=sum(bi*y) !B total independiente de n 
    B=n*BT !b total dependiente de n 
End Subroutine CB 
END MODULE Constantes 

Antwort

2

Ein Problem, das Sie haben, ist, dass Sie wieder declare (zumindest einige) der Parameter-Arrays innerhalb des Unterprogramms. Zum Beispiel ist die Linie

Real,Dimension(4)::Tc,Pc,w 

Masken der Existenz der Modulgrößen wie

Real,Parameter,Dimension(4)::Tc=(/ 190.56, 132.85, 304.12, 126.2 /) 

Das Unterprogramm hat bereits Zugriff auf diese Parameter-Arrays von Host-Vereinigung, sie wieder innerhalb des Unterprogrammes erklärt ist in diesem Fall ein Fehler.

Einige würden argumentieren, dass Sie, selbst wenn es nicht unbedingt notwendig ist, alle Argumente an Prozeduren durch ihre Argumentlisten weiterleiten sollten.