2016-08-25 6 views
-2

나는 침투 계수를 수정할 수있는 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 
+0

코드가 모두 대문자로 표시되는 이유는 무엇입니까? 소문자로 모두 표기된 단어는 대문자로만 표기된 단어보다 읽기 쉽습니다. 또한, 문자 'i'와 숫자 '1', 문자 'B'와 숫자 '8'등을 혼동 할 가능성은 거의 없으며, 이는 일부 글꼴에서 문제가 될 수 있습니다. 마지막으로 자유 형식으로 코드를 작성하십시오. 현대 코드에서 구조화 된 제어 문 (예 :'select case' 또는'if-then-else') 문 레이블을 사용하는 것은 드문 경우입니다. 고정 소스 형식에서 처음 5 열은 거의 사용되지 않기 때문에 낭비됩니다. – jlokimlin

+0

각 서브 루틴의 해당 지점에'암시 적 없음 '을 추가하십시오. – francescalus

+0

감사합니다. 필자는 결코 Fortran의 전문가가 아니며이 서브 루틴은 내 연구 그룹의 다른 누군가가 시작했기 때문에 지난 며칠 동안 그들을 봐야만했습니다. 그래서 나는 그들이 어떻게 작동하는지 완전히 이해하기가 더 어려워졌습니다. 당신 중 아무도 암시 적으로 아무 것도 추가 할 필요가없는 부분과 그것이 무엇을 할 것이라고 나에게 설명 할 수 있을까요 ?? 감사합니다. –

답변

0

을 도울 수있을 것입니다하시기 바랍니다 경우 이 코드를 유형에 구속 된 프로 시저로 확장하려는 경우, 파생 된 d의 함수 결과의 구성 요소를 참조 할 수 없습니다 적절한 인터페이스가없는 ata 유형. 형식 선언을 module으로 제한하면 이러한 문제가 거의 발생하지 않습니다. module은 타입 바운드 프로 시저에 대한 올바른 인터페이스를 자동으로 생성합니다.

+4

서브 루틴'flow'에서'K_ELE_DETAILS'는 정수형 결과를 갖는 함수입니다 (코드가 완전하지 않습니다). 이는 암시 적 타이핑을 통해서입니다. – francescalus