戻る

太陽高度角と方位角、散乱、直達への分配

太陽高度角と方位角の計算

(Fortran90) プログラムのダウンロード
( C 言語版も書きました (2009.4.1)
研究室の皆さん

玉川です。太陽高度角と方位角を計算するプログラムを書いてみました。
計算方法は、 太陽天頂角・太陽方位角の算出方法 (九州大学の村上拓彦氏のWWW頁)によります。
以下につけたようなもので
最初の program 〜 end までは、テスト用のメインプログラムです。
その下以降を自分のソフトに組み込んで使って下さい。
使い方は、見れば分かりますよね。サブルーチン自体の 計算結果はラディアンですので、注意して下さい。
2008.1.18
program test

 integer :: year, month, day    ! month (1-12)
 integer :: md(12)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
 integer, external :: day_of_year
 integer :: yday
 real    :: hour, elevation, azimuth, fact
 integer :: i, j

 fact = 3.1415/180

 year = 2008; month = 7; day = 1

  yday = day_of_year(year, month, day)

  do i=0, 24
  hour = i
  call  solang2( yday, hour, elevation, azimuth )

   write(*,*) year, month, day, hour, elevation/fact, azimuth/fact
  end do

end





integer function day_of_year( year, month, day )
implicit none
! calculate day of year ( Jan.1 = 1 ... )
 integer :: year, month, day    ! month (1-12)
 integer :: md(12)=(/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
 integer :: i, result

 if( mod(year,4)==0 ) then
   if( mod(year, 100)==0 ) then
     if( mod(year, 400)==0 ) then
        md(2)=29
     else
        md(2)=28
     end if
   else
       md(2)=29
   end if
 else
       md(2)=28
 end if
  
 result = 0
 do i=1, month-1
  result = result+md(i)
 end do

 result = result + day

 day_of_year = result

end function


 




subroutine solang2( yday, hour, elevation, azimuth )
implicit none

!  calculate solar elevation angle and azimuthal angle
!   using day_of_year, and time (hour)
! latitude and longitude of the place is set below
!  also latitude of the place for time   (JST)
!    elevation, azimuth  in radian

!  from http://ffpsc.agr.kyushu-u.ac.jp/forman/muratac/solar/solpos1.html
!      it say 'from 6s'

 real, parameter :: pi = 3.14159265358979323846
 integer :: yday
 real    :: hour, elevation, azimuth

 real    :: lat = 35+10.0/60.0, lon = 136+57.9/60.0    ! Nagoya (JMA)
 real    :: lat1, lon1
 real    :: timelon = 135.0

 real    :: declination ! Solar declination  (SEKII)
 real    :: A, B, et

 real    :: localtime, t
 real    :: coszenith, sinkai, coskai, kai, kai1


   lat1 = lat * pi/180
   lon1 = lon * pi/180

   A = 2 * pi * yday / 365

    declination = 0.006918 - 0.399912*cos(A)+0.070257*sin(A) &
       -0.006758*cos(2*A) + 0.000907*sin(2*A) & 
       - 0.002697*cos(3*A) + 0.001480 * sin(3*A) 

   localtime = hour + (lon-timelon)/15

    B = 2*pi*yday/365
    et = (0.000075 + 0.001868 * cos(B)  -0.032077*sin(B) &
           -0.014615 * cos(2*B) -0.040849 * sin(2*B) ) * 12 / pi
    t = 15 * (pi/180) * ( localtime + et - 12 )

    coszenith = sin(declination)*sin(lat1) &
                            +cos(declination)*cos(lat1)*cos(t)
    elevation = 0.5*pi - acos(coszenith)

    sinkai = cos(declination)*sin(t)/sin(0.5*pi-elevation)
    coskai = (-cos(lat1)*sin(declination)+sin(lat1) &
            *cos(declination)*cos(t))/sin(0.5*pi-elevation)
    kai = asin( sinkai ) ;

    if( coskai < 0 ) then
    	kai1 = pi - kai
    else if( coskai > 0 .AND. sinkai < 0 ) then
    	kai1 = 2*pi+kai
    else
    	kai1 = kai
    end if

    kai1 = kai1+pi
    if(kai1>2*pi) then
    	kai1 = kai1 - 2*pi
    end if

    azimuth = kai1

!    write(*,*) 'delta', (180/pi)*declination, &
!    			'time angle', (180/pi)*t, 'et', et

end subroutine
    	



散乱、直達への分配

日射量を読んで、散乱、直達、太陽高度、太陽方位角 を 出力するプログラム例
(無テストなので、注意して使用の事) 放射の分配は、
Spitters, C.J.T., Toussaint, H.A.J.M. and Goudrian, J.
Separating the diffuse and direct component of global radiation and its implicat
ions for modeling canopy photosynthesis, part I. components of incoming radiatio
n
Agricultural and forest meteorology, 38,(1986) 217-229
による。
2008.1.21 関数部分だけ C 版も書いてみました。 ここ 、 上のC版と合わせると使えると思います。(2009.4.1)