我有一个没有按预期行事的子程序,我无法理解为什么。
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 :(得分:1)
使用OPTIONAL
参数要求调用过程注意这一点。在Fortran中实现此目的的唯一方法是使用显式接口。
您的程序位于模块MOD_UTILS
内,因此它具有显式接口。确保调用此子例程的过程具有use MOD_UTILS
或正在使用模块使用该模块。
标准要求显式接口: