2014-09-25 3 views
0

У меня есть подпрограмма, которая не ведет себя так, как ожидалось, и я не могу понять, почему.Ошибка сравнения FORTRAN 90 MINVAL

SUBROUTINE CHECK_INPUT_2D(VNAME,X,MIN_VAL) 
CHARACTER(LEN=*) :: VNAME 
REAL(KIND=JPRB),INTENT(INOUT) :: X(:,:) 
REAL(KIND=JPRB),INTENT(IN),OPTIONAL :: MIN_VAL 
LOGICAL :: L_MIN 
CHARACTER(LEN=128) :: PRO_NAME='CHECK_INPUT_2D' 
L_MIN= .FALSE. 
IF (PRESENT(MIN_VAL)) THEN 
    IF (ANY(X < MIN_VAL)) THEN 
    L_MIN = .TRUE. 
    WHERE (X < MIN_VAL) 
     X = MIN_VAL 
    END WHERE 
    END IF 
END IF 
IF(L_MIN) WRITE(*,*) 'WARNING:'//PRO_NAME//'MIN VAL:'//TRIM(VNAME)//,MINVAL(X),' SET: ',MIN_VAL 
END SUBROUTINE CHECK_INPUT_2D 

Подпрограмма вызывается с установкой MIN_VAL в 0.0, но эта процедура все еще генерирует предупреждение. Почему это, когда значения X меньше 0.0? Как решить эту ошибку?

Эта подпрограмма находится в модуле со следующим заголовком:

MODULE MOD_UTILS 
USE KIND1 ,ONLY : JPIM ,JPRB 
IMPLICIT NONE 

INTERFACE CHECK_INPUT 
MODULE PROCEDURE CHECK_INPUT_1D,CHECK_INPUT_2D,CHECK_INPUT_3D 
END INTERFACE 
CONTAINS 

и подпрограмма вызывается из другого модуля со следующим заголовком:

MODULE MOD_SIM 

#include "defs.h" 

USE MOD_SIM_TYPES 
USE MOD_SIMULATOR 
USE KIND1 ,ONLY : JPIM, JPRB 

IMPLICIT NONE 

CONTAINS 

В MOD_SIM является охуевать, что просто содержит: CALL CHECK_INPUT_2D (VNAME, X, MIN_VAL)

Цените свою помощь в этом.

+0

Имеет ли эта подпрограмма явный интерфейс, определяемый там, где вы его вызываете? – casey

+0

Нет, это не так. Должен ли я добавить его? Как это вызывает/предотвращает эту проблему? – Shejo284

ответ

1

Использование аргументов OPTIONAL требует, чтобы вызывающая процедура знала об этом. Единственный способ добиться этого в Fortran - это использование явного интерфейса.

Вы используете модуль MOD_UTILS, поэтому он имеет явный интерфейс. Убедитесь, что процедура, вызывающая эту подпрограмму, имеет use MOD_UTILS или использует модуль, который использует этот модуль.

Необходимость явного интерфейса требуется стандарт:

  1. Fortran 2008:. 12.4.2.2 p1 (1) (2) (а) ISO/IEC 1539-1: 2010
  2. Fortran 90: 12.3.1.1 (2) (a) ISO/IEC 1539: 1991 (E)
+0

Хм ... интересный ответ. Я не хороший программист fortran, и я не писал этот код. Я могу только внести небольшие изменения. Кажется немного странным, что эта проблема с объявлением вызовет ошибочное поведение в подпрограмме. Поэтому я добавил дополнительные пояснения относительно модуля, содержащего проблемную подпрограмму, и модуль, содержащий вызывающую подпрограмму. Прошу прощения за то, что я не был более конкретным. Я понятия не имел, где ошибка. Вы все еще думаете, что вызывающий модуль должен включать интерфейс? – Shejo284

+0

@ Shejo284 см. Мое редактирование. – casey

+0

Я добавил использование MOD_UTILS в вызывающую подпрограмму, но это не помогает. НАЗВАНИЕ СИМУЛЯТОРА ... ----- ПРЕДУПРЕЖДЕНИЕ: CHECK_INPUT_2D: МИНИМАЛЬНАЯ ЗНАЧЕНИЕ SNOW_LS => 0.000000000000000E + 000 УСТАНОВИТЬ К: 0,000000000000000E + 000 – Shejo284

Смежные вопросы