[Fortran] 포트란 지상 관측소를 기준으로 근접한 1/4/9 위성 픽셀에 대해 평균 수행

 정보

  • 업무명    : 포트란 지상 관측소를 기준으로 근접한 1/4/9 위성 픽셀에 대해 평균 수행

  • 작성자    : 이상호

  • 작성일    : 2019-08-25

  • 설   명    :

  • 수정이력 :

 

 내용

[특징]

  • 위성 자료와 지상 관측소를 공간 일치를 위한 소프트웨어가 필요하며 이 프로그램은 이러한 목적을 이러한 목적을 달성하기 위해 고안된 소프트웨어

 

 

[기능]

  • Terra/MODIS 자료에 대한 위경도 및 이진 자료 읽기

  • 해당 이진 자료를 이용하여 식생지수 (NDVI)로 변환

  • 지상 관측소의 위·경도를 기준으로 거리 계산 및 1/4/9 격자 평균 수행

 

[사용법]

  • 입력 자료 (Terra/MODIS 위·경도 및 이진 자료)를 동일 디렉터리에 저장

  • 소스 코드를 컴파일 (gfortran Average_Over_Satellite_Pixels_Relative_To_Ground_ Station.f90)

  • 소스 코드를 실행 (./a.out)

  • 각 관측소의 평균값을 확인

 

[사용 OS]

  • Linux

 

[사용 언어]

  • Fortran

 

 소스 코드

[전체]

      implicit none
      integer, parameter :: X_MAX = 2030 , Y_MAX = 1354 , XY_DATA = 2752681
      integer, parameter :: NaN = 0
!      real, parameter :: add_offset = 0.49 , scale_factor = 0.002 ! Emis
      real, parameter :: add_offset = 0.00 , scale_factor = 0.02    ! LST
      
      integer :: i, j, m, n, l, mm, ll, ii
      integer :: cc, cc1, cc2, cc3, cc4
      real :: read_lat, read_lon
      real :: MIN_dd, MIN_dd2
      real,allocatable,dimension( : , : ) :: NDVI,lat,lon,dd, dd2
      real,allocatable,dimension( : ) :: Point_lat, Point_lon
      allocate(lat(100000,100000), lon(100000,100000), NDVI(100000,100000), &
               dd(10000,10000), dd2(10000,10000), &
               Point_lat(10000), Point_lon(10000) )
      
      open(10,file='read_lat.dat',status='old',action='read')
      open(11,file='read_lon.dat',status='old',action='read')
      open(12,file='lat.dat')
      open(13,file='lon.dat')
      
      do i=1,XY_DATA
         read(10,'(f10.4)') read_lat
         read(11,'(f10.3)') read_lon

            if(read_lat /= 0.d0) then  ! 빈칸 = 0.0
            if(read_lat < 1.d0) read_lat=read_lat*(10.d0**4.d0) ! 정수는 1 이하로
            write(12,*) read_lat
            endif

            if(read_lon /= 0.d0) then
            if(read_lon < 1.d0) read_lon=read_lon*(10.d0**3.d0) 
            write(13,*) read_lon
            end if
      end do
      
      close (10) ; close (11) ; close (12) ; close (13)
      
      open(14,file='NDVI.dat',status='old',action='read')
      open(15,file='lat.dat')
      open(16,file='lon.dat')
      open(17,file='data.dat')
      open(18,file='Mean.dat')
       

      do i = 1, X_MAX
         read(14,*) NDVI(i,1:Y_MAX)
      enddo

      do i = 1, X_MAX
      do j = 1, Y_MAX
         read(15,*) lat(i,j)
         read(16,*) lon(i,j)
            if(NDVI(i,j) /= NaN) NDVI(i,j) = (NDVI(i,j)*scale_factor) + add_offset
         write(17,*) lat(i,j), lon(i,j), NDVI(i,j)
      end do
      end do
            
      Point_lat = reshape ( (/37.7515, 37.5714, 37.3376, 37.2723, 36.9704, 36.6392, &
                              36.3720, 36.0326, 36.0053, 35.8782, 35.8408, 35.5601, &
                              35.1729, 35.1047, 34.8169, 33.2938, 33.3868, 36.7796/), (/18/) )

      Point_lon = reshape ( (/128.8910, 126.9658, 127.9466, 126.9853, 127.9527, 127.4407, &
                              127.3721, 129.3796, 126.7614, 128.6522, 127.1172, 129.3203, &
                              126.8916, 129.0320, 126.3812, 126.1628, 126.8802, 127.1213/), (/18/) )

      ! 강릉(105), 서울(108), 원주(114), 수원(119), 충주(127), 청주(131)
      ! 대전(133), 포항(138), 군산(140), 대구(143), 전주(146), 울산(152)
      ! 광주(156), 부산(159), 목포(165), 고산(185), 성산(188), 천안(232)
	  do ii = 1, 18
            cc=0 ; cc1=0 ; cc2=0 ; cc3=0 ; cc4=0
       
            do i=1,X_MAX
            do j=1,Y_MAX
               dd(i,j)=sqrt(((Point_lon(ii)-lon(i,j))**2.d0)+((Point_lat(ii)-lat(i,j))**2.d0))
            end do 
            end do
      
            MIN_dd = minval( dd(1:X_MAX, 1:Y_MAX) )
                                                                     !  EX)   (305,244)   (305,245)   (305,246)
                                                                     !        (306,244)   (306,245)   (306,246)
                                                                     !        (307,244)   (307,245) 
            do i=1,X_MAX
            do j=1,Y_MAX
               if( MIN_dd == dd(i,j) ) then                          !  EX)   
                     cc = count( NDVI(i-1:i+1, j-1:j+1) /= NaN )     !                    (306,245)   
                     cc1 = count( NDVI(i-1:i, j-1:j) /= NaN )        !        
                     cc2 = count( NDVI(i-1:i, j:j+1) /= NaN )
                     cc3 = count( NDVI(i:i+1, j-1:j) /= NaN )
                     cc4 = count( NDVI(i:i+1, j:j+1) /= NaN )
      
                     do m=i-1,i+1
                     do l=j-1,j+1
                        if(mod(m+l,2)==mod(i+j,2) .and. l/=j) dd2(m,l)=sqrt(((Point_lon(ii)-lon(m,l))**2.d0)+((Point_lat(ii)-lat(m,l))**2.d0))
                     end do
                     end do
      
                     MIN_dd2 = minval( dd2(i-1:i+1, j-1:j+1), mask=dd2(i-1:i+1, j-1:j+1) /= 0.d0)
      
                                                                     !  EX)   (305,244)               (305,246)
                                                                     !                  cc1        cc2        
                                                                     ! 
                                                                     !                  cc3        cc4        
                                                                     !        (307,244)               (307,246)
                     do mm=i-1,i+1                               
                     do ll=j-1,j+1                               
                        if( MIN_dd2 == dd(mm,ll) ) then

!***************************************  TotalSUM(NDVI(i:i+1, j-1:j), mask=NDVI(i:i+1, j-1:j) /= NaN)/real(cc3), &
                  cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
      
      ! cc4
            if(mm>i-1 .and. ll>j-1) &
                  write(18,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                  i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                  mm, ll, cc4, SUM(NDVI(i:i+1, j:j+1), mask=NDVI(i:i+1, j:j+1) /= NaN)/real(cc4), &
                  cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)


!***************  Each ( fort.21, fort.22, fort.23, fort24 )  *************************************
      write(20+ii,*) 'ASOS Obs', Point_lat(ii), Point_lon(ii)
      write(20+ii,*) 'MODIS Obs', lat(i,j), lon(i,j)

      ! cc1
            if(mm<i+1 .and. ll<j+1) &
                  write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                  i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                  mm, ll, cc1, SUM(NDVI(i-1:i, j-1:j), mask=NDVI(i-1:i, j-1:j) /= NaN)/real(cc1), &
                  cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
      
      ! cc2
            if(mm<i+1 .and. ll>j-1) &
                  write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                  i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                  mm, ll, cc2, SUM(NDVI(i-1:i, j:j+1), mask=NDVI(i-1:i, j:j+1) /= NaN)/real(cc2), &
                  cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
      
      ! cc3
            if(mm>i-1 .and. ll<j+1) &
                  write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                  i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                  mm, ll, cc3, SUM(NDVI(i:i+1, j-1:j), mask=NDVI(i:i+1, j-1:j) /= NaN)/real(cc3), &
                  cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
      
      ! cc4
            if(mm>i-1 .and. ll>j-1) &
                  write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                  i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                  mm, ll, cc4, SUM(NDVI(i:i+1, j:j+1), mask=NDVI(i:i+1, j:j+1) /= NaN)/real(cc4), &
                  cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
!******************************************************************************************************      

                       end if
                                                                     
                     end do ! mm
                     end do ! jj
               end if
            end do  ! i
            end do  ! i
      enddo ! ii
 
      end

 

[GitHub GIST]

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

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

  • sangho.lee.1990@gmail.com

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

  • saimang0804@gmail.com