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

 정보

  • 업무명    : 그누플롯 이어도 종합해양과학기지에서의 일사량 관측 자료를 이용한 날짜 변환 (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