Skip to content

사용자정의 지반모델 (User Supplied Soil Material) Home > GTS NX > Appendix > USSM(사용자정의 지반모델)


개요

  • 사용자 정의 지반 재료 모델을 FORTRAN으로 구현하여, DLL로 빌드하면 GTS NX에서 사용할 수 있습니다.
  • 사용자 정의 지반 재료 모델은 이전 스텝의 수렴된 응력과 상태 변수 및 현재 스텝의 변형률/시간 증분을 입력받아 현재 스텝의 응력과 상태 변수를 계산해야 합니다.

방법

서브루틴


    SUBROUTINE User_Mod (
    JOB, MODEL, UNDRAINED, STEPNUMBER, ITERNUMBER, ELEMNUMBER, 
    INTEGNUMBER, X, Y, Z, T0, DT, USRVAL, SIG0, PP0, 
    USRSTA0, DEPS, SE, BULKWATER, SIG, PP, USRSTA, PLASTICSTATUS, NUS, 
    NONSYM, STRESSDEP, TIMEDEP, TANGENT, 
    PROJECTDIRECTORY, PROJECTLENGTH, ERROR )

매개변수 내용
JOB (정수, 입력) Job 번호
1 = 상태 변수 초기화
2 = 유효 응력 계산
3 = 유효 재료 강성 행렬 계산
4 = 상태 변수 개수 반환
5 = 행렬 특성 반환 (NONSYM, STRESSDEP, TIMEDEP, TANGENT)
MODEL (정수, 입력) 사용자가 정의한 지반 재료 번호
UNDRAINED (정수, 입력) 배수 조건 (UNDRAINED = 0), 비배수 조건 (UNDRAINED = 1)
STEPNUMBER (정수, 입력) 현재 계산 스텝 번호
ITERNUMBER (정수, 입력) 현재 이터레이션 번호
ELEMNUMBER (정수, 입력) 현재 요소 번호
INTEGNUMBER (정수, 입력) 더미 변수
X, Y, Z (실수, 입력) 현재 적분점의 글로벌 좌표
T0 (실수, 입력) 현재 스텝 시작 시간
DT (실수, 입력) 현재 스텝의 증분 시간
USRVAL (실수 배열, 입력) 사용자 정의 재료의 파라미터 배열 (1-50)
SIG0 (실수 배열, 입력) 현재 적분점에서 이전 스텝에 수렴한 유효 응력 및 다른 값
\(\sigma^{'0}_{xx}, \sigma^{'0}_{yy}, \sigma^{'0}_{zz}, \sigma^{'0}_{xy}, \sigma^{'0}_{yz}, \sigma^{'0}_{zx}, P_{steady}\)
(2D인 경우, \(yz, zx\) 성분은 0)
PP0 (실수, 입력) 더미 변수
USRSTA0 (실수 배열, 입력/출력) 현재 적분점에서 이전 스텝에 수렴한 상태 변수 배열 (1-NUS)
(JobID가 1인 경우에만 출력, 그 이외에는 입력)
DEPS (실수 배열, 입력) 현재 적분점에서 현재 스텝의 변형율 증분량 및 이전 스텝에 수렴한 변형율
\(\Delta\epsilon_{xx}, \Delta\epsilon_{yy}, \Delta\epsilon_{zz}, \Delta\gamma_{xy}, \Delta\gamma_{yz}, \Delta\gamma_{zx}, \epsilon^0_{xx}, \epsilon^0_{yy}, \epsilon^0_{zz}, \gamma^0_{xy}, \gamma^0_{yz}, \gamma^0_{zx}\)
(2D인 경우, \(yz, zx\) 성분은 0)
SE (실수 배열, 출력) 현재 적분점에서 유효 재료 강성 행렬
BULKWATER (실수, 입력) 더미 변수
SIG (실수 배열, 출력) 현재 적분점에서 유효 응력
\(\sigma'_{xx}, \sigma'_{yy}, \sigma'_{zz}, \sigma'_{xy}, \sigma'_{yz}, \sigma'_{zx}\)
(2D인 경우, \(yz, zx\) 성분은 0)
PP (실수, 출력) 더미 변수
USRSTA (실수 배열, 입력) 현재 적분점에서 계산된 상태 변수 배열 (1-NUS)
PLASTICSTATUS (정수, 출력) 소성 지표
0 = 소성 아님
1 = Mohr-Coulomb
2 = 인장 cut-off
3 = 캡 하드닝
4 = 캡 프릭션
5 = 프릭션 하드닝
NUS (정수, 출력) 상태 변수 개수
NONSYM (정수, 출력) 재료 강성 행렬이 비대칭(NONSYM = 1), 대칭(NONSYM = 0)
STRESSDEP (정수, 출력) 더미 변수. 재료 강성 행렬이 항상 응력에 의존적이라고 가정한다.
TIMEDEP (정수, 출력) 더미 변수. 재료 강성 행렬이 항상 시간에 의존적이라고 가정한다.
TANGENT (정수, 출력) 더미 변수. 재료 강성 행렬이 항상 뉴튼-랩슨 법에서 사용되는 접선 강성이라고 가정한다.
PROJECTDIRECTORY (정수 배열, 입력) 더미 변수
PROJECTLENGTH (정수, 입력) 더미 변수
ERROR (정수, 출력) 사용자 정의 모델에서 계산이 실패한 경우 (ERROR=1)

예제 의사 코드

1. 상태 변수 초기화


    USRSTA0(1) = (SIG0(1) + SIG0(2) + SIG0(3))/3.D0

2. 유효 응력 계산


    DO I = 1, 6

        DO J = 1, 6

           SIG(I) = SIG(I) + SE(I, J) * DEPS(J)

        ENDDO

    ENDDO

3. 유효 재료 강성 행렬 계산


    E = USRVAL(1)

    V = USRVAL(2)

    G = E/2/(1.0+V)

    FAC = 2*G/(1.0-2*V)

    VAL1 = FAC*(1-V)

    VAL2 = FAC*V



    SE = 0.0

    SE(1,1) = VAL1

    SE(1,2) = VAL2

    SE(1,3) = VAL2

    SE(2,1) = VAL2

    SE(2,2) = VAL1

    SE(2,3) = VAL2

    SE(3,1) = VAL2

    SE(3,2) = VAL2

    SE(3,3) = VAL1

    SE(4,4) = G

    SE(5,5) = G

    SE(6,6) = G


4. 상태 변수 개수 반환


    NUS = 1

5. 행렬 특성 반환(NONSYM, STRESSDEP, TIMEDEP, TANGENT)


    NONSYM = 1

    STRESSDEP = 1

    TIMEDEP = 1

    TANGENT = 1

보조 서브루틴

  • dll 파일에 포함된 모델의 개수/이름과 파라미터 개수/이름/단위를 가져오는 함수.

    
        SUBROUTINE GETMODELCOUNT( NMODEL )

        IMPLICIT NONE
    
        INTEGER (KIND=4) NMODEL
    
        !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE ::GETMODELCOUNT
    
        NMODEL = 1
    
        RETURN
    
    END ! GETMODELCOUNT
    
    SUBROUTINE GETMODELNAME( MODEL , MODELNAME )
    
        IMPLICIT NONE
    
        INTEGER, INTENT(IN) :: MODEL
    
        CHARACTER (LEN= * ) MODELNAME
    
        CHARACTER (LEN=255) TNAME
    
        INTEGER LT
    
        !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE ::  GETMODELNAME
    
        SELECT CASE (MODEL)
    
        CASE(1)
    
            TNAME = 'ELASTIC'
    
            LT = LEN_TRIM(TNAME)
    
            MODELNAME= CHAR(LT) // TNAME(1:LT)
    
        END SELECT ! MODEL
    
        RETURN
    
    END ! GETMODELNAME
    
    SUBROUTINE GETPARAMCOUNT( MODEL , NVAL )
    
        IMPLICIT NONE
    
        INTEGER  MODEL, NVAL
    
        !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE ::  GETPARAMCOUNT
    
        NVAL = 2
    
    END ! GETPARAMCOUNT
    
    SUBROUTINE GETPARAMNAME( MODEL, PARAM, PARAMNAME )
    
        IMPLICIT NONE
    
        INTEGER, INTENT(IN) :: MODEL
    
        INTEGER, INTENT(IN) :: PARAM
    
        CHARACTER (LEN= * ) PARAMNAME
    
        CHARACTER (LEN=255) TNAME
    
        INTEGER LT
    
        !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE ::  GETPARAMNAME
    
        SELECT CASE (MODEL)
    
        CASE(1)
    
            SELECT CASE (PARAM)
    
            CASE (1)
    
            TNAME = 'E'
    
            CASE (2)
    
            TNAME = 'NU'
    
            END SELECT ! PARAM
    
        END SELECT ! MODEL
    
        LT = LEN_TRIM(TNAME)
    
        PARAMNAME= CHAR(LT) // TNAME(1:LT)
    
        RETURN
    
    END ! GETPARAMNAME
    
    SUBROUTINE GETPARAMUNIT( MODEL, PARAM, PARAMUNIT )
    
        IMPLICIT NONE
    
        INTEGER, INTENT(IN) :: MODEL
    
        INTEGER, INTENT(IN) :: PARAM
    
        CHARACTER (LEN= * ) PARAMUNIT
    
        CHARACTER (LEN=255) TNAME
    
        INTEGER LT
    
        !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, REFERENCE ::  GETPARAMUNIT
    
        SELECT CASE (MODEL)
    
        CASE(1)
    
            SELECT CASE (PARAM)
    
            CASE (1)
    
            TNAME = 'F/L^2#'
    
            CASE (2)
    
            TNAME = ''
    
            END SELECT ! PARAM
    
        END SELECT ! MODEL
    
        LT = LEN_TRIM(TNAME)
    
        PARAMUNIT= CHAR(LT) // TNAME(1:LT)
    
        RETURN
    
    END ! GETPARAMUNIT
    

최종 수정일: 2026-01-21