2015-06-23 5 views
0

У меня есть несколько «Аргумент один тип в (1), но есть и другой тип при ошибках (2) в моей программе, но я не уверен, как это изменить. Есть ли другой способ написать аргументы, чем то, что я сделал?Проблема Fortran: аргумент «xx» является одним типом в (2), но является некоторым другим типом в (1)

Пс. Я компилирую в g77.Но я также пробовал . gfortran, где ошибка, которая приходит имеет вид «место несоответствие в аргументе„г“в (1) (скалярное и рангом-1)»

Здесь есть ошибки придумывают:

geomalb.f: In subroutine `atmsetup': 
geomalb.f:1083: 
     SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU, 
            1 
geomalb.f:1122: (continued): 
     SUMT=SUMT+(EFFG(Z(J))*ADEN)*(Z(J-1)-Z(J))*XMU(J) 
        2 
Invalid declaration of or reference to symbol `z' at (2) [initially seen at (1)] 
geomalb.f:80: warning: 
     COLDEN(J)=RHOP*(PRESS(J+1)-PRESS(J))/EFFG(Z(J)) 
               1 
geomalb.f:1122: (continued): 
     SUMT=SUMT+(EFFG(Z(J))*ADEN)*(Z(J-1)-Z(J))*XMU(J) 
        2 
Argument #1 of `effg' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS] 
geomalb.f:80: warning: 
     COLDEN(J)=RHOP*(PRESS(J+1)-PRESS(J))/EFFG(Z(J)) 
               1 
geomalb.f:1124: (continued): 
     SUMB=SUMB+(EFFG(Z(J))*ADEN)*(Z(J-1)-Z(J))*28.01340 
        2 
Argument #1 of `effg' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS] 
geomalb.f:72: warning: 
     CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU, 
       1 
geomalb.f:1083: (continued): 
     SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU, 
        2 
Argument #2 (named `z') of `atmsetup' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS] 

Часть программы:

 SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU, 
    & CH4,H2,XN2,AR,IPRINT) 
     PARAMETER (NMAX=201) 
     DIMENSION CH4(1),H2(1),XN2(1),AR(1) 
     DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX) 
     DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1) 
     CALL LINDAL(NLEVEL,Z,TLINAL,DLINAL,PLINAL) 
     DO J=1,NLEVEL 
     TEMP(J)= TLINAL(J) 
     DEN(J)= DLINAL(J) 
     PRESS(J)=PLINAL(J) 
     ENDDO 
     DO 1000 ITS =1,20 
     CH4(NLEVEL)=PCH4(TEMP(NLEVEL))*RHCH4/PRESS(NLEVEL) 
     DO 134 J=NLEVEL-1,1,-1 
     CH4SAT=PCH4(TEMP(J))/PRESS(J) 
     CH4(J)=AMIN1(CH4SAT,CH4(NLEVEL),CH4(J+1)) 
    134 CONTINUE 
     DO 20 J=1,NLEVEL 
     H2(J)=FH2 
     IF (FARGON .LT. 0.) THEN 
     AR(J)=(-FARGON-28.0134+25.8554*H2(J)+11.9708*CH4(J))/11.9346 
     ELSE 
     IF (FARGON .EQ. 0.) THEN 
     AR(J)=0.0 
     ELSE 
     AR(J)=FARGON 
     ENDIF 
     ENDIF 
     XN2(J)=1.0 - H2(J) - CH4(J) -AR(J) 
     XMU(J)=28.0134*XN2(J)+2.158*H2(J)+16.0426*CH4(J)+39.948*AR(J) 
    20 CONTINUE 
     SUMT=PLINAL(1)*6.02E23/10. 
     SUMB=SUMT 
     TLAST=TEMP(NLEVEL) 
     DO J=2,NLEVEL 
     DENF=294.1/(XN2(J)*294.1 + CH4(J)*410. + H2(J)*136. + AR(J)*277.8) 
     DEN(J) = DLINAL(J)*DENF 
     ADEN=(DEN(J)-DEN(J-1))/ALOG(DEN(J)/DEN(J-1)) 
     SUMT=SUMT+(EFFG(Z(J))*ADEN)*(Z(J-1)-Z(J))*XMU(J) 
     ADEN=(DLINAL(J)-DLINAL(J-1))/ALOG(DLINAL(J)/DLINAL(J-1)) 
     SUMB=SUMB+(EFFG(Z(J))*ADEN)*(Z(J-1)-Z(J))*28.01340 
     PRESS(J)=PLINAL(J)*SUMT/SUMB 
     TEMP(J) =TLINAL(J)*(SUMT/SUMB)*(1./DENF) 
     ENDDO 
    30 CONTINUE 
     DT= ABS(TEMP(NLEVEL)-TLAST) 
     IF (DT .LT. 0.001) GO TO 1001 
1000 CONTINUE 
1001 IF (IPRINT .LT. 0) RETURN 
     WRITE (6,139)RHCH4,FH2,FARGON,DT 
     DO 135 J=1,NLEVEL-1 
     WRITE(6,140)J,Z(J),PRESS(J),DEN(J),TEMP(J), 
    &   CH4(J)*PRESS(J)/PCH4(TEMP(J)) 
    &   ,CH4(J)*100.,XN2(J)*100.,H2(J)*100.,AR(J)*100.,XMU(J) 
    &   ,(TEMP(J+1)-TEMP(J))/(Z(J+1)-Z(J)) 
    135 CONTINUE 
     J=NLEVEL 
     WRITE(6,140)J,Z(J),PRESS(J),DEN(J),TEMP(J), 
    & CH4(J)*PRESS(J)/PCH4(TEMP(J)) 
    & ,CH4(J)*100.,XN2(J)*100.,H2(J)*100.,AR(J)*100.,XMU(J) 
    139 FORMAT(///' BACKGROUNG ATMOSPHERE AT LEVELS'/ 
    & ' SURFACE HUMIDITY OF CH4:',F5.3,' H2 MIXING RATIO:',F6.4, 
    & ' ARGON SETTING:',F8.4/' FINAL CONVERGENCE ON TEMP:',F10.5 
    & , ' LINDAL ET AL SCALING'/ 
    &' LVL ALTITUDE P(BARS) DEN(CM-3) TEMP RH-CH4' 
    & , ' %CH4 %N2 %H2 %AR MU DT/DZ' ) 
    140 FORMAT(1X,I3,F8.3,1P2E10.3,0PF7.2,F5.2,2F6.2,2F5.2,4F6.2) 
     RETURN 
     END SUBROUTINE 
     END 

И раньше в программе это то, как я называю подпрограмму:

 CALL ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU, 
    & CH4,H2,XN2,AR,IPRINT) 
+3

* Я компилирую в g77 * Ну, остановитесь, начните использовать gfortran в качестве основного компилятора или компилятора Intel Fortran или Cray или IBM или Absoft или PGI. И начните использовать 'implicit none' в каждой области вашей программы. Вы становитесь постоянным здесь, что приятно для нас, но помогите нам помочь вам и начать применять современные практики программирования Fortran. Вам не нужно прилагать огромные усилия для модернизации всего вашего кода сразу, вы можете вводить новые по частям. Хорошим началом было бы написать декларации всех фиктивных аргументов для подпрограммы, с которой у вас возникают проблемы. –

+0

@HighPerformanceMark Спасибо за ответ.Причина, по которой я использую g77, заключается в том, что это программа, написанная в 1987 году, из которой я просто хочу получить текстовый файл со значениями, которые я могу использовать в своем коде на Python. Я никогда не учил fortran, поэтому у меня с ним много проблем. Я мог бы изменить всю программу, хотя это около 5000 строк. Ради моей цели, я думаю, что проще попробовать и скомпилировать ее так, как есть. Я тоже компилировался в gfortran, хотя и возникла ошибка «несоответствие ранга», которая, похоже, связана с ошибкой g77. – JadeChee

+0

Правильно, сообщение gfortran является более явным сообщением о той же ошибке, о которой сообщает g77. И ваша стратегия не изучать Fortran, а полагаться на незнакомцев на SO, чтобы разобраться в ваших проблемах для вас, кажется, работает хорошо :-) –

ответ

2

Вы не предоставлять какую-либо информацию типа для переменных и вместо того, чтобы полагаться на неявное печатать , При стандартных неявных правил типизации, ваши переменные Z и EFFG объявлены как:

real :: Z 
real :: EFFG 

Оба Z и EFFG реальные переменные ранга 0 (скаляр). Вы ссылаетесь на эти переменные следующим образом:

EFFG(Z(J)) 

Это несоответствие ранга. Вы получаете доступ к Z в качестве переменной ранга 1 и EFFG в качестве переменной ранга 1, но они неявно определяются как переменные ранга 0.

Исправление состоит в том, чтобы правильно объявить переменные как массивы ранга 1. В комментариях вы замечаете, что переход на gfortran изменил ошибку от общей ошибки «типы разные» в конкретное «несоответствие ранга». Это гораздо более полезное сообщение об ошибке, и другие отметили, что вы должны иметь возможность (после устранения всех проблем) компилировать свой код с помощью gfortran без каких-либо (или только незначительных) изменений в отношении компиляции g77. Следует принять на вооружение современные методы и простое начало было бы изменить

 SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU, 
     & CH4,H2,XN2,AR,IPRINT) 
     PARAMETER (NMAX=201) 
     DIMENSION CH4(1),H2(1),XN2(1),AR(1) 
     DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX) 
     DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1) 

в

 SUBROUTINE ATMSETUP(NLEVEL,Z,RHCH4,FH2,FARGON,TEMP,PRESS,DEN,XMU, 
     & CH4,H2,XN2,AR,IPRINT) 
     implicit none 
     integer NMAX 
     real CH4, H2, XN2, AR, TLINAL, DLINAL, PLINAL, DEN, PRESS, TEMP 
     real xmu, Z, EFFG, RHCH4, FH2, FARGON, ADEN, CH4SAT, DENF, DT 
     real SUMB, SUMT, TLAST, PCH4 
     integer NLEVEL, IPRINT, ITS, J 

     PARAMETER (NMAX=201) 
     DIMENSION CH4(1),H2(1),XN2(1),AR(1) 
     DIMENSION TLINAL(NMAX),DLINAL(NMAX),PLINAL(NMAX) 
     DIMENSION DEN(1), PRESS(1), TEMP(1), XMU(1) 

Обратите внимание, что это изменение не будет исправить вашу ошибку, так как я не консультировался мой хрустальный шар, чтобы определить, размеры Z и EFFG. Все, что я сделал, это добавить явные типы, что должно быть понято древним компилятором g77 (и gfortran в фиксированной форме). Также обратите внимание, что я предполагал неявные типы по умолчанию для определения явных типов, используемых выше, и если они не то, что вы ожидали от них, то это еще лучшая причина для принятия явного набора текста.