GFDL MOM2
1.
%setenv MOMpath /usr1/ocean/MOM/MOM_2.2
%mkdir $MOMpath/EXP/GLOBE
%mkdir $MOMpath/EXP/GLOBE/MOM_UPDATES $MOMpath/EXP/GLOBE/PREP_UPDATES
2.
%cd $MOMpath/EXP/GLOBE/MOM_UPDATES
%cp $MOMpath/grids.F .
%cp $MOMpath/run_grids .
-> run_grids를 편집하여 "OPTIONS" 변수의 마지막에 "-Dsgi"를 추가한다.
-> run_grids를 편집하여 "MOM2" 변수를 위의 "MOMpath"와 같게 고쳐준다.
-> grid resolution과 region을 바꾸려면 grids.F를 알맞게 편집한다 (manual의 7장 p79 참조).
%./run_grids
-> 제대로 결과가 나왔는지 results_grids를 확인한다.
%cp $MOMpath/size.h .
-> results_grids의 맨뒤에 나오는 해상도(imt,jmt,km)에 맞추어서 방금 카피한 size.h를 고친다.
3.
%cp $MOMpath/topog.F .
%cp $MOMpath/run_topog .
-> run_topog를 편집하여 "MOMpath" 변수를 위의 "MOMpath"와 같게 고쳐준다.
-> NetCDF를 사용한다면 알맞은 library path와 include path를 정해 주어야 하는데 자세한 내용은 netCDF-3.4 와 udunits-1.11.6을 참조하면 된다.
$MOMpath/NETCDF에 있는 ncsetup.F, nctfind.F, ncymdhms.F, sincestr.F에 "/usr/local/etc/udunits.dat"의 부분도 알맞게 고쳐준다.
-> run_topog를 편집하여 "PLATFORM_OPTION" 변수를 "-Dsgi"에 맞게 uncomment한다.
-> topography를 바꾸려면 topog.F를 편집해야되는데 manual의 9장을 참조하면 된다.
-> run_topog를 실행하여 results_topog의 결과를 확인한다.
4.
%cp $MOMpath/run_mom_sgi .
-> run_mom_sgi를 편집하여 "myEXP = GLOBE"로 고친다.
-> datainpath는 PREP_UPDATES에서 만들어준 data의 path를 가리킨다.
-> DATABASE는 GFDL에서 제공하는 database들이 들어있는 path를 가리킨다.
-> MOMpath에서 NETCDFlib까지도 알맞게 고쳐주는데 WORKDIR 변수의 디렉토리는 고친후에 직접 자신이 만들어 주어야 한다.
-> PLATFORM_OPTION을 sgi에 맞춘다. (Digital Unix용 옵션은 아래항목 참조)
-> GFDL에서 제공하는 SBC data를 사용하려면 CASE 변수를 0이 아닌 1 또는 2의 값을 사용한다.
-> GFDL에서 제공하는 idealized T & S를 initial condition으로 사용하려면 LEVITUS_DAT_IC = yes 로 바꾼다.
-> GFDL에서 제공하는 sponge boundary를 사용하려면 SPONGE_DATA = yes로 바꾼다.
-> GFDL에서 제공하는 scripps based topography를 사용하려면 SCRIPPS_DATA = yes로 바꾼다.
%./run_mom_sgi
- How to set up input data which is prepared by GFDL
%cd $MOMpath/EXP/$myEXP/PREP_UPDATES
%cp $MOMpath/PREP_DATA/run_sbc .
%cp $MOMpath/PREP_DATA/run_ic .
%cp $MOMpath/PREP_DATA/run_sponge .
-> 위의 세가지 화일을 편집하여 다음과 같이 고친다.
myEXP = GLOBE
MOMupdates = MOM_UPDATES의 path를 적는다.
PREPupdates = PREP_UPDATES의 path를 적는다.
MOMpath = MOM의 HOME directory
PREPpath = GFDL에서 제공하는 MOMpath 아래의 PREP_DATA directory
datainpath = GFDL에서 제공하는 database가 있는 directory
dataoutpath = 결과 database가 저장될 directory
WORKDIR = working directory로서 setting 후에 직접 만들어 주어야 한다.
-> OPTIONS에 -Dcray_t90을 지우고 -Dsgi를 삽입하고 Digital Unix 상에서 실행 중일 경우 -convert big_endian도 함께 추가해 준다.
-> 입력 데이타를 copy하는 부분이 있는데 link를 시키는 것이 편하므로 symbolic link를 해주는데 각각의 link할 화일은 다음과 같다.
run_sbc : hellerman.tau, oorts.air
run_ic : *.temp, *.salt
run_sponge : *.mom
-> run_sbc에 intrph와 intrpo도 알맞게 고쳐준다.
-> Digital Unix에서는 $MOMpath/iomngr.F의 1182번쩨 줄에 write format error가 생기므로 다음과 같이 고쳐준다.
write(stdout,'(a4,)') -> write(stdout,'(a4)')
%./run.sbc
-> 실행 후에 각각의 *.prn 화일을 잘 살펴 보고 $dataoutpath에 길과가 제대로 들어갔는지 확인한다.
- How to set up scripps topography data
......
- How to change MOM2 resolution
1. grids.F의 해상도를 알맞게 고친 후 run_grids를 실행하여 결과 확인.
2. index.h에 lsegf와 jmtfil의 값을 조정해야 하는데 이것은 mom2를 여러번 실행하면서 조정 (error message가 나옴).
3. diago_netcdf.F에 lenbuf가 10000으로 setting되어 있는데 이 값이 적정하지 않으면 처음 diagnostic 결과가 저장될 때 error message로서 print되는데, 될 수 있으면 첫 실행에서 diagnostic 결과를 빨리 저장하도록 하여 이것을 확인 해 보는 것이 좋다.
4. PREP_UPDATES에서 run_sbc, run_ic, run_sponge를 각각 다시 실행하여 해상도에 맞는 databsea 생성. 해상도가 높으면 database가 커지므로 될수 있으면 각각의 run scripts에 $dataoutpath로 copy하는 부분을 move로 고쳐주는 것이 좋다. 그렇지 않으면 FTMPDIR과 DATABASE에 똑같은 화일이 두개 존재하므로 FTMPDIR을 일부러 지우지 않는한 space의 낭비를 가져올 수 있다.
5. run_mom에서 runlen, dtts, dtuv, dtsf 등을 고친 후 실행. dtuv와 dtsf는 dtts의 24배 정도 작은 값을 채택.
- How to port MOM2 on Digital Unix v4.0D
1. $MOMpath/run_mom_sgi를 $MOMpath/run_mom_dec로 카피한다.
2. run_mom_dec를 편집하여 "COMPILER_OPTIONS"의 "-mips2"와 "-align64"를 빼고 다음을 추가한다.
"-convert big_endian"
3. LEN_TRIM 함수는 iomngr.F와 util.F, timer.F에 있는데 이것이 컴파일시 중복이 되므로 util.F와 timer.F에 있는 LEN_TRIM함수는 모두 comment처리한다. 참고로 f90으로 컴파일하면 LEN_TRIM이 Intrinsic Procedure로써 제공된다.
4. run_mom_dec를 편집하여 "COMPILER_SINGLE"에 "-convert big_endian"을 추가한다 (여기에는 "-r8"을 사용하면 안됨).
1. run_iomngr을 test할 때 iomngr.F에 sform='SYSTEM'이라고 써있는 부분이 있는데 이 format문은 Digital Unix에 맞지 않으므로 'UNFORMATTED'라고 고치거나 f77을 사용하지 맡고 f90을 사용하되 컴파일 옵션에 '-Df90'을 추가한다.
1. GFDL에서 제공하는 DATABASE는 32bit IEEE unformatted 화일이므로 이것을 읽으려면 위의 모든 scripts 화일에서 compile option에 "-r8" 부분을 빼주어야 하는데 (Digital Unix Fortran의 Default real size는 4이다) 이 옵션을 빼면 namelist나 그외 몇몇 부분에서 real size가 잘 맞지 않아 결과의 소수점 아래부분이 값이 많이 틀림을 알 수 있다. 이것은 수치모형에서 치명적인 에라를 유발할 수 있으므로 PREP_UPDATES에서 제공하는 모든 data를 real*8로 바꾸어서 만들어야 하는데 이것의 간단한 설명은 다음과 같고 자세한 것을 알고 싶으면 mail() 주시기 바랍니다.
우선 $MOMpath/PREP_DATA에서 sbc.F와 ic.F를 PREP_UPDATES에 copy한다 (sponge.F는 run_ic에서 만든 데이타를 이용하므로 고쳐줄 필요없다.).
각 화일을 편집하여 데이타를 read하는 부분(doit()서브루틴 내에 있음)을 찾아서 각각의 변수 중 real인 것 만 골라서 이것과 비슷한 이름으로 real*4로 정의한 변수를 만든다.
이렇게 만든 real*4변수로 read문의 변수를 대체하고 각각 읽은 후에 다시 원래의 real*8의 변수에 값을 치환하여 집어 넣어 주면 된다.
2. CASE=2를 사용할 경우, 즉 SBC를 MONTHLY로 읽어 들이는 부분에서 Digital Unix 상에서는 error이 나는데 그것은 SBC/MONTHLY/setatm.F에서 file을 open할 때 direct access의 record length의 값이 맞지 않기 때문이다. 왜냐하면 이 값이 Cray와도 맞지 않고 SGI에도 맞지 않기 때문이다. 정확한 record length의 값은 현재 테스트 중에 있으므로 결과가 검증이 되는대로 값을 제시하도록 하겠다 (검증 전에라도 값이 필요하신 분은 mail() 주시기 바랍니다).
- Result files
File Name | Title | Variables |
cmix.dta[.nc] | Estimated mixing coefficients | diff_cet(t,z,y,x) diff_cnt(t,z,y,x) diff_cbt(t,z,y,x) diff_ceu(t,z,y,x) diff_cnu(t,z,y,x) diff_cbu(t,z,y,x) period(t) |
cvct.dta[.nc] | Rate of Convection | convect(t,z,y,x) : Rate of convection period(t) : Averaging period |
diag_surf.dta[.nc] | Diagnostic Surface Height | dsp(t,y,x) : diag surf height dspper(t) : averaging period |
energy_int.dta[.nc] | Energyanalysis | ddt_int(t) : internal mode energy change hadv_int(t) : internal mode work by hor adv vadv_int(t) : internal mode work by vert adv hfric_int(t) : internal mode work by hor fric vfric_int(t) : internal mode work by vert fric press_int(t) : internal mode work by pressure imbal_int(t) : internal mode imbalance wind_int(t) : internal mode work by wind drag_int(t) : internal mode work by bottom drag ddt_ext(t) : external mode energy change hadv_ext(t) : external mode work by hor adv vadv_ext(t) : external mode work by vert adv hfric_ext(t) : external mode work by hor fric vfric_ext(t) : external mode work by vert fric press_ext(t) : external mode work by pressure imbal_ext(t) : external mode imbalance wind_ext(t) : external mode work by wind drag_ext(t) : external mode work by bottom drag buoy(t) : buoyancy buoy_err(t) : buoyancy error energy_leak(t) : non-linear error period(t) : Averaging period |
gyre_comp.dta[.nc] | Gyre northward transport components | zonal_mean_T(t,y) : x mean_T zonal_eddy_T(t,y) : x eddy_T vert_mean_T(t,y) : z mean_T vert_eddy_T(t,y) : z eddy T ekman_T(t,y) : ekman_T adv_T(t,y) : total advection_T diff_T(t,y) : diffusion_T total_T(t,y) : total transport_T zonal_mean_S(t,y) : x |
overturn.dta[.nc] | Meridional Overturning | |
particles.dta[.nc] | Particle trajectories | |
psi.dta[.nc] | External mode | |
snapshots.dta[.nc] | Snapshots | |
term_bal.dta[.nc] | Term balances | |
time_mean.dta[.nc] | Time averages | |
tracer_avg.dta[.nc] | Tracer Averages | |
tracer_bud.dta[.nc] | Meridional Tracer Budget | |
ts_intgrls.dta[.nc] | Time Step Monitor | |
xbt.dta[.nc] | XBTs | |
zmean_sbc.dta[.nc] | Zonal mean of Surface BoundaryConditons |