작성 : 김동훈 (http://www.dhkim.info, 인하대학교)
& 문일주 (제주대학교)
2019년 7월 25일
소 개#
ROMS (Regional Ocean Modeling System) 모델(모형)의 설치 및 실험에 관한 상세한 내용은 “Installing and Running ROMS for First Time Users“에 잘 설명되어 있으므로 영어에 친숙하신 분이라면 here를 참고하세요.
여기에서는 태풍 솔릭(Soulik) 시기의 해양순환 모의를 설명하며, 최근 버전인 ROMS-3.6 r964 (2019년 5월 1일 배포)을 사용합니다. 절의 제목 앞에 숫자가 붙어 있는 부분은 사용자가 직접 실행해야 하는 부분을 의미합니다.
소프트웨어 요구사항#
- Intel Fortran Compiler
- MPI library (openmpi 또는 mpich, mvapich 등)
- python 관련 : pyroms 모듈, jupyter notebook 또는 lab
0. 환경 설정#
/usr/bin/env bash # Bash Shell 사용
export ROMS=${HOME}/models/ROMS
export ROMSsrc=${ROMS}/Sources/ROMS
export PROJ=${ROMS}/Projects/Soulik1. 모델 및 자료 가져오기#
ROMS를 사용하려면 ROMS 포털에 등록되어 있어야 합니다. 등록은 여기 또는 여기에서 하면 됩니다. 등록한 아이디와 암호는 모델을 svn으로 가져올때 사용됩니다.
mkdir -p $ROMSsrc; cd $ROMSsrc
# 모델 소스코드만 받는 경우
svn checkout --username ??? https://www.myroms.org/svn/src/trunk trunk
# Test cases와 plot 관련 자료
svn checkout --username ??? https://www.myroms.org/svn/src/test test
svn checkout --username ??? https://www.myroms.org/svn/src/matlab matlab
svn checkout --username ??? https://www.myroms.org/svn/src/plot plot
# ROMS 관련 모든 자료를 한번에 받을 경우 (약 2.3G):
# 참고) ROMS/tags 디렉토리에 이전 버전(v2.0 ~ v3.6)들이 포함되어 있음
svn checkout --username ??? https://www.myroms.org/svn/src .
# revision number 확인
svn info2. 프로젝트 디렉토리 만들고 컴파일 하기#
mkdir -p $PROJ; cd $PROJ
# build 스크립트는 bash와 sh의 두가지를 지원하고 있으며 여기에서는 bash 기준으로 설명합니다.
cp ${ROMSsrc}/trunk/ROMS/Bin/build_roms.bash .
# build_roms.bash의 사용자 정의
vi ./build_roms.bash
> export ROMS_APPLICATION=SOULIK # 모두 대문자로 쓰며, 컴파일 시 소문자인 soulik.h 를 참조하게 됨
> export MY_ROOT_DIR=${ROMSsrc}
> export USE_NETCDF4=on # netcdf의 버전에 따라 선택하세요.Note) USE_NETCDF4 를 on 하였을 경우는 컴파일 시에 NETCDF 라이브러리의 위치를 묻는 “nf-config” 명령을 사용하게 되는데, 이 명령이 없거나 실행 시에 문제가 있다면 ${ROMSsrc}/trunk/Compilers/Linux-ifort.mk (시스템에 따라 파일이 다를 수 있음) 을 편집하여 “nf-config” 를 “nc-config” 로 바꾸어 줍니다. 또한, nc-config 의 명령이 제대로 실행되는지도 확인해야 합니다.
참고로, nf-config 는 Fortran 용 실행화일이며, nc-config 는 C 용 실행화일입니다. 보통은 Fortran과 C 용 라이브러리가 동일 디렉토리에 설치되므로 아무거나 써도 상관이 없습니다.
2-1. Header 파일 만들기#
ROMS의 컴파일 시 사용할 header 파일을 다음과 같이 작성합니다. 파일 이름은 $PROJ 디렉토리에 사용한 이름과 같은 soulik.h 로 저장합니다. 파일 이름은 모두 소문자이어야 합니다.
각 옵션들에 대한 자세한 설명은 ROMS의 Wiki 페이지에 있는 여기 를 참고하세요.
cd $PROJ
cat > soulik.h << END
/*
** Options for NWP Test.
** Application flag: NWP
*/
/* Physics + numerics */
#define UV_ADV /* 이류항 계산 */
#define UV_QDRAG /* Quadratic bottom friction */
#define UV_COR /* 코리올리 힘 계산 */
#define UV_VIS2 /* Harmonic horizontal mixing */
#define TS_U3HADVECTION /* 3rd-order upstream horiz. advection */
#define TS_DIF2 /* Harmonic horizontal mixing for tracers */
#define SALINITY /* 염분 계산 */
#define DJ_GRADPS /* Splines density Jacobian (Shchepetkin, 2000) */
#define MIX_S_UV /* mixing along constant S-surfaces */
#define MIX_GEO_TS /* mixing along geopotential (constant Z) surfaces */
#define SOLVE3D /* 3D 원시방정식 계산 */
#define CURVGRID /* Curvilinear coordinates grid */
#define SPLINES_VDIFF
#define SPLINES_VVISC
#define NONLIN_EOS /* 비선형 상태방정식 사용 */
/*#define WET_DRY*/ /* Wetting and Drying 옵션 */
/* Grid and Initial */
#define MASKING /* land/sea masking */
/* Forcing */
/*#define BULK_FLUXES*/ /* Bulk fluxes 계산 */
#define ATM_PRESS /* 해수면 위에 대기압 적용 */
#define ANA_BTFLUX /* analytical bottom temperature flux 사용 */
#define ANA_BSFLUX /* analytical bottom salinity flux 사용 */
#define ANA_BPFLUX /* analytical bottom passive tracers fluxes 사용 */
#define LONGWAVE_OUT /* outgoing longwave radiation */
#define EMINUSP /* E-P 계산 */
#define SOLAR_SOURCE /*solar radiation source term*/
#undef QCORRECTION /*net heat flux correction */
#undef SCORRECTION /*freshwater flux correction*/
#undef SRELAXATION /*salinity relaxation as a freshwater flux*/
#undef DIURNAL_SRFLUX /*mdulate input shortwave with diurnal cycle*/
/* Turbulence closure */
#define GLS_MIXING /* Generic Length-Scale mixing */
#undef MY25_MIXING /* Mellor/Yamada Level-2.5 closure */
#undef LMD_MIXING /* Large et al. (1994) K-profile vertical parameterization */
/*#define LIMIT_VDIFF*/
/*#define LIMIT_VVISC*/
#if defined GLS_MIXING || defined MY25_MIXING
# define KANTHA_CLAYSON /* Kantha and Clayson stability function */
# define N2S2_HORAVG /* Horizontal smoothing of buoyancy/shear */
# define RI_SPLINES
# define CRAIG_BANNER /* Craig and Banner wave breaking surface flux */
# define CHARNOK /* Charnok surface roughness from wind stress */
#endif
#ifdef LMD_MIXING
# define LMD_RIMIX /* Add diffusivity due to shear instability */
# define LMD_CONVEC /* Add convective mixing due to shear instability */
# undef LMD_DDMIX /* Add double-diffusive mixing */
# define LMD_SKPP /* Surface boundary layer KPP mixing */
# undef LMD_BKPP /* Bottom boundary layer KPP mixing */
# define LMD_NONLOCAL /* Nonlocal transport */
#endif
#undef SSH_TIDES /* Imposing tidal elevation */
#undef UV_TIDES /* Imposing tidal currents */
#undef RAMP_TIDES /* Ramping (over one day) tidal forcing */
/* Output */
#define AVERAGES /* 시간 평균된 결과로 저장 */
#define AVERAGES_FLUXES /* 시간 평균된 flux로 저장 */
#undef DIAGNOSTICS_UV /* Writing out momentum diagnostics */
#undef DIAGNOSTICS_TS /* Writing out tracer diagnostics */
END2-2. 컴파일 하기#
프로젝트의 header 파일을 만들었으면, ROMS 모델을 컴파일 합니다. 다음과 같이 컴파일하고 표출되는 메세지에 error 가 없는지 유심히 살펴 봅니다. 최종적으로 “romsM” 이 제대로 생성되었는지 확인합니다.
cd $PROJ
\rm -f Build_roms romsM
./build_roms.bash # 1개의 processor를 사용하여 컴파일
./build_roms.bash -j 8 # 시스템이 멀티코아를 가지고 있을 경우 최대 8개의 코아를 사용하여 컴파일
ls -l romsM3. 격자 및 입력자료 만들기#
사용자의 연구 상황에 따라서 격자 및 입력자료를 만드는 방법이 다를 수 있으며, 여기에서는 pyroms를 이용하는 방법을 설명하도록 하겠습니다.
여기에서는 제시된 스크립트들은 pyroms의 예제들을 참조하여 저자가 직접 만든 것입니다.
3-1. pyroms 및 jupyter 설치하기#
pyroms는 설치하기가 쉽지않은 모듈이지만, 성공적으로 설치할 경우 편리성이 매우 높은 도구입니다.
설치과정 대한 자세한 설명은 지면이 길어지므로 pyroms 설치하기 를 참고하여 설치하시기 바랍니다.
pyroms을 사용하여 격자 및 입력자료를 만드는 과정은 복잡하고 이해하기 힘들기 때문에 설명을 쉽게 하기 위하여 jupyter notebook 또는 jupyter lab을 사용하도록 하였습니다. Jupyter와 관련된 설치 및 사용법은 여기의 설명 범위에서 벗어나므로 인터넷 검색을 통하면 설치 및 사용법 익히시기 바랍니다. 또한, anaconda를 설치하였다면 jupyter가 이미 설치되어 있어서 바로 사용할 수 있습니다.
jupyter 가 아닌 python 으로 직접 실행하실 경우는 다음의 명령으로 *.ipynb 화일을 *.py 로 변환하여 사용하시기 바랍니다.
conda install jupyter # jupyter가 설치되어 있지 않은 경우
jupyter jupyter nbconvert --to script myFile.ipynb
# myFile.py 가 생성됨.3-2. Grid 만들기#
ROMS의 영역 격자를 만드는 방법은 모델의 역사 만큼이나 다양하게 존재합니다. 대표적으로 다음과 같은 것들이 있으니 참고하세요.
- Gridgen: http:code.google.com/p/gridgen-c, or https://github.com/sakov/gridgen-c
- pyroms, pygridgen, octant
- Easygrid: https://www.myroms.org/wiki/easygrid
- Gridbuilder: http://austides.com/downloads
- COAWST Tools: wrf2roms_mw.m, create_roms_xygrid.m
- … …
- Jupyter notebook의 형식으로 작성된 다음의 링크를 따라서 격자를 만듭니다.
makeGrid4Soulik - 생성된 “Soulik_grd_v2.nc” 를 $PROJ 디렉토리에 복사합니다.
3-3. 초기장(I.C.) 만들기#
- HYCOM 자료 중에서 격자 크기에 맞는 영역의 해당 시작 날짜의 자료를 가져 옵니다.
getHYCOM4SoulikIC - HYCOM 자료를 ROMS의 초기장으로 만듭니다.
makeIC4Soulik - 생성된 “ROMS4Soulik_ic_2018-08-21T00:00:00Z.nc4"를 $PROJ 디렉토리에 복사합니다.
3-4. 측면경계장(L.B.C.) 만들기#
- HYCOM 자료 중에서 격자의 측면에 맞는 영역에 대해 모델의 전체 계산 시간에 해당하는 시계열 자료를 가져 옵니다.
getHYCOM4SoulikLBCs - HYCOM 격자와 ROMS 격자의 내삽 가중치 비율을 계산합니다.
makeRemapWeights - HYCOM 자료를 ROMS의 측면경계장으로 만듭니다.
makeLBC4Soulik - 생성된 “ROMS4Soulik_bc.nc"를 $PROJ 디렉토리에 복사합니다.
3-5. 대기경계장(S.B.C, 표층외력) 만들기#
GFS 로 부터 모델의 전체 계산 시간에 해당하는 전지구 시계열 자료를 가져 옵니다.
getGFS4SoulikSBCGFS 자료를 ROMS의 대기경계장으로 만듭니다.
makeSBC4Soulik생성된 “roms_gfs_0p25_sbc_Soulik.nc"를 $PROJ 디렉토리에 복사합니다.
4. ROMS 모의하기#
4-1. input file 만들기#
ocean.in 파일은 ${ROMSsrc}/test 디렉토리에 있는 각 종 예제 자료들을 참조하여 만든 후 다음 내용을 수정합니다.
예제 자료들에 있는 ocean.in 파일의 후반 부에는 각 변수들에 대한 자세한 사항이 있으니 참고하세요.
cd $PROJ
cat ocean.in << END
... ...
TITLE = Typhoon Soulik
MyAppCPP = SOULIK
VARNAME = ${ROMSsrc}/trunk/ROMS/External/varinfo.dat
Lm == 430 ! Number of I-direction INTERIOR RHO-points
Mm == 320 ! Number of J-direction INTERIOR RHO-points
N == 30 ! Number of vertical levels
NtileI == 6 ! I-direction 병렬 분할 갯수
NtileJ == 6 ! J-direction 병렬 분할 갯수
NTIMES == 1440 ! 총 모의 계산 스텝. ex) NTIMES * DT = 총 모의 시간
DT == 240.0d0 ! BaroClinic(3D) 계산 시간 간격 (단위: seconds)
NDTFAST == 20 ! BaroClinic/BaroTropic time steps
GRDNAME == ./Soulik_grd_v2.nc ! 격자 파일
ININAME == ./ROMS4Soulik_ic_2018-08-21T00:00:00Z.nc4 ! 초기장 파일
BRYNAME == ./ROMS4Soulik_bc.nc ! 측면 경계장 파일
NFFILES == 1 ! 표층 경계장 파일의 갯수
FRCNAME == ./roms_gfs_0p25_sbc_Soulik.nc ! 표층 경계장 파일
... ...
END4-2. 모의하기#
모델의 실행은 사용자의 시스템에 따라 다를 수 있으므로, 여기에서는 1개 노드에 36개 이상의 코어를 가지고 있는 시스템을 가정하여 다음과 같이 실행합니다.
mpirun -np 36 ./romsM ocean.in >& out.log결과 파일로 ocean_avg.nc, ocean_his_????.nc, ocean_rst.nc 등이 제대로 생성되었는지 확인합니다.
5. ROMS 결과 분석하기#
ROMS의 결과 분석은 다양한 방법이 있으며 과학적 지식이 필요한 부분이므로 추후에 다른 지면을 사용하여 설명하도록 하겠습니다.
=== END ===
