나는 침투 계수를 수정할 수있는 ABAQUS를위한 FORTRAN 서브 루틴을 작성하려고하고 있으며 따라서 표면에 접촉이 있는지 여부에 따라 흐름을 수정합니다. 그렇게하기 위해서는 누출 계수를 수정하기 위해 노드 데이터와 흐름을 검색하기 위해 URDFIL이라는 2 개의 서브 루틴이 필요합니다.오류 : "data-ref의 맨 왼쪽 부분 -ref는 함수 참조가 될 수 없습니다."
그러나, 내 서브 루틴을 컴파일 할 때 나는 다음과 같은 오류를 얻을 :
flow_us.for(81): error #6837: The leftmost part-ref in a data-ref can not be a function reference. [K_ELE_DETAILS]
IF(K_ELE_DETAILS(E_INDX)%IS_CONT(N_INDX).EQ.0)THEN
----------^
flow_us.for(81): error #6158: The structure-name is invalid or is missing. [K_ELE_DETAILS]
IF(K_ELE_DETAILS(E_INDX)%IS_CONT(N_INDX).EQ.0)THEN
은 분명히이 (89 81,8 등) 등의 구조를 포함하는 (의 경우) 3 개 라인에 대해 반복된다.
아래의 코드를 발견하고 희망 누군가가 당신이, 또한
IF(K_ELE_DETAILS(E_INDX)%OPP_IS_CONT(N_INDX).EQ.0) THEN
대신
IF(K_ELE_DETAILS(E_INDX)%IS_CONT(N_INDX).EQ.0)THEN
를 작성하는 의미 생각
****************************************************************************************
***SUBROUTINE FOR ADAPTIVE FLUID FLOW
****************************************************************************************
****************************************************************************************
**
**
**
*USER SUBROUTINE
SUBROUTINE URDFIL(LSTOP,LOVRWRT, KSTEP, KINC, DTIME, TIME)
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION ARRAY(513),JRRAY(NPRECD,513),TIME(2)
EQUIVALENCE (ARRAY(1),JRRAY(1,1))
C DECLARATIONS
TYPE ELE_DATA
SEQUENCE
DOUBLE PRECISION :: NODE_COORD(9)
DOUBLE PRECISION :: OPP_NODE_COORD(9)
DOUBLE PRECISION :: IPT_COORD(9)
DOUBLE PRECISION :: POR(3)
DOUBLE PRECISION :: OPP_POR(3)
INTEGER :: ELE_NUM
INTEGER :: OPP_ELE_NUM
INTEGER :: NODE_NUM(3)
INTEGER :: OPP_NODE_NUM(3)
INTEGER :: IPT_NUM(3)
INTEGER :: OPP_IS_CONT(3)
END TYPE ELE_DATA
TYPE(ELE_DATA)::K_ELE_DETAILS(500)
COMMON K_ELE_DETAILS
PARAMETER (THRESHOLD_CSTRESS=1.0E-6)
*******************************************************
INTEGER :: NO_OF_NODES
INTEGER :: NO_OF_ELEMENTS
INTEGER :: NO_OF_DIM
COMMON NO_OF_DIM, NO_OF_NODES, NO_OF_ELEMENTS
********************************************************
C INITIALIZE
LSTOP=0
LOVRWRT=1
LOP=0
NO_OF_NODES=10000
NO_OF_ELEMENTS=10000
NO_OF_DIM=2
DO K1=1,999999
CALL DBFILE(0, ARRAY,JRCD)
IF (JCRD.NE.0) GO TO 110
KEY=JRRAY(1,2)
*******************************************************
C THE KEYS USED IN THE FOLLOWING LINES REFER
C TO INFORMATION ON THE SURFACE, NODES, CONTACT ETC
IF (KEY.EQ.1501) THEN
ELSE IF (KEY.EQ.1502)THEN
ELSE IF(KEY.EQ.1911) THEN
ELSE IF(KEY.EQ.108.AND.SURFACE_N_SET.EQ.'N_TOP') THEN
ELSE IF(KEY.EQ.107.AND.SURFACE_N_SET.EQ.'N_TOP') THEN
ELSE IF(KEY.EQ.1503)THEN
ELSE IF(KEY.EQ.1504.AND.K_NODE_SET.EQ.'N_TOP')THEN
ELSE IF(KEY.EQ.1511.AND.K_NODE_SET.EQ.'N_TOP')THEN
C IS THE NODE IN CONTACT?
120 CONTINUE
END IF
END DO
110 CONTINUE
RETURN
END
**********************************************************
**********************************************************
*USER SUBROUTINE
SUBROUTINE FLOW(H, SINK, KSTEP, KINC, TIME, NOEL, NPT, COORDS,
1 JLTYP,SNAME)
INCLUDE 'ABA_PARAM.INC'
C
DIMENSION TIME(2), COORDS(3)
CHARACTER*80 SNAME
MIN_DIST=10E-20
DO K25=1,NO_OF_ELEMENTS
DO K26=1,NO_OF_NODES
C FINDS THE CLOSEST NODE TO THE INTEGRATION POINT NPT
END DO
END DO
C NOT IN CONTACT
IF(K_ELE_DETAILS(E_INDX)%IS_CONT(N_INDX).EQ.0)THEN
IF(K_ELE_DETAILS(E_INDX)%POR(N_INDX).GE.0) THEN
SINK=0
H=0.001
ELSE
SINK=0
H=1
END IF
ELSE IF(K_ELE_DETAILS(E_INDX)%IS_CONT(N_INDX).EQ.1)THEN
C IF THERE IS CONTACT
SINK=0
H=0
END IF
RETURN
END
코드가 모두 대문자로 표시되는 이유는 무엇입니까? 소문자로 모두 표기된 단어는 대문자로만 표기된 단어보다 읽기 쉽습니다. 또한, 문자 'i'와 숫자 '1', 문자 'B'와 숫자 '8'등을 혼동 할 가능성은 거의 없으며, 이는 일부 글꼴에서 문제가 될 수 있습니다. 마지막으로 자유 형식으로 코드를 작성하십시오. 현대 코드에서 구조화 된 제어 문 (예 :'select case' 또는'if-then-else') 문 레이블을 사용하는 것은 드문 경우입니다. 고정 소스 형식에서 처음 5 열은 거의 사용되지 않기 때문에 낭비됩니다. – jlokimlin
각 서브 루틴의 해당 지점에'암시 적 없음 '을 추가하십시오. – francescalus
감사합니다. 필자는 결코 Fortran의 전문가가 아니며이 서브 루틴은 내 연구 그룹의 다른 누군가가 시작했기 때문에 지난 며칠 동안 그들을 봐야만했습니다. 그래서 나는 그들이 어떻게 작동하는지 완전히 이해하기가 더 어려워졌습니다. 당신 중 아무도 암시 적으로 아무 것도 추가 할 필요가없는 부분과 그것이 무엇을 할 것이라고 나에게 설명 할 수 있을까요 ?? 감사합니다. –