[NCL] NetCDF 형식 및 NCL 변수 구조

 정보

  • 업무명     : NetCDF 형식 및 NCL 구조

  • 작성자     : 이상호

  • 작성일     : 2020-02-27

  • 설   명      :

  • 수정이력 :

 

 내용

[개요]

  • 안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.

  • NCL (NCAR Command Language)은 미국의 NCAR (National Center for Atmospheric Research)에서 개발된 언어로서 지구과학/대기과학 분야에서 특화되었습니다. 이는 다양한 분야에서 널리 사용되는 Matlab과 비교할 때 라이브러리를 통해 쉽게 계산할 수 있습니다.

  • 특히 예전에 자주 사용되는 소프트웨어인 GrADS는 간단한 인터페이스로 초보자도 빨리 익힐 수 있으나 소프트웨어의 유연성이 떨어집니다.

  • 따라서 이러한 NCL에서 NetCDF 형식 및 NCL 변수를 소개드리고자 합니다.

 

sky-690293_1280.jpg

 

[특징]

  • NetCDF 자료를 이해하기 위해서 NCL 변수 이해가 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

 

[기능]

  • NetCDF 형식

    • NetCDF 다운로드

    • 세부 내용 보기

    • NCL 파일 읽기

 

  • 변수 구조

    • 관용구

    • 배열 인덱스

    • 변수 속성

 

[활용 자료]

  • 파일명 : air.2014.nc

  • 자료 종류 : NCEP 재분석 자료 중에서 기온

  • 확장자 : nc

  • 기간 : 2014년

  • 제공처 : 미국 NOAA 공식 홈페이지 (ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/air.2014.nc)

 

[자료 처리 방안 및 활용 분석 기법]

  • 없음

 

[사용법]

  • 작업 환경 구축

    • 동일한 디렉터리에 "air.2014.nc" 및 "Test02.ncl"를 위치

  • 소스 코드 실행 (ncl Test02.ncl)

  • 실행 결과 확인

 

[사용 OS]

  • Linux (CentOS v7.0)

  • VMware Workstation Pro v15.5

 

[사용 언어]

  • NCL v6.3.0

 

 세부 내용

[NetCDF 형식?]

  • 형식과 비교할 때 가장 일반적인 과학 데이터는 이진 (Binary) 형식으로 저장됩니다.

  • 일반적으로 이진 자료는 아스키보다 하드 디스크 공간과 데이터 전송 시간을 절약 할 수 있습니다.

  • 두 가지 형식의 ASCII 및 이진 자료 (Binary)의 차이점을 모르는 경우 단계별로 설명하십시오 .

  • 원도우 (Windows) 운영체제에서 메모장 또는 리눅스 (Linux)에서 vi 편집기를 통해 아스키 및 이진 자료 여부를 확인할 수 있습니다 예를 들어 vi로 이진 형식 파일을 강제로 열면 다음과 같이 깨진 문자를 확인할 수 있습니다.

 

etc-image-1

 

[1 단계] NetCDF 자료 다운로드

  • 빅 데이터를 과학적으로 처리할 경우 많은 공간을 차지하는 아스키 형식보다 이진 자료를 사용합니다.

  • 이진 자료의 입/출력 (I/O)은 과학 연구에서 기본적으로 사용됩니다. 이러한 중요성을 고려하여 크로스 플랫폼, 소프트웨어 간의 입/출력 등을 포함하는 또 다른 특수 바이너리 형식인 NetCDF가 있습니다.

  • 이러한 NetCDF 형식은 NCL에서 매우 간단하게 읽을 뿐만 아니라 수치예측 모델 (ECMWF, WRF 등)의 출력 파일로 사용되고 있습니다 (위성 영상 자료의 경우 HDF 형식 사용).

  • NCL에서 NetCDF를 읽는 방법은 HDF와 유사합니다.

 

[root linux@/SYSTEM/NCL]# wget "ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/air.2014.nc"

--2020-02-26 16:21:36--  ftp://ftp.cdc.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/air.2014.nc
           => ‘air.2014.nc’
Resolving ftp.cdc.noaa.gov (ftp.cdc.noaa.gov)... 140.172.38.117
Connecting to ftp.cdc.noaa.gov (ftp.cdc.noaa.gov)|140.172.38.117|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /Datasets/ncep.reanalysis.dailyavgs/pressure ... done.
==> SIZE air.2014.nc ... 110340178
==> PASV ... done.    ==> RETR air.2014.nc ... done.
Length: 110340178 (105M) (unauthoritative)

100%[=====================================>] 110,340,178 1.56MB/s   in 3m 1s  

2020-02-26 16:24:41 (595 KB/s) - ‘air.2014.nc’ saved [110340178]

 

[2 단계] 세부 내용 보기

  • 확인 결과 air.2004.nc 파일에는 5개 변수 (평균 기온, 고도, 위도, 경도, 시간)가 있습니다.

  • 즉 위도는 -90-90, 경도는 0-357.5, 고도는 1000-10 hPa의 전역 변수임을 알 수 있습니다.

  • 그리고 좌표는 144 x 73 x 17 격자이며 시간에 따라 365개의 정보가 있습니다.

  • 주요 변수인 평균 기온 (예 : air)은 명명되어 있습니다.

 

[root localhost@/SYSTEM/NCL]# ncl_filedump air.2014.nc
 Copyright (C) 1995-2015 - All Rights Reserved
 University Corporation for Atmospheric Research
 NCAR Command Language Version 6.3.0
 The use of this software is governed by a License Agreement.
 See http://www.ncl.ucar.edu/ for more details.

Variable: f
Type: file
filename:	air.2014
path:	air.2014.nc
   file global attributes:
      Conventions : COARDS
      title : mean daily NMC reanalysis (2014)
      history : created 2013/12 by Hoop (netCDF2.3)
      description : Data is from NMC initialized reanalysis
(4x/day).  It consists of most variables interpolated to
pressure surfaces from model (sigma) surfaces.
      platform : Model
      References : http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html
      dataset_title : NCEP-NCAR Reanalysis 1
   dimensions:
      level = 17
      lat = 73
      lon = 144
      time = 365  // unlimited
   variables:
      float level ( level )
         units :	millibar
         actual_range :	( 1000, 10 )
         long_name :	Level
         positive :	down
         GRIB_id :	100
         GRIB_name :	hPa
         axis :	Z

      float lat ( lat )
         units :	degrees_north
         actual_range :	( 90, -90 )
         long_name :	Latitude
         standard_name :	latitude
         axis :	Y

      float lon ( lon )
         units :	degrees_east
         long_name :	Longitude
         actual_range :	(  0, 357.5 )
         standard_name :	longitude
         axis :	X

      double time ( time )
         long_name :	Time
         delta_t :	0000-00-01 00:00:00
         standard_name :	time
         axis :	T
         avg_period :	0000-00-01 00:00:00
         units :	hours since 1800-01-01 00:00:0.0
         actual_range :	( 1875888, 1884624 )

      float air ( time, level, lat, lon )
         long_name :	mean Daily Air temperature
         units :	degK
         precision :	2
         least_significant_digit :	1
         GRIB_id :	11
         GRIB_name :	TMP
         var_desc :	Air temperature
         dataset :	NCEP Reanalysis Daily Averages
         level_desc :	Multiple levels
         missing_value :	-9.96921e+36
         valid_range :	( 150, 350 )
         actual_range :	( 180.77, 318.27 )
         statistic :	Mean
         parent_stat :	Individual Obs
         _FillValue :	-9.96921e+36

 

[3 단계] NetCDF 파일 읽기

  • 다음과 같이 NCL 스크립트에서 .nc를 읽습니다.

  • 상기 "내용의 사용법"에서와 같이 실행합니다.

  • 해당 실행 소스 코드 (Test02.ncl)에 대해 자세히 드리자면 

    • ncFile = addfile("air.2014.nc", "r")에서 NetCDF 파일 (air.2014.nc)을 읽는 준비가 되었음을 알려줍니다

    • Temp = ncFile->air에서 변수를 읽기 전에 변수의 이름 (예 : air)을 알아야합니다. 2 단계의 내용 보기를 참조하여 변수의 이름을 확인할 수있습니다.

    • printVarSummary(Temp)은 매우 유용한 함수로서 Temp 변수의 구조와 속성을 알 수 있습니다. 즉 Temp는 총 4개의 차원과 15개의 속성을 가지고 있습니다.

    • 여기서 NetCDF가 편리한 위치를 확인할 수 있습니다. 하나의 명령으로 읽은 변수에는 할당된 좌표 축과 유효하지 않은 값 (_FillValue)이 포함되어 있습니다.

    • 추후에 가시화할 때 별도로 지정할 필요가 없습니다. NCL은 각 온도가 맵에 있어야하는 위치를 알고 있습니다. 데이터가없는 경우, 즉 특정 그물의 온도 값이 유효하지 않은 값인 경우 NCL 그리기없이 건너 뛰기 (예 : 평균)를 계산할 때 NCL은 유효하지 않은 포인트도 자동으로 건너 뜁니다.

 

begin

   ncFile = addfile("air.2014.nc","r")
   
   Temp   = ncFile->air
   
   printVarSummary(Temp)
   
   print(Temp@units)
   
   print(Temp!0)
   print(Temp!1)
   print(Temp!2)
   print(Temp!3)
   
   print("All Done.")

end

 

etc-image-2

 

[변수 구조]

  • 관용구

    • ~, !, &, @ 관용구는 "일반 인식"순서와 반대입니다. 예를 들면 NCEP 재분석 자료는 "시간 x 레벨 x 위도 x 경도"인 4 차원 좌표로서 일반적인 순서는 "X * Y * Z * T"이어야 합니다.

    • 변수의 좌표 정보는 크게 2가지로 나타낼 수 있습니다. 우선 좌표 축 이름은 "! "으로 접근합니다. 예를 들어 시간은 Temp의 1 번째 좌표로서 print(Temp!0)을 사용하여 변수의 좌표 축 이름을 변경하거나 지정할 수 있습니다 (Temp!0 = "day" 또는 Temp!1 = "pressure").

    • 마지막으로 좌표축 값은 &를 사용하여 접근합니다. 예를 들어 Temp는 자오선 위에 144 격자가 있으나 위/경도는 0-360도 또는 -180-180 입니까? 각 셀의 간격이 동일합니까? 이때 출력 (Temp & lon)를 사용하여 모든 경도 좌표를 표시할 수 있습니다.

    • 동일한 방법을 사용하여 좌표 값을 설정할 수 있습니다. 예를 들면 Temp & lon = fspan (0, 360, -2.5, 144)와 같이 설정할 수 있습니다.

    • .nc 파일을 읽을 경우 대부분 좌표축 이름과 값은 미리 설정되어 있기 때문에 걱정할 필요가 없습니다. 그러나 새 변수를 계산하거나 일부 이진 파일을 읽을 때는 변수의 좌표 정보를 수동으로 설정해야합니다.

    • ! 및 &는 필요한 기능입니다.

 

  • 배열 인덱스

    • Test02.ncl에서 Temp!0에서 Temp!3까지 사용합니다.

    • NCL에서 배열의 1 번째 인덱스가 1이 아니라 0임을 알 수 있습니다. 예를 들어 17 개 요소로 구성된 배열 (level)의 경우 인덱스는 1-17이 아니라 0-16입니다.

    • level은 Temp의 2 번째 차원이나 Temp!2는 위도, Temp!1은 고도입니다.

    • Matlab과 같은 소프트웨어와 상호 작용할 때 때때로 혼동되기 때문에 (Matlab에서 배열 인덱스는 1부터 시작하고 좌표 순서는 X x Y x Z x T) 나중에 바이너리를 소개합니다.

    • 형식 및 플랫폼 변환시 자세한 정보가 있습니다.

 

  • 변수 속성

    • 대부분의 속성이 사용자에게 표시되어 변수의 소스 코드, 프로세스, 정확성 등을 사용자에게 상기시킵니다. NCL은 유효하지 않은 값 (_FillValue)이 계산에 참여하지 않거나 가시화할 때 제목명 (long_name) 및 단위 (Unit)가 그래프의 좌측 상단 및 우측 상단에 배치되도록 사전 설정되는 것과 같은 소수의 특수 속성만 사용합니다.

    • 이러한 속성은 @로 제어할 수 있습니다. Test02.ncl에서 print(Temp@units)는 Temp 변수의 단위를 볼 수 있습니다.

    • 또한 이 방법을 통해 속성을 추가 및 수정할 수 있습니다. 예를 들면 Temp@long_name = "NCEP에서 공기 온도", Temp@today = "2015/03/09"

    • 그 밖에 delete(Temp@var_desc)와 같이 속성을 삭제할 수 있습니다.

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com