반응형

     정보

    • 업무명     : 대기과학 전공자를 위한 IDL (Interactive Data Language) 소개

    • 작성자     : 이상호

    • 작성일     : 2020-03-23

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

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

    • 기상 데이터 및 제품의 유형 및 수량이 급격히 증가하였고 기상 연구원에 의한 데이터 시각화 요구가 더욱 시급해지고 있습니다. IDL은 보편적이고 표준적인 기상 정보를 직관적이고 명확하며 생생한 시각적 시각화를 위한 이상적인 도구를 제공합니다.

    • 이러한 IDL은 기상 산업 형식으로 데이터를 효율적으로 읽고 쓸 수 있으며 데이터의 빠른 처리, 분석 및 2D 및 3D 시각화를 수행할 수 있습니다. 사용 OS의 경우 Windows , Linux , Unix 및 Mac 시스템 플랫폼에서 실행할 수 있으며 개발된 프로그램은 기본적으로 특별한 변경없이 다른 플랫폼으로 이식될 수 있습니다.

    • 기상 데이터 읽기 및 쓰기

      • GRIB코드 (GRIdded Binary, FM 92 GRIB)는 컴퓨터 하드웨어와 관계없는 압축된 이진 코드입니다. 기상 산업에서 수치 예측 분석 및 예측을 위한 격자 (그리드) 데이터를 저장하는 데 일반적으로 사용되고 현재 GRIB 코드는 GRIB 1 과 GRIB 2의 2가지 형식이 있습니다.

      • IDL은 데이터를 직접 읽고 쓸 수있는 GRIB 1 및 GRIB 2에 대한 읽기 및 쓰기 기능을 제공합니다. 반면에 기존의 바이너리 파일과 아스키 코드 및 일반적인 이미지 파일 형식 (JPG, BMP, PNG 및 TIFF 등) 및 과학자료 처리 데이터 수집 형식 (NetCDF, HDF, HDF5 등)에도 활용됩니다.

     

     

    • 일기 예보 및 데이터의 2D 및 3D 시각화

      • 일기 예보의 정확성은 많은 양의 데이터 계산 및 결과의 시각화 분석에 달려 있습니다. 과학적 계산은 숫자를 바람 벡터, 등압면, 등온선, 구름, 바람 등과 같은 이미지로 변환하여 미래 날씨를 정확하게 분석하고 예측할 수 있도록 합니다.

      • IDL을 사용하면 선 그래프, 이미지, 등고선, 볼륨 데이터 표시와 같은 풍부한 시각화 효과를 쉽게 얻을 수 있습니다. 또한 OpenGL 소프트웨어 및 하드웨어 가속을 지원하여 2D 및 3D 데이터 분석, 이미지 처리, 시각화, 3D 모델링 및 가상 현실의 구현을 가속화할 수 있습니다.

     

     

    • 3차원 그래픽 이미지의 디스플레이

      • 이는 대기 환경의 3차원 장면과 대기 매개 변수의 공간 분포를 동시에 직관적으로 표시하고 3차원 지형 및 초목 원격 감지 맵을 중첩하여 대기 환경의 수치 시뮬레이션 효과를 보다 현실적으로 모의할 수 있습니다.

     

     

     

    • 기후 모니터링 분석

      • 다중 시간 온도 모니터링 데이터에 따르면 IDL의 분석 및 시각화 기능을 사용하여 기상 조건 및 추세를 연구 및 예측하고 기후 변화를 요약 할 수 있습니다.

      • 또한 지구 온도 데이터의 시각화, 복잡한 그래픽을 간단하게 구현 가능합니다. 즉 이미지 데이터를 구체에 투영하여 지구 객체를 생성하고 실제 지리 좌표의 데이터셋 (위도, 경도, 고도)를 기반으로 3 차원 격자화합니다. 그리고 해당 지점의 온도 값에 따라 3 차원 등위면 객체를 생성합니다.

     

     

    • 날씨 시뮬레이션

      • IDL의 3 차원 렌더링, 볼륨 데이터 처리 및 디스플레이 기능은 기상학의 자연 현상을 시뮬레이션하고 분석할 수 있습니다. 이러한 시뮬레이션 분석은 다양한 기상 현상의 물리적 형성 과정을 기반으로 하며 수학적 모델의 단순화를 기반으로 모의합니다. 

      • 예를 들어 DEM 데이터와 지표면 이미지를 입력하고 새로운 물리적 모델 객체를 생성합니다. 3D 재구성을 위해 DEM 파일과 지표면 이미지를 선택하고 유연하고 직관적인 3D 환경을 구축할 수 있습니다.

      • 그리고 클라우드에 의해 생성된 동적 디스플레이 프로세스에서 벡터 필드 중첩, 온도 및 압력 환경 렌더링, 온도 및 압력 등위면 생성과 같은 프로그램의 원래 기능뿐만 아니라 프로세스에서 대기 환경의 실시간 분석을 수행하는 데 사용될 수 있습니다.

     

     

    • 따라서 이 포스팅에서는 대기과학 전공자를 위한 IDL를 소개해 드리고자 합니다.

    • 추가로 지구물리 원격탐사에 대한 이론적 배경을 소개한 링크를 보내드립니다. 

     

    [강릉원주대 대기환경과학과] 2015년 2학기 전선 지구물리 원격탐사 소개 및 과제물

    정보 업무명 : 2015년 2학기 전선 지구물리 원격탐사 소개 및 과제물 작성자 : 이상호 작성일 : 2019-12-20 설 명 : 수정이력 : 내용 [특징] 지구물리 원격탐사 수업에 대한 이해를 돕기위해 작성 [기능] 소개 주..

    shlee1990.tistory.com

     

    [특징]

    • 대기과학 자료 처리를 위해서 IDL 프로그래밍 언어가 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 기술서

     

    [기능]

    • IDL 소개

     

    [활용 자료]

    • 없음

     

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

    • 없음

     

    [사용법]

    • 없음

     

    [사용 OS]

    • Windows 10

     

    [사용 언어]

    • IDL v8.5

     

     세부 내용

    [소개]

    • 다양한 수학 함수, 자료분석 도구, 과학적 시각화 (scientific  visualization) 및 동영상 애니메이션 도구 (animation tools) 등을 이용하여 일반적인 과학 계산 및 통계 분석 그리고 자료의 시각화 등을  수행할 수 있는 프로그램 언어

    • 특히 천문학 및 인공위성 자료 처리, 이미지 처리 (image  processing) 등에 많이 활용 

    • 사용 OS

      • Windows XP/10, Linux, Mac

     

    [사용법]

    • IDL 사용 모드

      • 1) GUI (Windows),

      • 2) command line (Linux, Mac)

      • 3) batch  mode (Linux, Mac)

    • 시작하기

      • 시작 명령어 : idl 또는 idlde

      • Type a question mark "?" for online help if you are running X (o또는  PC에서 사용할 때(idlde)

      • Type “help” to get information about the variables on the memory

      • Type “help var” to get information about the variable, “var”

    • 끝내기 : exit 명령어를 이용

    • 다음 예시와 같이 명령어를 통해 확인

     

    a = 5
    
    print, a
    
    a = [2, 3]
    
    print, a
    
    help, a

     

     

    • 이번에는 test.pro (확장자는 *.pro를 사용)라는 텍스트 파일을 만들고 위의 명령어들을 복사한 뒤 저장하고 프로그램을 실행시켜 보자.

      • 실행방법

        • Window OS

          • test.pro 프로그램 파일을 IDL에서 열고 <Ctrl + F8> 단축키를 통해 컴파일 후  <F8>키로 프로그램 실행

        • Command Line Mode (Linux / Unix / Mac)

          • 컴파일 및 프로그램 실행

            • IDL> .r test.pro

            • IDL> test
          • 동시에 컴파일 및 프로그램 실행

            • IDL> idl -e test

     

    [프로그램의 컴파일, 실행, 중지, 재실행에 대한 명령어]

    • .run 또는 .r

      • 버퍼에 주 프로그램, 서브 프로그램, 함수 등을 파일로 저장하고 그 파일을 컴파일함

      • IDL> .run <프로그램 이름>

    • .rnew

      • ".run"과 비슷하며 기존의 주 프로그램에 있는 변수를 모두 지우고 다시 “.run”을 실행함

      • IDL> .rnew <프로그램 이름>

    • .compile

      • 주 프로그램이 아닌 서브 프로그램 (or 프로시저)이나 함수를 컴파일함

      • IDL> .compile <프로그램 이름>

    • -c

      • 프로그램의 실행 중에 프로그램 버그가 발견되거나 연산이 매우 길어서 오랜 시간이 소요될 경우  프로그램 실행을 종료함

    [특수 문자들]

    특수문자

    기 능

    !

    IDL 시스템 변수명을 나타내는 첫 문자  예) !pi

    문자열 상수, 8진수 상수, 16진수 상수에 대한 부분의 범위를 한정

    ;

    주석문임을 표시

    $

    현재 문장의 끝에 표시하여 다음 문장이 현재 문장과 연결됨을 표시함 

    단, 문자열 상수 안에서는 효력이 없음

    예) IDL> print, ‘hello ‘, $  ‘class!!’

    8진수 앞에 오며 문자열 상수의 범위를 한정함

    예) IDL>y=“100B”

    IDL> print, “This is test. haha…”

    &

    한줄에 여러 개의 문장 (statement)을 사용할 때 명령어 사이를 분리하는 표시

    예) IDL> a=2 & b=3 & print, a, b, a+b

     

    [프로그램 파일 형식]

    • 일반적으로 주 프로그램 (main program)의 시작은 "PRO <프로그램명>"으로 끝은 "END"로 끝맺음 

    • 서브 프로그램 (Fortran의 subroutine에 해당)의 경우 주 프로그램과 마찬가지 형식으로 시작과 끝을 표시함

      • 단, "END" 바로 이전 줄 (line)에  "RETURN" 명령을 넣는 것이 좋음

    • Function의 경우 "FUNCTION <함수명>"으로 시작하여 마지막에서 2번째 줄에는 "RETURN, <함수로 계산한 변수이름>" 그리고 마지막줄에는 "END"로 끝을 맺음 

    • Fortran과 마찬가지로 프로그램 내에서 대/소문자를 구별하지 않음

    • 프로그램의 각 line에서 시작 위치에 구애 받지 않음

    • 일반적으로 주 프로그램명과 프로그램의 파일이름을 일치시키는 것 

     

    PRO test
    
        a = 5
        
        print, a
        
        a = [2, 3]
        
        print, a
        
        help, a
    
    END

     

     

    ; 주 프로그램 시작 (파일명: test2.pro)
    PRO test2
        
        ; 스칼라 변수값 지정
        a = 5.0 & b = 7
      
        ; 서브 프로그램 호출
        calc_sum, a, b, c
      
        ; 계산 결과(변수 c)를 화면에 출력
        print, c
        
        ; 변수 c에 대한 정보를 화면에 출력
        help, c
        
        ; 벡터 변수 a를 새로 지정 (이전의 a값은 영구 소멸)
        a = [2, 3, 7]
        
        ; 벡터 변수 b를 새로 지정 (이전의 b값은 영구 소멸)
        b =[10, 100,1000]
        
        ; 서브 프로그램 호출
        calc_sum, a, b, c
      
        ; 계산 결과(변수 c)를 화면에 출력
        print, c
     
        ; 변수 c에 대한 정보를 화면에 출력
        help, c
      
        a = [2, 3, 7]
      
        b =[10, 100,1000, 10000]
      
        calc_sum, a, b, c
      
        help, c
    
    ; 프로그램의 끝을 표시
    END
    
    
    ; 서브 프로그램 시작
    PRO calc_sum, a, b, c
    
        ; 계산식
        c = a + b
        
        ; 서브 프로그램을 끝내면서 주 프로그램으로 반환 명령어
        RETURN
    
    END

     

     

    ; 주 프로그램 시작 (파일명: test3.pro)
    PRO test3
    
        ; 스칼라 변수값 지정
        a = 5.0 & b = 7
      
        ; 서브 프로그램 호출
        calc_sum, a, b, c
      
        ; 계산 결과(변수 c)를 화면에 출력
        print, c
      
        ; 변수 c에 대한 정보를 화면에 출력
        help, c
      
        ; 벡터 변수 a를 새로 지정 (이전의 a값은 영구 소멸)
        a = [2, 3, 7]
      
        ; 벡터 변수 b를 새로 지정 (이전의 b값은 영구 소멸)
        b =[10, 100,1000]
      
        ; 서브 프로그램 호출
        calc_sum, a, b, c
      
        ; 계산 결과(변수 c)를 화면에 출력
        print, c
      
        ; 변수 c에 대한 정보를 화면에 출력
        help, c
      
        a = [2, 3, 7]
      
        b =[10, 100,1000, 10000]
      
        calc_sum, a, b, c
      
        help, c
    
    ; 프로그램의 끝을 표시
    END
    
    
    ; function 시작
    FUNCTION calc_sum, a, b, c
    
        ; 계산식
        c = a + b
    
        ; function을 끝내면서 주 프로그램으로 변수 c 반환 명령어
        RETURN, c
    
    END

     

     

    [Variables and arithmetic]

    • You can explicitly "type" variables. IDL is very good about adapting  variables to the right type, even within procedures. Try some of the  following to get used to the syntax. The simplest thing to work with is  scalars.

    • 참고 문헌

      • IDL programs can be stopped using control+C. (Hold down the control key  and hit the letter c)

      • IDL can be aborted immediately using control+\. (All variables are lost and  the state of open files will be uncertain)

      • 커멘트 (comment) : ";"기호가 있는 라인에서 그 이후 내용을 커멘트로 만듬  

     

    PRO tmp
    
        x = 3
        y = 2.5
        
        z = x + y
        
        w = x^y + sin(z) 
        
        print, x, y, z, w
        
        ; Square braces are used to define vectors (1-dimensional arrays)
        v1 = [1, 2, 0]
        v2 = [1,  0, 0]
      
        print, "v1 = ", v1
        
        print, "v2 = ", v2
    
    END

     

     

    PRO tmp
    
        ; Scalars and arrays can be allocated with specific types. Scalar examples
        x = float(1.3)
        sx = fix(x)
        lx = long(x)
        bx = byte(x)
        dx = double(x)
        cx = complex(x)
        
        print, x, sx, lx, bx, dx, cx 
    
        ; Array examples I  
        a = fltarr(5) 
        
        for i = 0, 4 do a(i) = 2 * i
        b = complex(a)
        
        ; Array examples II
        a = fltarr(10) 
        b = findgen(10)
        c = intarr(10)
        d = indgen(10)
        
        print, a
        print, b
        print, c
        print, d
        
    END

     

     

    [Numeroc data types]

     

    [Type syntax and conversion functions]

     

    [Reserved words in IDL]

     

    [Zeroed and index array creation functions]

     

    [IDL operators]

     

    [Functions for determining array properties]

     

    PRO test4
    
        ; this is a comment.
        a = findgen(10) 
      
        print, a
      
        for i=0, 9 do begin
          if (a[i] gt 5 and a[i] le 7) then a[i] = -1.0 * a[i]
        
          if (a[i] gt 8) then begin
            
            a[i] = a[i]+1000.
          endif else begin
            
            a[i] = a[i] + 10.
            
            if (a[i] ge 10 and a[i] lt 12) then begin
              
              print, i, a[i], format=‘(i2,3x,f7.2)’
            endif
          endelse
      endfor 
      
    END

     

     

    [Matrices]

    • A matrix (a 2-dimensional array) may be defined algorithmically

    PRO tmp
    
        a = dblarr(2, 4) 
        
        for i = 0, 1 do begin
            for j = 0, 3 do begin 
              a(i, j) = 10 * i + j
            endfor 
        endfor 
          
        print, a 
        
    END

     

     

    • Note that as it is printed, the first index corresponds to the column, and the  second index to the row. Another way to think of it is that the way the data is  stored, the first index varies fastest, and the second varies the slowest. This  agrees with the way the data is printed.

    • The WHERE function can be extremely useful. Play around with it.

    • Watch out, the results of the WHERE function 2-D arrays are confusing, because  they return single-valued indices, but they work. (Continuing from the previous  example)

    PRO tmp
    
        a = dblarr(2, 4)
    
        for i = 0, 1 do begin
          for j = 0, 3 do begin
            a(i, j) = 10 * i + j
          endfor
        endfor
    
        print, a
    
        b = [1, 2, 3, 4, 5, 6, 7, 8] 
        
        PRINT, WHERE(b GT 2 AND b le 7)
        
        print, WHERE(a GT 10 AND a LT 13) 
        
    END

     

     

    PRO tmp
    
        ; A matrix may be constructed explicitly from vectors
        v1 = [1, 2, 0] 
        v2 = [1, 0, 0]
        v3 = [4, 5, 6]
        A = [[v1], [v2], [v3]]
        
        print, A
    
        ; Create the transpose:
        Atrans = transpose(A)  
        
        print, Atrans
    
        ; Take  the determinant:
        d = determ(float(A))
        
        print, d
    
        ; Multiply vectors by matrices:
        v1 = [1, 2, 0] & v2 = [1, 0, 0] & v3 = [4, 5, 6]
        A = [[v1], [v2], [v3]]
        v = [1, 2, 3]
        
        print, A ## v 
        print, v ## A
    
    END

     

     

    [주의]

    • IDL은 크기가 서로 다른 벡터나 행렬을 일반 연산자 (행렬 연산자가 아닌)를  이용하여 연산하는 경우 에러 메세지가 나타나지 않고 행렬이나 벡터의  원소 (elements)들 중 앞에서부터 차례로 짝을 맞추어 연산을 함

    • IDL은 대문자와 소문자를 구별하지 않음

    PRO tmp
    
        v1 = [1, 2, 0] & v2 = [1, 0, 0] & v3 = [4, 5, 6] 
        a = [[v1], [v2], [v3]] 
        v = [1, 2, 3]
        
        c = a + v
        d = v + a
         
        help, c  
        help, d  
        print, c  
        print, d  
        print, a 
    
    END

     

     

    [간단한 그림 그리기]

    • !pi = π (=3.14159….) 

    • !dpi = π (double-precision) 

    • !radeg = 180./π 

    • !dtor = π/180.

    PRO tmp
    
        x = findgen(100) 
        y = sin(!pi * x / 8.0)
        
    ;    plot, x, y 
    ;    plot, x, y, psym = 2, symsize = 1.8, title = "y = sin(!pi*x/8.0)" 
    ;    plot, x, y, psym = 4, symsize = 1.8, title = "y = sin(!pi*x/8.0)" 
    ;    plot, x, y, psym = -2, symsize = 1.4, title = "y = sin(!pi*x/8.0)" 
        plot, x, y, psym = -2, symsize = 1.4, title = "y = sin(!pi*x/8.0)", xtitle = "X lab", ytitle = "Y lab" 
    ;    plot, x, y, linestyle = 0 
    ;    plot, x, y, linestyle = 1 
    ;    plot, x, y, linestyle = 2
    
    END

     

     

    [IDL과 관련된 유용한 인터넷 주소들]

    • 프로그램 제작/판매 회사

    불러오는 중입니다...

     

     

    The IDL Astronomy User's Library

      The IDL Astronomy User's Library The IDL Astronomy Users Library is a central repository for low-level astronomy software written in the commercial language IDL. The Library is not meant to be an integrated package, but rather is a collection of procedur

    idlastro.gsfc.nasa.gov

     

    • Coyote's Guide to IDL Programming

     

    Coyote's Guide to IDL Programming

     

    www.idlcoyote.com

     

    • Basic IDL routines for atmospheric science applications

    불러오는 중입니다...

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

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

    • sangho.lee.1990@gmail.com

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

    • saimang0804@gmail.com

     

     

     

     

     

     

    본 블로그는 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기