본문 바로가기
자료분석 및 코딩/파이썬

[조화분해] 파이썬을 활용한 조화분해(harmonic analysis) - 3. 조류조화분해

by 아다콘다 2025. 1. 17.
반응형

 파이썬의 t-tide와 조위관측정보를 활용하여 조화분해를 한 이전 글에 이어서, 이번에는 해수유동 관측정보를 활용한 조류 조화분해 방법에 대해 소개해보도록 하겠다. 조화분해와 관련된 기초지식 및 방법에 대한 내용은 아래 링크를 참고하면 된다.

 

조화분해 개요

 

[조화분해] 파이썬을 활용한 조화분해(harmonic analysis) - 1. 조화분해란

오랜만에 본업으로 돌아와, 이번에는 조화분해에 대해 알아보도록 하겠다. 학위과정 중에는 matlab의 t-tide를 주로 이용했었는데, matlab을 활용할 수 있는 여건이 되는 기업들은 많지 않다. 파이썬

ihatenumber.tistory.com

 

 

t-tide 사용

 

[조화분해] 파이썬을 활용한 조화분해(harmonic analysis) - 2. t-tide 조화분해 하기

지난 글에 조화분해에 대해 간략하게 설명하였고, 이번에는 실제 데이터와 t-tide를 활용하여 조화분해를 해보도록 하겠다.조화분해개요 [조화분해] 파이썬을 활용한 조화분해(harmonic analysis) - 1.

ihatenumber.tistory.com

 

 

유향/유속, U/V변환

 

[파이썬] 유속, 풍속(speed) & 유향, 풍향(degree)의 U, V 변환

조류조화분해를 진행하기에 앞서 유속과 유향값을 U, V로 변환하는 법에 대해 알아보도록 하겠다. 관측을 통해 얻은 해수유동 값은 보통 유속과 유향으로 표기된다. 해수유동(조류) 값은 크기와

ihatenumber.tistory.com

 

 

 


 | 조류 조화분해 개요

 조류는 조석에 의한 물의 수평이동이다. 조석현상으로 해수의 높이가 오르락 내리락하면서 물이 높은 곳에서 낮은 곳으로 이동하는 수평적인 해수의 흐름으로 아래 그림을 참고하여 이해하면 된다. 해수의 수평적인 이동은 조류와 해류가 있는데 해류는 전지구적인 대기의 대순환, 바람과 해수의 밀도차에 의해 생기는 물의 흐름으로 일정한 방향으로 계속 흐르는 흐름이지만, 조류는 조석에 의해 움직이는 수평적인 흐름으로 일정 주기를 따라 유속과 유향이 변한다. 

 

조석과 조류의 움직임조석과 조류의 움직임
조석과 조류의 움직임

  • 조류 : 조석에 의한 해수의 수평적인 흐름. 일정 주기를 따라 유속과 유향이 변함 
  • 해류 : 전지구적 대기 순환, 바람과 해수의 밀도차에 의한 일정한 흐름. 

 

 따라서, 조류는 조석과 마찬가지로 일정한 주기를 가지고 있기 때문에 조화분해가 가능하다. 해수유동 관측정보에서 일정 주기를 가진 성분들만 추출해내면 조류가 되고, 일정 주기를 가진 성분을 제외한 일정한 방향의 나머지 흐름(잔차)은 해류로 볼 수 있다.

 

 

 


| 해수유동 관측정보

 조위정보와 마찬가지로 국립해양조사원 바다누리 해양정보 서비스에 접속하면 해수유동 정보의 수집이 가능하다. 이전에 조석조화분해를 진행한 인천 조위관측소 인근에 위치한 인천항 해양관측부이의 해수유동 정보를 활용하였다. 아래 그림의 관측정보를 보면 알 수 있듯이, 해수유동 정보는 유속과 유향으로 되어 있다. 조류조화분해를 위해서는 유속과 유향을 U(동-서 방향의 유속), V(남-북 방향의 유속)의 스칼라 값으로 변환해줘야 한다. 방법은 글 상단에 링크를 걸어 둔 '유속/유향 U/V 변환' 글을 참고하면 된다.

 

해수유동 관측정보
해수유동 관측정보

 

 


| t-tide 조류조화분해

 조류조화분해를 위한 t_tide 사용법은 조석조화분해와 동일하다. 단, 조석은 조위값만 넣어주면 되지만 조류는 U, V값으로 나누어져있기 때문에 U, V를 복소수형태의 단일 값으로 변환해줘야 한다. t_tide 코드를 보면, 아래 그림과 같이 U, V를 complex(복소수) 형태인 U+1j * V로 넣어주면 된다고 명시되어 있다.

t_tide 내 입력변수 형식(복소수)
t_tide 내 입력변수 형식(복소수)

 

 복소수 형태로 변환하는 것은 간단하다. 파이썬 내의 complex함수를 이용해서 complex(U,V)로 입력하면 된다. 그런 다음 t_tide를 실행시킬 때 변환한 complex값을 넣어주면 된다. 아래 코드를 참고하면 될 것 같다. 대부분의 코드는 이전 조석조화분해 코드와 동일하다.

 

## data read ##
path = '원본정보 파일 경로'
fname = 'current_icp_202411.txt' ##(조류정보 파일 이름)
t_data = pd.read_csv(path + '/' + fname, sep='\t', header=3, encoding='cp949') ##조류정보 read

# 변수명 수정
aaa = t_data.columns
t_data.rename(columns={aaa[0]:'otime', aaa[1]:'speed', aaa[2]:'deg_t', aaa[3]:'degree'},inplace=True)

# 텍스트 형태의 시간 datetime으로 변환
t_time = [datetime.datetime.strptime(t_data.otime[i],'%Y/%m/%d %H:%M:%S') for i in range(len(t_data))]

# 빈 값을 nan값 처리하며 유속값 추출
t_spd = pd.to_numeric(t_data.speed,errors='coerce')

# 유속값 numpy 행렬로 변환
t_spd2 = np.array(t_spd).astype(float)

# 유향값 numpy 행렬로 변환
t_dir = pd.to_numeric(t_data.degree,errors='coerce')

# 유향 기준 직교좌표계로 변환
t_dir2 = np.array(t_dir).astype(float)*-1+90

# 유속 유향 -> U, V로 변환
t_u = [math.cos(np.deg2rad(t_dir2[i]))*t_spd2[i] for i in range(len(t_dir2))]
t_v = [math.sin(np.deg2rad(t_dir2[i]))*t_spd2[i] for i in range(len(t_dir2))]

# U, V 복소수 형태로 변환
t_comx = [complex(t_u[i],t_v[i]) for i in range(len(t_dir2))]

# 복소수형태의 UV를 numpy 행렬로 변환
t_comx2 = np.array(t_comx)

# 조류 조화분해 (원본정보 시간간격이 10분임)
hm_result = t_tide(t_comx2, dt=1/6, stime=t_time[0], lat=37.451944)

 

그럼 아래 그림과 같이 조화분해 결과가 출력되는 것을 확인할 수 있다.

파이썬 t_tide 조류조화분해 결과
파이썬 t_tide 조류조화분해 결과

 

t_predic을 활용하면 출력된 조화상수로 조류정보를 생성할 수 있다. 위와 마찬가지로 조석조류정보의 코드와 동일하다. 조화분해 결과로 나온 상수값들을 넣어주면 된다. 단 생성되는 결과물도 입력한 타임시리즈와 마찬가지로 복소수형태이다. 따라서 결과값의 실수부와 허수부를 각각 U, V로 따로 추출해야한다. 실수부는 N.real, 허수부는 N.imag이며, 이를 각각 U, V로 저장해주면 된다.

nameu = hm_result['nameu']
xout = hm_result['xout']
fu = hm_result['fu']
tidecon = hm_result['tidecon']
xres = hm_result['xres']


prdtime = np.array(t_time, dtype='datetime64')
tprd = t_predic(prdtime, nameu, fu, tidecon, lat=37.4519, ltype='nodal', synth=0)


tprd_u = [tprd[i].real for i in range(len(tprd))]
tprd_v = [tprd[i].imag for i in range(len(tprd))]

 

그럼 아래 왼쪽과 같이 조류정보(U, V)가 생산되는 것을 확인할 수 있다. 오른쪽 그림은 조류조화분해에 활용된 원본정보이다. 오른쪽 그림에서 해류나 잔차 성분이 제거되고 nan값이 보간되었다고 보면 될 것 같다.

조류 예측정보와 해수유동 원본 정보

반응형