CST를 활용한 메타표면 설계 및 시뮬레이션: 이상 반사, 메타렌즈 및 OAM 구현

CST를 활용한 메타표면 설계 및 시뮬레이션: 이상 반사, 메타렌즈 및 OAM 구현

메타표면(Metasurface)은 인공적으로 설계된 아주 얇은 구조 배열로, 입사되는 전자기파의 위상, 진폭, 편광을 자유롭게 조절할 수 있습니다. 이를 통해 이상 반사, 이상 투과(EOT), 메타렌즈 구현, 그리고 OAM(궤도 각 운동량) 보텍스 빔 생성과 같은 복잡한 전자기파 조작이 가능해집니다. 본 글에서는 CST Studio Suite를 활용하여 이러한 메타표면을 설계하고 시뮬레이션하는 방법과 실무적인 스크립트 활용법을 다룹니다.

1. 단위 셀(Unit Cell) 모델링 및 경계 조건 설정

메타표면 전체 배열을 시뮬레이션하기 전에, 단일 주기 단위 셀(Unit Cell)의 특성을 먼저 분석해야 합니다. CST에서는 Floquet 포트와 주기 경계 조건(Periodic Boundary)을 설정하여 무한 배열 환경을 모사할 수 있습니다. Python을 활용하여 기본 단위 셀을 구성하는 스크립트는 다음과 같이 작성할 수 있습니다.

import win32com.client
import math

# CST 애플리케이션 객체 생성 및 프로젝트 초기화
cst_engine = win32com.client.Dispatch('CSTStudio.Application')
active_proj = cst_engine.NewProject()
geometry_builder = active_proj.Modeler
env_config = active_proj.BoundaryConditions

geometry_builder.DeleteAll()

# 파라미터 정의 (단위: mm)
spacing = 10.0
substrate_h = 0.5
patch_t = 0.05

# 기판 생성
geometry_builder.AddBox([0, 0, 0], [spacing, spacing, substrate_h])

# 정사각형 금속 패치 생성 (초기 크기 4mm)
init_patch_len = 4.0
center = spacing / 2
geometry_builder.AddRectangle(
    [center - init_patch_len/2, center - init_patch_len/2, substrate_h],
    [center + init_patch_len/2, center + init_patch_len/2, substrate_h + patch_t]
)

# x, y축 주기 경계 조건 및 Floquet 포트 설정 (상하 입사)
env_config.SetPeriodicBoundary(1, 0, 0, spacing, spacing)
env_config.SetFloquetPort(1, [0, 0, -1], [0, 0, 1])

2. 이상 반사(Anomalous Reflection)와 위상 분석

일반적인 반사는 입사각과 반사각이 동일하지만, 메타표면은 각 단위 셀의 위상을 급변시켜 반사파를 임의의 각도로 굴절시킬 수 있습니다(일반화된 스넬 법칙). 설계를 위해서는 각 패치 크기에 따른 반사 위상을 스캔해야 합니다. 아래는 CST VBA 매크로를 이용해 주파수 별 S11 위상을 추출하는 코드입니다.

' 반사 위상 데이터를 파일로 내보내는 매크로
Sub ExtractPhaseResponse()
    Dim sweep_freq As Double
    Dim s11_real As Double, s11_imag As Double
    Dim unwrapped_phase As Double
    
    Open "phase_sweep_data.txt" For Output As #1
    
    ' 9.5GHz ~ 10.5GHz 주파수 스윕
    For sweep_freq = 9.5 To 10.5 Step 0.05
        active_proj.Frequency = sweep_freq * 1e9
        active_proj.StartSimulation
        
        s11_real = active_proj.GetSParameterReal(1,1)
        s11_imag = active_proj.GetSParameterImag(1,1)
        
        ' Atn2 함수를 사용하여 연속적인 위상 계산 (-180 ~ 180 도 점프 방지)
        unwrapped_phase = Atn2(s11_imag, s11_real) * 180 / 3.14159
        Print #1, sweep_freq & " " & unwrapped_phase
    Next sweep_freq
    
    Close #1
End Sub

3. 이상 투과(Extraordinary Optical Transmission, EOT)

아파장 금속 구멍은 본질적으로 투과율이 매우 낮지만, 메타표면 구조를 결합하면 투과율을 획기적으로 높일 수 있습니다. 시뮬레이션 시 하부에서 입사시키고 상부에서 투과파를 측정하도록 Floquet 포트 방향을 반전시킨 뒤 S21 파라미터를 확인하면 됩니다. 단, 정확한 투과율을 얻으려면 메쉬(Mesh)를 충분히 조밀하게 설정해야 합니다.

4. 메타렌즈(Metalens) 배열 생성

메타렌즈는 평행파를 한 점으로 수렴시키기 위해 포물선 형태의 위상 분포를 가집니다. 이를 구현하기 위해 위치마다 필요한 위상 보상값을 계산하고, 이에 대응하는 패치 크기를 배치해야 합니다. 다음 Python 코드는 배열 전체의 단위 셀을 자동으로 생성합니다.

import math

# 렌즈 설계 변수
aperture = 100.0
unit_gap = 10.0
focus_len = 200.0
lambda_free = 0.03  # 10GHz 파장

# 위상에 따른 패치 크기 반환 (이전 시뮬레이션 데이터로 피팅되었다고 가정)
def map_phase_to_dimension(phase_val):
    return 2.0 + (phase_val / (2 * math.pi)) * 4.0

# 2D 그리드 순회하며 패치 생성
for x_pos in range(-int(aperture/2), int(aperture/2), int(unit_gap)):
    for y_pos in range(-int(aperture/2), int(aperture/2), int(unit_gap)):
        # 필요한 위상 보상량 계산
        radial_dist = math.sqrt(x_pos**2 + y_pos**2)
        target_phase = 2 * math.pi * (focus_len - math.sqrt(radial_dist**2 + focus_len**2)) / lambda_free
        
        # 위상을 0~2pi로 정규화 후 패치 크기 도출
        patch_dim = map_phase_to_dimension(target_phase % (2 * math.pi))
        
        # 패치 배치
        center_x = x_pos + (unit_gap - patch_dim) / 2
        center_y = y_pos + (unit_gap - patch_dim) / 2
        geometry_builder.AddRectangle(
            [center_x, center_y, 0.5],
            [center_x + patch_dim, center_y + patch_dim, 0.55]
        )

5. OAM 보텍스 빔 생성

OAM(궤도 각 운동량) 파는 나선형 위상면을 가지며, 위상이 방위각(azimuthal angle)에 비례합니다. 위상 분포 식은 φ = l * θ (l은 위상 분포 상수)로 표현됩니다. 메타표면의 각 위치에서 방위각을 구하고, 해당하는 위상을 가지는 셀을 배치하면 됩니다.

# OAM 위상 배열 생성 (위상 분포 상수 l = 2)
topological_charge = 2

for x_pos in range(-int(aperture/2), int(aperture/2), int(unit_gap)):
    for y_pos in range(-int(aperture/2), int(aperture/2), int(unit_gap)):
        # 방위각 theta 계산
        azimuth = math.atan2(y_pos, x_pos)
        
        # 위상 계산 및 패치 크기 매핑
        oam_phase = topological_charge * azimuth
        patch_dim = map_phase_to_dimension(oam_phase % (2 * math.pi))
        
        # 구조 배치
        center_x = x_pos + (unit_gap - patch_dim) / 2
        center_y = y_pos + (unit_gap - patch_dim) / 2
        geometry_builder.AddRectangle(
            [center_x, center_y, 0.5],
            [center_x + patch_dim, center_y + patch_dim, 0.55]
        )

시뮬레이션 후 원거리 장(Far-field) 분포를 확인하면 도넛 형태의 보텍스 빔 프로파일을 확인할 수 있습니다.

6. 시뮬레이션 시 주의사항

CST의 메쉬 설정은 시뮬레이션 정확도에 지대한 영향을 미칩니다. 자동 메쉬 옵션만 사용할 경우, 얇은 금속 패치의 위상이 부정확하게 계산될 수 있습니다. 따라서 금속 패치 부분의 로컬 메쉬(Local Mesh)를 1mm 이하로 수동 설정하는 것이 좋습니다. 또한, 기판(Substrate) 모델에 올바른 유전율(Dielectric constant) 손실 정수를 할당하지 않으면 전파가 완전 반사되는 등 비현실적인 결과가 발생할 수 있으므로 재질 속성 할당을 반드시 확인해야 합니다.

태그: CST Studio Suite 메타표면 파이썬 자동화 VBA 전자기파 시뮬레이션

8월 18일 02:08에 게시됨