최종 수정: 2025-10-06 읽기 약 14분
설정 파일 상세 설명
파일 구조 개요 (JSON v3.0)
JSON 설정 파일은 네 가지 주요 섹션으로 구성됩니다:
json
{
"version": "3.0", // 파일 형식 버전 (v3.0 권장)
"title": "...", // 시뮬레이션 제목
"description": "...", // 설명 (선택사항)
"id": "...", // 고유 식별자 (선택사항)
"reactorConfig": { ... }, // 반응기 형상 및 램프
"solverConfig": { ... }, // Solver 설정
"spatialFilter": { ... } // 관심 영역 (선택사항)
}섹션 1: 반응기 설정 (reactorConfig)
JSON v3.0에서 반응기 설정은 두 부분으로 나뉩니다:
lampSpecs: 램프 사양 정의 (재사용 가능한 템플릿)lampLayout: 램프 배치 정보 (lampSpecs 참조)
램프 사양 (lampSpecs)
reactorConfig.lampSpecs[] 램프 물리적 사양을 정의하며, 여러 위치에서 재사용할 수 있습니다:
| 매개변수 | 타입 | 단위 | 설명 |
|---|---|---|---|
id | 문자열 | - | 램프 사양 식별자 (필수) |
lampType | 문자열 | - | "lp" (저압) 또는 "mp" (중압) |
description | 문자열 | - | 램프 설명 (선택사항) |
power | 숫자 | 와트 (W) | 램프 입력 전력 |
eta | 숫자 | - | 램프 효율 (0-1), UV로 방출되는 에너지 비율 |
arcLength | 숫자 | 미터 (m) | 램프의 아크 길이 |
diameter | 숫자 | 미터 (m) | 램프 튜브의 외경 |
sleeveDia | 숫자 | 미터 (m) | 석영 슬리브의 외경 |
sleeveThickness | 숫자 | 미터 (m) | 석영 슬리브 두께 |
uvBands | 배열 | - | 파장대 정보 배열 |
램프 배치 (lampLayout)
reactorConfig.lampLayout[] 램프의 위치와 동작을 정의합니다:
| 매개변수 | 타입 | 단위 | 설명 |
|---|---|---|---|
lampId | 문자열 | - | 참조할 lampSpecs의 id |
dimming | 숫자 | - | 디밍 수준 (0-1), 1.0 = 최대 출력 |
position | 배열[3] | 미터 (m) | 중심 위치 [x, y, z] |
direction | 배열[3] | - | 램프 축 방향 벡터 [dx, dy, dz] (정규화됨) |
예제 (단일 램프):
json
"reactorConfig": {
"lampSpecs": [
{
"id": "LP150W",
"lampType": "lp",
"power": 150.0,
"eta": 0.35,
"arcLength": 0.8,
"diameter": 0.015,
"sleeveDia": 0.025,
"sleeveThickness": 0.002,
"uvBands": [
{ "lambda": 254, "waterRI": 1.33, "waterUVT": 0.95, "relativeEnergy": 1.0, "sleeveRI": 1.5, "sleeveUVT": 0.90, "gef": 1.0 }
]
}
],
"lampLayout": [
{ "lampId": "LP150W", "dimming": 1.0, "position": [0.0, 0.0, 0.0], "direction": [0.0, 0.0, 1.0] }
]
}예제 (동일 사양 다중 램프):
json
"reactorConfig": {
"lampSpecs": [
{
"id": "LP150W",
"lampType": "lp",
"power": 150.0,
"eta": 0.35,
"arcLength": 0.8,
"diameter": 0.015,
"sleeveDia": 0.025,
"sleeveThickness": 0.002,
"uvBands": [
{ "lambda": 254, "waterRI": 1.33, "waterUVT": 0.95, "relativeEnergy": 1.0, "sleeveRI": 1.5, "sleeveUVT": 0.90, "gef": 1.0 }
]
}
],
"lampLayout": [
{ "lampId": "LP150W", "dimming": 1.0, "position": [0.1, 0.0, 0.5], "direction": [0.0, 0.0, 1.0] },
{ "lampId": "LP150W", "dimming": 1.0, "position": [-0.1, 0.0, 0.5], "direction": [0.0, 0.0, 1.0] },
{ "lampId": "LP150W", "dimming": 0.8, "position": [0.0, 0.1, 0.5], "direction": [0.0, 0.0, 1.0] }
]
}참고사항:
position: 반응기 좌표계에서 각 램프의 중심점direction: 램프의 축방향 벡터 (반응기 좌표계 기준)eta: 일반적인 값: LP 램프 0.30-0.40, MP 램프 0.10-0.20dimming: 감광 시나리오에는 <1.0 사용
UV 파장대 설정 (uvBands)
lampSpecs[].uvBands[] 각 램프 사양에 파장대 정보를 포함합니다:
| 매개변수 | 타입 | 단위 | 설명 |
|---|---|---|---|
lambda | 숫자 | 나노미터 (nm) | 파장 |
waterRI | 숫자 | - | 해당 파장에서 물의 굴절률 |
waterUVT | 숫자 | - | 물의 UV 투과율 (0-1) |
relativeEnergy | 숫자 | - | 해당 파장에서 에너지의 비율 |
sleeveRI | 숫자 | - | 석영 슬리브의 굴절률 |
sleeveUVT | 숫자 | - | 슬리브의 UV 투과율 (0-1) |
gef | 숫자 | - | Germicidal Effectiveness |
중요: 모든 relativeEnergy 값의 합은 반드시 1.0이어야 합니다.
중요: 동일 에너지라도 파장에 따라 살균 효과가 다릅니다. gef 값은 소독 대상 물질에 따라 달라야 합니다.
단일 파장 예제 (254nm만):
json
"uvBands": [
{
"lambda": 254,
"waterRI": 1.33,
"waterUVT": 0.95,
"relativeEnergy": 1.0,
"sleeveRI": 1.5,
"sleeveUVT": 0.90,
"gef": 1.0
}
]다중 파장 예제 (VUV 램프, 185nm + 254nm):
json
"uvBands": [
{
"lambda": 185,
"waterRI": 1.485,
"waterUVT": 0.247,
"relativeEnergy": 0.04,
"sleeveRI": 1.575,
"sleeveUVT": 0.90,
"gef": 1.0
},
{
"lambda": 254,
"waterRI": 1.375,
"waterUVT": 0.98,
"relativeEnergy": 0.96,
"sleeveRI": 1.505,
"sleeveUVT": 0.98,
"gef": 1.0
}
]참고사항:
- LP 램프: 일반적으로 254nm에서 90-95%, 185nm에서 5-10%
- MP 램프: 넓은 스펙트럼을 모델링하기 위해 여러 대역 사용
waterUVT: 수질 테스트(UVT254 또는 흡광도)에서 측정gef: 특정 살균 효과 데이터가 없으면 1.0 사용
섹션 2: 솔버 설정 (solverConfig)
Solver는 아무런 값을 입력하지 않아도 기본값으로 작동합니다.
| 매개변수 | 타입 | 값 | 설명 |
|---|---|---|---|
radiationModel | 문자열 | "mpss" 또는 "msss" | 계산 방법 |
rootFindingMethod | 문자열 | "bisection" 또는 "brents" | 수치 솔버 |
relativeTolerance | 숫자 | 예: 1.0e-5 | 수렴 허용 오차 |
maxIteration | 정수 | 예: 50 | 최대 솔버 반복 횟수 |
lampSegmentation | 정수 | 예: 1000 | 램프 세그먼트 수 (높을수록 정확) |
numThreads | 정수 | 0 = 자동 | 병렬연산 스레드 수 (0은 자동 감지) |
enableShadowing | 불린 | true/false | 램프 간 차폐 계산 활성화 |
예제:
json
"solverConfig": {
"radiationModel": "mpss",
"rootFindingMethod": "brents",
"relativeTolerance": 1.0e-5,
"maxIteration": 50,
"lampSegmentation": 1000,
"numThreads": 0,
"enableShadowing": false
}권장사항:
- MPSS: 램프를 점으로 모델링. 램프 길이가 매우 짧은 경우.
- MSSS: 램프를 선으로 모델링. 대부분의 계산에 적합.
- lampSegmentation: 1000개 권장
- numThreads: 0 (자동)은 사용 가능한 모든 CPU 코어 사용
- enableShadowing: 램프의 개수가 많거나, 램프간 거리가 가까운 경우에 활성화
섹션 3: 공간 필터 (spatialFilter) - 선택사항
특정 영역으로 계산을 제한하여 시간 절약:
| 매개변수 | 타입 | 단위 | 설명 |
|---|---|---|---|
enabled | 불린 | - | 공간 필터링 활성화 |
xMin | 숫자 | 미터 | 최소 x 좌표 |
xMax | 숫자 | 미터 | 최대 x 좌표 |
yMin | 숫자 | 미터 | 최소 y 좌표 |
yMax | 숫자 | 미터 | 최대 y 좌표 |
zMin | 숫자 | 미터 | 최소 z 좌표 |
zMax | 숫자 | 미터 | 최대 z 좌표 |
예제:
json
"spatialFilter": {
"enabled": true,
"xMin": -0.1,
"xMax": 0.1,
"yMin": -0.1,
"yMax": 0.1,
"zMin": 0.0,
"zMax": 1.0
}사용 시기:
- 반응기 외에 유입/유출 파이프 라인 등이 모델링 되어 반응기 영역에만 관심이 있을 때
- 특정 영역에 초점을 맞춘 반복 설계
- 박스 외부의 포인트는 조사량 = 0
부록 A: 매개변수 빠른 참조
램프 설정
| 매개변수 | 타입 | 범위 | 일반적인 값 | 단위 |
|---|---|---|---|---|
| power | Real | > 0 | LP: 40-150, MP: 1000-5000 | W |
| eta | Real | 0-1 | LP: 0.30-0.40, MP: 0.10-0.20 | - |
| arcLength | Real | > 0 | 0.3-1.5 | m |
| diameter | Real | > 0 | 0.010-0.020 | m |
| dimming | Real | 0-1 | 1.0 (최대 출력) | - |
| sleeveDia | Real | > 0 | 0.020-0.030 | m |
| sleeveThickness | Real | ≥ 0 | 0.001-0.003 | m |
물/슬리브 특성
| 매개변수 | 타입 | 범위 | 일반적인 값 | 단위 |
|---|---|---|---|---|
| waterUVT | Real | 0-1 | 0.85-0.98 (254nm에서 cm당) | - |
| waterRI | Real | > 1 | 1.33 (254nm) | - |
| sleeveUVT | Real | 0-1 | 0.90-0.98 | - |
| sleeveRI | Real | > 1 | 1.5-1.6 (석영) | - |
솔버 설정
| 매개변수 | 타입 | 범위 | 권장 |
|---|---|---|---|
| lampSegmentation | int | 100-5000 | 1000 |
| maxIteration | int | 10-1000 | 50 |
| relativeTolerance | Real | 1e-8 ~ 1e-3 | 1e-5 |
| numThreads | int | 0-256 | 0 (자동) |
부록 B: JSON 템플릿 샘플 (v3.0)
템플릿 1: 단일 LP 램프
json
{
"version": "3.0",
"title": "단일 LP 램프 반응기",
"reactorConfig": {
"lampSpecs": [
{
"id": "LP150W",
"lampType": "lp",
"power": 150.0,
"eta": 0.35,
"arcLength": 0.8,
"diameter": 0.015,
"sleeveDia": 0.025,
"sleeveThickness": 0.002,
"uvBands": [
{
"lambda": 254,
"waterRI": 1.33,
"waterUVT": 0.95,
"relativeEnergy": 1.0,
"sleeveRI": 1.5,
"sleeveUVT": 0.90,
"gef": 1.0
}
]
}
],
"lampLayout": [
{
"lampId": "LP150W",
"dimming": 1.0,
"position": [0.0, 0.0, 0.5],
"direction": [0.0, 0.0, 1.0]
}
]
},
"solverConfig": {
"radiationModel": "mpss",
"rootFindingMethod": "brents",
"relativeTolerance": 1.0e-5,
"maxIteration": 50,
"lampSegmentation": 1000,
"numThreads": 0,
"enableShadowing": false
}
}템플릿 2: 다중 파장 램프 (VUV/UV)
json
{
"version": "3.0",
"title": "185nm 및 254nm LP 램프",
"reactorConfig": {
"lampSpecs": [
{
"id": "LP_VUV_UV",
"lampType": "lp",
"power": 150.0,
"eta": 0.35,
"arcLength": 0.8,
"diameter": 0.015,
"sleeveDia": 0.025,
"sleeveThickness": 0.002,
"uvBands": [
{
"lambda": 185,
"waterRI": 1.485,
"waterUVT": 0.25,
"relativeEnergy": 0.04,
"sleeveRI": 1.575,
"sleeveUVT": 0.90,
"gef": 1.0
},
{
"lambda": 254,
"waterRI": 1.33,
"waterUVT": 0.95,
"relativeEnergy": 0.96,
"sleeveRI": 1.5,
"sleeveUVT": 0.90,
"gef": 1.0
}
]
}
],
"lampLayout": [
{
"lampId": "LP_VUV_UV",
"dimming": 1.0,
"position": [0.0, 0.0, 0.5],
"direction": [0.0, 0.0, 1.0]
}
]
},
"solverConfig": {
"radiationModel": "mpss",
"rootFindingMethod": "brents",
"relativeTolerance": 1.0e-5,
"maxIteration": 50,
"lampSegmentation": 1000,
"numThreads": 0,
"enableShadowing": false
}
}템플릿 3: 다중 램프
json
{
"version": "3.0",
"title": "MSSS로 빠른 계산",
"reactorConfig": {
"lampSpecs": [
{
"id": "LP150W",
"lampType": "lp",
"power": 150.0,
"eta": 0.35,
"arcLength": 0.8,
"diameter": 0.015,
"sleeveDia": 0.025,
"sleeveThickness": 0.002,
"uvBands": [
{
"lambda": 254,
"waterRI": 1.33,
"waterUVT": 0.95,
"relativeEnergy": 1.0,
"sleeveRI": 1.5,
"sleeveUVT": 0.90,
"gef": 1.0
}
]
}
],
"lampLayout": [
{
"lampId": "LP150W",
"dimming": 1.0,
"position": [0.0, 0.0, 0.5],
"direction": [0.0, 0.0, 1.0]
},
{
"lampId": "LP150W",
"dimming": 1.0,
"position": [0.1, 0.0, 0.5],
"direction": [0.0, 0.0, 1.0]
}
]
},
"solverConfig": {
"radiationModel": "msss",
"rootFindingMethod": "brents",
"relativeTolerance": 1.0e-4,
"maxIteration": 30,
"lampSegmentation": 500,
"numThreads": 0,
"enableShadowing": false
}
}