반응형

     정보

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

    • 작성자     : 이상호

    • 작성일     : 2020-02-27

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

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

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

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

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

     

     

    [특징]

    • 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로 이진 형식 파일을 강제로 열면 다음과 같이 깨진 문자를 확인할 수 있습니다.

     

     

    [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

     

     

    [변수 구조]

    • 관용구

      • ~, !, &, @ 관용구는 "일반 인식"순서와 반대입니다. 예를 들면 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
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기