반응형

     정보

    • 업무명    : 그누플롯 이어도 종합해양과학기지에서의 일사량 관측 자료를 이용한 날짜 변환 (10 진수) 및 시계열 가시화 자동화

    • 작성자    : 이상호

    • 작성일    : 2020-05-04

    • 설   명    :

    • 수정이력 :

     

     내용

    [개요]

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

    • 태양복사의 경우 대기 중의 기체와 구름 및 에어로졸들에 의해 흡수 및 산란하고 지구 복사에서는지표면과 대기 및 구름 등에 의한 적외복사 방출합니다.

     

     

    • 이러한 지표면 복사 관측 자료는 크게 복사 관측 장비 (WRC: World Radiation Center, BSRN: Baseline Surface  Radiation Network)에 의한 지상 관측소대기복사 이론, 복사 모델, 인공위성 알고리즘 그리고 해상 관측소 (주변환경에 의해 지표면 알베도, 건물 및 산악 반사, 대기오염 변화 최소)에서 얻을 수 있습니다.  

    • 이러한 자료는 지구-지구대기의 기후와 대기성분 (수증기와 이산화탄소 및 오존 등의 가스, 에어로졸, 미세먼지, 구름 등)의 변화 분석 연구 기초 자료뿐만 아니라 인공위성의 알고리즘 검증과 더불어 지구 대기의 시공간 에너지 변화와 신재생에너지(태양광) 개발과  로 인해 막대한 경제 효과를 기여합니다.

    • 특히 해상 관측소인 이어도 종합해양과학기지는 다음과 같은 장/단점이 있습니다.

      • 장점

        • 지형 효과 (지표면과 건물 및 산악 등)가 일정하고 산업활동에 의한 대기오염물질 최소화 > 자료 분석 용이 및 정확성 향상

        • 지표면 복사 관측의 기준 값과 기후 자료 및 인공위성 자료 검보정 등에 활용

      • 단점

        • 복사 관측장비의 유리돔에 해염 부착

        • 관리  : 복사관측 장비의  접근성이 용이하지 못함 > 관측 자료 정확성에 악영향

     

     

    • 그럼에도 불구하고 이어도 종합해양과학기지 복사관측소는 전 세계적으로 많지 않는 희귀 관측소들로서 이곳에서 생산되는 자료들은 매우 중요하게 활용될 수 있습니다.

    • 특히 중국에서 날아오는 황사와 미세먼지 등은 한반도 대기 청정도와 국민 건강을 크게 위협하고 있으며 그에 따른 대기 질의 변화는 전 세계 과학자들의 중요 관심대상입니다.

    • 따라서 이어도 종합해양과학기지 복사관측소 자료는 해양관측소라 자료라는 희귀성 뿐만 아니라 한반도 대기오염  문제 해결을 위한 기초 자료로서의 역할이 매우 막중하기 때문에 이들 해양과학기지의 복사관측소 관측자료 분석은 선택이 아닌 필수 요소이다.

    • 오늘 포스팅에서는 이어도 종합해양과학기지에서의 일사량 관측 자료를 이용한 날짜 변환 (10 진수) 및 시계열 가시화 자동화를 소개해 드리고자 합니다.

     

    [특징]

    • 시계열 가시화를 이해하기 위해 10 진수 변환이 필요하며 이 프로그램은 이러한 목적을 달성하기 위해서 고안된 소프트웨어

     

    [기능]

    • 시계열 데이터셋을 이용한 일별 분할 및 자료 전처리

    • 일별 자료를 이용하여 통계 계산

    • 그누플롯을 이용한 시계열 가시화

     

    [활용 자료]

    • 자료 : 년, 월, 일, 시, 분, 초, 전천 일사량

    • 기간 : 2004년 11월 25일 - 2015년 12월 31일

    • 장비 : MS-802 (EKO 사)

    • 해상도 : 매 1분

    • 제공처 : 이어도 종합해양과학기지

     

     

     

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

    • 없음

     

    [사용법]

    • 소스 코드를 참조

    • 가시화 결과를 확인

     

    [사용 OS]

    • Linux (CentOS v7.3)

     

    [사용 언어]

    • Gnuplot

    • ShellScript (csh)

     

     소스 코드

    [명세]

    • 시계열 데이터셋을 이용한 일별 분할 및 자료 전처리

      • 앞서 활용 자료에서와 같은 년 (year), 월 (month), 일 (day), 시 (tt), 분 (mm), 초 (dd), 전천 일사량 읽기 (dsr)

      • 반복문 수행하면서 1줄마다 날짜 정보를 이용하여 연도 (xran) 및 일 (xran2)에 대한 10 진수 변환

      • open 및 write를 통해 시간 (tt)이 9-16시 그리고 일마다 자료 출력

      • 포트란 컴파일 (pgf90 1.f90) 및 실행 (a.out)

    #!/bin/csh
    
    #rm -f TOTAL.dat  OUTPUT/*  FIG/*
    
    #=======================================
    #     Day Division
    #=======================================
    cat >! 1.f90 << EOF
          integer :: year, month, day, tt, mm, dd
          real(8) :: dsr, xran, xran2
          real(8), dimension(12) :: mm2
          character(100) :: fn
    
          mm2 = reshape( (/31,28,31,30,31,30,31,31,30,31,30,31/), (/12/) )
    
          open(10, file='DATA_L1')
    
       10 read(10,*, end=99) year, month, day, tt, mm, dd, dsr
          if( (mod(year,4) == 0 .and. mod(year,100) /= 0) .or. mod(year,400) == 0 ) mm2(2)=29
    
    
          xran = real(year) + ((real(month)-1.d0)/12.d0) &
                            + ((real(day)-1.d0)/(12.d0*mm2(month))) &
                            + ((real(tt))/(12.d0*mm2(month)*24.d0)) &
                            + ((real(mm))/(12.d0*mm2(month)*24.d0*60.d0)) & 
                            + ((real(dd))/(12.d0*mm2(month)*24.d0*60.d0*60.d0))
    
          xran2 = real(tt) + ((real(mm))/(60.d0)) & 
                            + ((real(dd))/(60.d0*60.d0))
    
          if (tt>=9 .and. tt<=16 ) then
             write(fn, '(i4,i2.2,i2.2)') year, month, day
             open(11, file='OUTPUT/'//trim(fn)//'.dat')
             write(11,'(3f15.7)') xran, xran2, dsr
          endif
          write(*,*) fn
    
    
          goto 10
       99 end
    EOF
    pgf90 1.f90   ;  a.out

     

    • 출력 디렉터리 (OUTPUT)

     

    • 출력 결과 (20041203.dat)

     

    • 일별 자료를 이용하여 통계 계산

      • ls 및 foreach를 통해 OUTPUT 하위 디렉터리 파일명 (fn1)에 대해 반복문 수행

      • read를 통해 동적 파일명에 대한 자료 읽기

      • 일 평균 (Daily Mean), 일 누적 (Daily Accumulation), 자료 개수 (N) 수행

      • write(1, format)를 통해 임시 파일명 (fort.1) 설정

      • 포트란 컴파일 (pgf90 2.f90) 및 실행 (a.out)

    #=======================================
    #     Day Mean, Day Accumulation, N
    #=======================================
    set fn = `ls OUTPUT/*`
    #set fn = (OUTPUT/20050401.dat  OUTPUT/20120526.dat  OUTPUT/20120724.dat  OUTPUT/20050201.dat  OUTPUT/20070517.dat)
    # set fn = (OUTPUT/20050713.dat)
    #set fn = `ls OUTPUT/20050401.dat`
    foreach fn1 ($fn)
    cat >! 2.f90 << EOF
          real :: cc, SUM_xran, SUM_dsr, xran, xran2, dsr
    
          open(10,file='${fn1}')
    
          cc=0.0  ;  SUM_xran=0.0  ;  SUM_dsr=0.0
    
      10  read(10,*,end=99) xran, xran2, dsr
          cc=cc+1.0
          SUM_xran = SUM_xran + xran
          SUM_dsr = SUM_dsr + dsr
          goto 10
    
      99  write(1,'(3f10.2, i5)') SUM_xran/cc, SUM_dsr/cc, (SUM_dsr/(10.d0**6.d0))*60.d0, int(cc)
          end
    EOF
    pgf90 2.f90  ;  a.out

     

    • 그누플롯을 이용한 시계열 가시화

      • 앞서 동적 파일명 (fn1)를 fn2로 변수 설정

      • awk를 통해 통계 파일명 (fort.1)에서 일 평균 (Day_Mean), 일 누적 (Day_Acc), 자료 개수 (N) 추출

      • 그누플롯을 통해 set label 및 x축 및 y축 설정

      • 그누플롯 수행 결과 (1.png)를 mogrify로 90도 회전

      • mv를 통해 그림 디렉터리 (FIG)에 저장

      • rm를 통해 임시 파일명 (fort.1) 삭제

    #==================================
    #     Plot
    #==================================
    set fn2 = `echo $fn1:t | awk -F'[/.]' '{print $1}' `
    set Day_Mean = `awk '{print $2}' fort.1`
    set Day_Acc = `awk '{print $3}' fort.1`
    set N = `awk '{print $4}' fort.1`
    echo $fn1
    gnuplot << EOG
    set terminal post enhanced color font "Times-Roman-bold, 24" background rgb "white" 
    set output "1.png"
    
    #set label "Daily Mean = $Day_Mean [W/m^{2}]" at 9.5, 1300 font ",22" 
    #set label "Daily Accumulation = $Day_Acc [MJ/m^{2}]"  at 9.5, 1180 font ",22"
    #set label "N = $N" at 9.5,1060  font ",22"
    set label "Daily Mean = $Day_Mean [W/m^{2}]" at 9.5, 5250 font ",22"
    set label "Daily Accumulation = $Day_Acc [MJ/m^{2}]"  at 9.5, 4750 font ",22" 
    set label "N = $N" at 9.5,4250  font ",22"
    
    set grid 
    set key Left
    #set key top right
    set key font ", 20"
    set grid
    set key Left
    set key reverse
    #set key noopaque
    
    set title "July  13,  2005" 
    set title font ", 24" textcolor rgb "black"
    
    set xlabel "Time  [Hour]" 
    set xlabel  font ", 24" textcolor rgb "black" norotate
    set xrange [ 9 : 17 ] noreverse nowriteback
    set xtics in 9, 1, 17 font ", 24"
    set mxtics 2
    
    #set ylabel "IEODO  Measurement  [Wm^{-2}]" 
    #set ylabel "Surface  Solar  Radiation  (IORS)  [W/m^{2}]" 
    set ylabel "10-Minute  Solar  Radiation  (IORS)  [W/m^{2}]" 
    set ylabel  font ", 24" textcolor rgb "black" rotate by -270
    #set yrange [ 0 : 1400 ] noreverse nowriteback
    #set ytics in 0, 200, 1400 font ", 24"
    set yrange [ 0 : 5500 ] noreverse nowriteback
    set ytics in 0, 500, 5500 font ", 24"
    set mytics 2
    
    if (${N} < 60) {
    plot "${fn1}" u 2:3 w p pt 7 ps 2 lc "black"  t "",\
         ""       u 2:3 w l ls 1 lw 3 lc "black" notitle
    } else {
    plot "${fn1}" u 2:3 w p pt 7  lc "black" t "DSR"
    }
    EOG
    
    mogrify -rotate 90 -matte -background none 1.png
    display 1.png
    
       mv -f 1.png FIG/${fn2}.png
    end
    
    
    rm -f 1.f90 2.f90 1.dat  fort.1

     

    • 과거 일사관측 자료 분석

      • 이어도 현장에 서버에 저장 > 위성 통신을 통해 해양연구원 본원에 전송 (관측센서의 오작동, 전송장치의 오작동 및 작동 중단,  자료수신 및 처리 소프트웨어의 오류 발생)

     

    • 자료가 누락된 경우

     

    • 극대값이 관측

     

    • 극소값이 관측

     

    • 반복적인 값이 관측 (Case 1)

     

    • 반복적인 값이 관측 (Case 2)

     

     

    • 불규칙한 값이 관측

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

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

    • sangho.lee.1990@gmail.com

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

    • saimang0804@gmail.com
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기