FORTRAN 90 MINVAL比较错误

时间:2014-09-25 15:48:07

标签: fortran fortran90

我有一个没有按预期行事的子程序,我无法理解为什么。

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)

感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

使用OPTIONAL参数要求调用过程注意这一点。在Fortran中实现此目的的唯一方法是使用显式接口。

您的程序位于模块MOD_UTILS内,因此它具有显式接口。确保调用此子例程的过程具有use MOD_UTILS或正在使用模块使用该模块。

标准要求显式接口:

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