사용자정의 지반모델 (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