본문 바로가기
자료분석 및 코딩/기타 해양, 기상 정보 및 분석툴

[기타 - 쉘] 해양수치모델 하이컴 다운로드 3 - 과거 자료 다운로드 자동화

by 아다콘다 2023. 8. 16.

 지난글에서는 하이컴 모델 예측자료를 자동으로 다운로드할 수 있는 방법에 대해 설명하고 스크립트를 작성해보았다(아래 링크). 하지만 실질적으로 예측정보를 사용하는 일은 많지 않고, 업무적으로나 연구적으로나 과거정보를 활용하는 경우가 더 많다. 따라서 오늘은 과거자료를 수집하는 스크립트에 대해 작성해보려 한다.

https://ihatenumber.tistory.com/97

 

[기타 - 쉘] 해양수치모델 하이컴 다운로드 2 - 스크립트를 활용한 자동 다운로드. 쉘, wget, crontab

이번에는 지난글에 이어, 스크립트를 통해 하이컴 정보를 수집하는 방법에 대해 소개해보도록 하겠다. 웹페이지에서 바로 다운로드 받는 방법은 짧은 자료나 단기적으로 자료를 활용할 때는 편

ihatenumber.tistory.com

 

1. 기간별 모델명 및 버전 확인

 현재 서비스되고 있는 하이컴 모델은 GOFS 3.1로 2014년부터 정보를 생산해왔다. 또한, 그 이후에도 수치모델이 업데이트되며 세부 모델명 및 버전명이 계속 업데이트 되고 있다. 따라서, 다운로드 스크립트를 짤 때는 기간에 따라 다른 모델명 및 버전명을 입력해줘야 한다. 하이컴 모델 다운로드 페이지에 가보면, 아래 사진과 같이 세부 모델 및 버전에 따른 정보 기간을 확인할 수 있다. 사용자가 받으려는 자료의 날짜와 모델, 버전명을 확인해둬야 한다.

 현재 서비스 중인 모델인 GOFS 3.1은 1994년 이후의 정보를 제공하고 있으며, 오늘은 이 GOFS 3.1만 다뤄보도록 하겠다. 일단 각 세부 모델명과 버전명, 기간등을 확인해보면, GLBv와 GLBu, GLBy로 구분되고 있으며, 버전명은 expt_53.X / 56.3 / 57.2 / 92.8 / 57.7 / 92.9 / 93.0 등으로 나뉘어 있다. 물론 각 버전마다 중복되는 기간이 있지만 최근 버전을 기준으로 기간에 따라 나눠보면, 아래와 같이 8개의 구간으로 나눌 수 있다.

  • 1. 2016년 이전 : 'GLBv0.08', 'expt_53.X'
  • 2. 2015.12.31~2016.04.30 : 'GLBv0.08', 'expt_56.3'
  • 3. 2016.05.01~2017.01.31 : 'GLBv0.08', 'expt_57.2'
  • 4. 2017.02.01~2017.05.31 : 'GLBv0.08', 'expt_92.8'
  • 5. 2017.06.01~2017.09.30 : 'GLBv0.08', 'expt_57.7'
  • 6. 2017.10.01~2017.12.31 : 'GLBv0.08', 'expt_92.9'
  • 7. 2018.01.01~2018.12.31 : 'GLBv0.08', 'expt_93.0'
  • 8. 2019년 이후 : 'GLBy0.08', 'expt_93.0'

따라서, 본인이 받으려는 날짜에 따라 위 세부모델 및 버전명으로 스크립트를 수정하면 된다. 아래 이전 글에서 작성했던 스크립트를 보면, wget 주소의 세부 모델명과 버전명을 변수화해서 작성했는데, 이처럼 과거 정보를 받을 때, 쉽게 수정하기 위함이다. 빨간 박스의 변수만 수정해주면 된다.

 

2. 장기간 데이터 다운로드

 만약 여러 버전을 포함하는 장기간을 수집할 때는, 해당 날짜에 따라 변수명을 변경하여 다운로드 할 수 있도록 조건문으로 스크립트를 짜면 된다. 위 스크립트는 일별로 자료를 잘라서 받기 때문에 버전명만 바꿔서 실행하면 큰 오류없이 다운로드가 가능하다. GOFS 3.1 에서의 기간은 위에 적어놓았듯이 총 8가지로 구분할 수 있고, 이를 if문으로 적절히 조건을 걸어주면 된다.

 

2.1 쉘스크립트 if문

 이에 앞서 쉘스크립트에서의 if문 사용법을 알아야하는데 이는 나중에 자세히 올려보도록 하고, 오늘은 사용하는 문법 및 옵션에 대해서만 간단히 남겨보도록 하겠다. 쉘스크립트에서의 if문은 코드처럼 사용한다.

if [조건] ; then
	"실행문"
else 또는 elif
	"실행문"
fi

 매트랩 또는 파이썬과 거의 유사하며, 조건문을 종료할 때는 'fi'를 입력해줘야 한다.

 

 조건은 입력날짜가 기준날짜보다 이전이거나 이후거나로 걸면되는데 날짜는 yyyymmdd 8글자의 숫자로 입력하기 때문에 기준날짜보다 작거나 크거나로 조건을 입력하면 된다. 예를들어 1번 경우인 "2016년 이전의 자료일 때" 를 조건으로 걸려면, [ 날짜 -le 20151231 ] 과 같이 걸면 된다. 여기서 le(little or equal)는 작거나 같다는 의미이며, 2016년 이전의 날짜들을 8자리 yyyymmdd 숫자로 표현했을때, 20151231보다는 작기 때문에 이와 같이 조건을 걸면 된다.

 2번의 경우인 2015.12.31 ~ 2016.04.30의 기간은 20151230보다는 크고 20160430보다는 작거나 같다로 조건을 걸면 되는데, 이는  [ 날짜 -gt 20151230 ] && [ 날짜 -le 20160430 ] 와 같이 걸면 된다. 마찬가지로 -gt(greater) 는 크다는 조건이며, &&는 'and', '그리고' 의 의미이다.

 오늘 작성할 스크립트의 if문은 이정도만 알면 되고, 크기를 비교하는 조건문 문법은 아래 표에 나타내었다.

의미 표현문법 부등식 의미
크다 A - gt B A > B
크거나 같다 A - ge B A >= B
작다 A - lt B A < B
작거나 같다 A - le B A <= B
같다 A - eq B A == B
같지 않다. A - ne B A ~= B

 

2.2. if문 구성

 위에서 조건문을 쓰는 법에 대해 간략히 나타내었고, 이제 전체 if문을 구성해야 한다. if와 else elif로 각 case별로 나누면 된다. GOFS 3.1의 전체기간은 크게 2016년 이전과 이후, 2가지로 나눌 수 있고, 2016년 이후는 각 버전에 따라 세부 경우의 수로 나눌 수 있다. 따라서, if와 else로 2016년 이전/이후를 나누고 else의 하위 구문에서 세부 기간을 나누면 된다. 전체적인 구성은 아래와 같이 작성하면 된다.

if 1. 2016년 이전
	실행문
else
	if 2. 세부기간1
    	실행문
	elif 3. 세부기간2
    	실행문
	elif 4. 세부기간3
    	실행문
        ....
	else 8. 세부기간7
    	실행문
fi

 

 세부기간은 위에 상세 모델명과 버전명과 같이 적어 놓았으며, 실행문에는 각 case별 모델명과 버전명 그리고 wget 명령문을 적어주면 된다. 그렇게 전체 스크립트를 완성하면 아래와 같다.

#!/bin/bash
	##### insert the date #####
dlist=( "20121006" "20131220" "20150901" )# 수집하려는 날짜 입력

for ddate in "${dlist[@]}";do
tdate=`date -d "${ddate}" +%Y%m%d`
	##### insert the path #####
path=/home/hycom

	##### insert the area ##### # 수집하려는 영역 입력
slon=110
elon=140
slat=25
elat=45

tday=`date -d "${ddate}" +%Y%m%d`
fday=`date -d "${ddate}" +%Y-%m-%d`


	##### date case 1.
if [ ${tday} -le 20151230 ] ; then
 echo " date is before 2015/12/30"
 echo " use 'GLBv0.08', 'expt_53.X'"
 expt_name=expt_53.X
 vers_name=GLBv0.08
 ddy=`date -d "${tday}" +%Y`

 wget -c --tries=10 "https://ncss.hycom.org/thredds/ncss/${vers_name}/${expt_name}/data/${ddy}?var=surf_el&north=${elat}&west=${slon}&east=${elon}&south=${slat}&disableProjSubset=on&horizStride=1&time_start=${fday}T00%3A00%3A00Z&time_end=${fday}T21%3A00%3A00Z&timeStride=1&vertCoord=&accept=netcdf4" -O ${rpath}/hycom_ssh_${tday}.nc
 wget -c --tries=10 "https://ncss.hycom.org/thredds/ncss/${vers_name}/${expt_name}/data/${ddy}?var=salinity&var=water_temp&var=water_u&var=water_v&north=${elat}&west=${slon}&east=${elon}&south=${slat}&disableProjSubset=on&horizStride=1&time_start=${fday}T00%3A00%3A00Z&time_end=${fday}T21%3A00%3A00Z&timeStride=1&vertCoord=&accept=netcdf4" -O ${rpath}/hycom_ocean_${tday}.nc

##### date case 2.
  ## 2.1 -  2015.12.31~2016.04.30
else
 if [ ${tday} -gt 20151230 ] && [ ${tday} -le 20160430 ] ; then
 echo " date is 2015/12/31 ~ 2016/04/30"
 echo " use 'GLBv0.08', 'expt_56.3'"
 expt_name=expt_56.3
 vers_name=GLBv0.08

  ## 2.2 -  2016/05/01 ~ 2017/01/31
 elif [ ${tday} -gt 20160430 ] && [ ${tday} -le 20170131 ] ; then
 echo " date is 2016/05/01 ~ 2017/01/31"
 echo " use 'GLBv0.08', 'expt_57.2'"
 expt_name=expt_57.2
 vers_name=GLBv0.08

  ## 2.3 -  2017/02/01 ~ 2017/05/31
 elif [ ${tday} -gt 20170131 ] && [ ${tday} -le 20170531 ] ; then
 echo " date is 2017/02/01 ~ 2017/05/31"
 echo " use 'GLBv0.08', 'expt_92.8'"
 expt_name=expt_92.8
 vers_name=GLBv0.08

  ## 2.4 -  2017/06/01 ~ 2017/09/30
 elif [ ${tday} -gt 20170531 ] && [ ${tday} -le 20170930 ] ; then
 echo " date is 2017/06/01 ~ 2017/09/30"
 echo " use 'GLBv0.08', 'expt_57.7'"
 expt_name=expt_57.7
 vers_name=GLBv0.08

  ## 2.5 -  2017/10/01 ~ 2017/12/31
 elif [ ${tday} -gt 20170930 ] && [ ${tday} -le 20171231 ] ; then
 echo " date is 2017/10/01 ~ 2017/12/31"
 echo " use 'GLBv0.08', 'expt_92.9'"
 expt_name=expt_92.9
 vers_name=GLBv0.08

  ## 2.6 -  2018/01/01 ~ 2018/12/31
 elif [ ${tday} -gt 20171231 ] && [ ${tday} -le 20181231 ] ; then
 echo " date is 2018/01/01 ~ 2018/12/31"
 echo " use 'GLBv0.08', 'expt_93.0'"
 expt_name=expt_93.0
 vers_name=GLBv0.08

  ## 2.7 -   after 2019/01/01
 else
 echo "date is after 2019/01/01"
 echo " use 'GLBy0.08', 'expt_93.0'"
 expt_name=expt_93.0
 vers_name=GLBy0.08
fi

 wget -c --tries=10 "https://ncss.hycom.org/thredds/ncss/${vers_name}/${expt_name}?var=surf_el&north=${elat}&west=${slon}&east=${elon}&south=${slat}&disableProjSubset=on&horizStride=1&time_start=${fday}T00%3A00%3A00Z&time_end=${fday}T21%3A00%3A00Z&timeStride=1&vertCoord=&accept=netcdf4" -O ${rpath}/hycom_ssh_${tday}.nc
 wget -c --tries=10 "https://ncss.hycom.org/thredds/ncss/${vers_name}/${expt_name}?var=salinity&var=water_temp&var=water_u&var=water_v&north=${elat}&west=${slon}&east=${elon}&south=${slat}&disableProjSubset=on&horizStride=1&time_start=${fday}T00%3A00%3A00Z&time_end=${fday}T21%3A00%3A00Z&timeStride=1&vertCoord=&accept=netcdf4" -O ${rpath}/hycom_ocean_${tday}.nc

fi
done

 이러면 GOFS 3.1의 모든 기간은 위 스크립트로 수집이 가능하다. for문이나 dlist를 수정하면 연속된 기간 또는 특정 기간의 일단위 정보로 수집이 가능하다.

반응형