    program wea2_read
!****************************  プログラム名: wea2_read.f90  ****************************************
! EA気象データ実在年(EADyyyy.wea2), 標準年(RWYyyyy.wea2)を読み込むサンプルプログラム(fortran90)
!
! 読み込むEA気象データファイルとステーションインフォを c:\MDS_Software\EA_Sourceに置いておく。
!  実在年EA気象データのファイル名 : EADyyyy.wea2
!   + 対応するStnInfo : StnInfo_EADyyyy.dat
!  過去標準年のファイル名 : PRY8195.wea2, PRY9100.wea2, PRY0110.wea2, PRY1120.wea2
!    対応するStnInfo : StnInfo_PRY8195.dat, StnInfo_PRY9100.dat, StnInfo0110.dat, StnInfo1120.dat
!  将来標準年のファイル名 : FRY7795.wea2
!    対応するStnInfo : StnInfo_FRY7795.dat
!
! キーボードから地点番号と年を入力する。
!   地点番号は10〜8420を入力する。
!   年は、実在年なら西暦年、標準年なら8195, 9100, 0110, 1120, 7795のどれかを入力する。
!
! 読み込んだ時別値、時別値のリマークを,それぞれ,dath(366,24,10),rmkh(366,24,10)に格納する。
! 読み込んだ日別値、日別値のリマークを,それぞれ,datd(366,10),rmkd(366,10)に格納する。
! dath(366,24,10),rmkh(366,24,10),datd(366,10),rmkd(366,10)はcsvファイル。
!
! 年間日数は閏年を考慮して366日としている。そのため閏年以外の366日の数値は無視すること。

! 出力される地点情報は,地番,年,緯度,経度,標高,風速観測高さ,風速補正高さ,地点名。
! 出力される気象データは, 年間通日, 時刻(時別値の場合), 気象データとそのリマーク。
! 出力される気象要素の名称と単位(時別値)
!     1:気温      [0.1degC],         2:絶対湿度  [0.1g/kg],
!     3:全天日射  [0.01MJ/(m2･h)],   4:大気放射  [0.01MJ/(m2･h)],
!     5:風向      [16方位],          6:風速      [0.1m/s],
!     7:降水量    [0.1mm/h],         8:日照時間  [0.01h/h],
!     9:現地気圧  [hPa],            10:相対湿度  [0.1%].
! 出力される気象要素の名称と単位(日別値)
!     1:日平均気温       [0.1degC],         2:日平均絶対湿度  [0.1g/kg],
!     3:日積算全天日射   [0.1MJ/(m2･day)],  4:日平均大気放射  [0.01MJ/(m2･h)],
!     5:最大風速時の風向 [16方位],          6:日平均風速      [0.1m/s],
!     7:日積算降水量     [mm/day],          8:日積算日照時間  [0.1h/day],
!     9:日平均現地気圧   [hPa],            10:日平均相対湿度  [0.1%].
! 記号
!     num                : 地点番号（ユーザの入力値）
!     iyr                : 年（ユーザの入力値）
!     snum               : 地点番号（weaファイルからの読み取り値）
!     year               : 年（weaファイルからの読み取り値）
!     irec               : レコード番号
!     blc                : ブロック番号
!     etyp               : 気象要素番号
!     ie                 : 気象要素のカウンター(1〜8)
!     nd                 : 日のカウンター(1〜366)
!     hr                 : 時刻のカウンター(1〜24)
!     num1               : 地点番号（Stninfoからの読み取り値）
!     elem(10)           : 気象要素名
!     unith(10)          : 気象要素の単位(時別値)
!     unitd(10)          : 気象要素の単位(日別値)
!     lad,lam            : 緯度(度の整数部)、緯度(度の小数点以下3桁）
!     lod,lom            : 経度(度の整数部)、経度(度の少数点以下3桁)
!     sth                : EA地点の標高
!     woh, wch           : 風速観測高さ、風速補正高さ
!     snam1              : 地点名(漢字)
!     head(366,24)       : wea2フォーマットのヘッダー行
!     dathr(366,24,10)   : 気象データ時別値 + リマーク（wea2ファイルからの読み取り値）
!     datdr(366,10)      : 気象データ日別値 + リマーク（wea2ファイルからの読み取り値）
!     dath(366,24,10)    : 気象データ時別値
!     datd(366,10)       : 気象データ日別値
!     rmkh(366,24,10)    : 時別値のリマーク
!     rmkd(366,10)       : 日別値のリマーク
!     fi1                : wea2フォーマットファイルの読み込み(バイナリーファイル)
!     fi2                : stninfo2ファイルの読み込み(txtファイル)
!     fo1                : 時別値の出力ファイル(csvファイル)
!     fo2                : 日別値の出力ファイル(csvファイル)
!
! ********************************  2022.12.31 MetDS Co.Ltd.  **************************************
    implicit none
    integer*4 irec
    integer*2 num,num1,blc,iyr,ie,nd,hr
    integer*2 snum,etyp,year,yd,head(366,24),dathr(366,24,10),datdr(366,10)
    integer*2 dath(366,24,10),datd(366,10),rmkh(366,24,10),rmkd(366,10)
    integer*2 lad,lam,lod,lom,sth,woh,wch
    character fi1*38,fi2*45,fo1*20,fo2*19,yn
    character elem(10)*8,unith(10)*8,unitd(10)*8
    character snam1*30
    data elem /'    気温','絶対湿度','全天日射','大気放射','    風向',&
               '    風速','  降水量','日照時間','現地気圧','相対湿度'/
    data unith/' 0.1degC',' 0.1g/kg','  0.01MJ','  0.01MJ','  16方位',&
               '  0.1m/s','   0.1mm','   0.01h','     hPa','    0.1%'/
    data unitd/' 0.1degC',' 0.1g/kg','   0.1MJ','  0.01MJ','  16方位',&
               '  0.1m/s','      mm','    0.1h','     hPa','    0.1%'/
!
! ユーザによる地点番号とEA気象データ種別の入力
 10 write(*,*) '地点番号[0010-8420]? '
        read(*,*) num
    write(*,*) '年[実在年なら1981-2020,標準年なら8195,9100,0110,1120,7795のどれか]? '
        read(*,*) iyr
    write(*,'(a)',advance='no') '正しければ[y]、間違いなら [n]? '
        read(*,*) yn
    if(yn.ne.'y') then
        go to 10
    end if
!
! ユーザが入力した地点番号と年に対応するEA気象データファイルの指定
    if(iyr.eq.8195.or.iyr.eq.9100.or.iyr.eq.110.or.iyr.eq.1120) then
        write(fi1,'(a29,i4.4,a5)') 'c:\MDS_Software\EA_Source\PRY',iyr,'.wea2'
    else if(iyr.eq.7795) then
        write(fi1,'(a29,i4.4,a5)') 'c:\MDS_Software\EA_Source\FRY',iyr,'.wea2'
    else
        write(fi1,'(a29,i4,a5)') 'c:\MDS_Software\EA_Source\EAD',iyr,'.wea2'
    end if
    open(1,file=fi1,access='direct',form='unformatted',recl=18306,status='old')
!
! EA気象データファイルに対応するStnInfoの指定
    if(iyr.eq.8195.or.iyr.eq.9100.or.iyr.eq.110.or.iyr.eq.1120) then
        write(fi2,'(a37,i4.4,a4)') 'c:\MDS_Software\EA_Source\StnInfo_PRY',iyr,'.dat'
    else if(iyr.eq.7795) then
        write(fi2,'(a37,i4.4,a4)') 'c:\MDS_Software\EA_Source\StnInfo_FRY',iyr,'.dat'
    else
        write(fi2,'(a37,i4,a4)') 'c:\MDS_Software\EA_Source\StnInfo_EAD',iyr,'.dat'
    end if
    open(2,file=fi2,status='old')
!
! StnInfoの地点番号とブロック番号の読み取り
     12 read(2,100,end = 14) num1,blc
        if(num1.eq.num) then
            go to 16
        end if
            go to 12
     14 write(*,*) 'error, 地点番号の入力間違い'
        stop
     16 continue
        write(*,110) num,iyr,num1,blc
    100 format(i4,97x,i3)
    110 format('入力した地点番号= ',i4.4,'   入力した年= ',i4.4,'   StnInfoの地点番号=',i5,&
               '   ブロック番号= ',i4)
!
! EA気象データファイルの読み込み
    irec = (blc-1) * 11 + 1
        read(1,rec=irec) snum,etyp,year,((head(nd,hr),hr=1,24),nd=1,366),snam1
    do ie=1,10
        irec = irec + 1
        read(1,rec=irec) snum,etyp,year,((dathr(nd,hr,ie),hr=1,24),nd=1,366),&
                         (datdr(nd,ie),nd=1,366)
    end do
!
    close(1)
    close(2)
!
! 気象データとリマークの分離
        do nd=1,366
            do ie=1,10
                    datd(nd,ie) = int(datdr(nd,ie)/10)
                    rmkd(nd,ie) = abs(datdr(nd,ie)) - abs(datd(nd,ie))*10
                do hr=1,24
                    dath(nd,hr,ie) = int(dathr(nd,hr,ie)/10)
                    rmkh(nd,hr,ie) = abs(dathr(nd,hr,ie)) - abs(dath(nd,hr,ie))*10
                end do
            end do
        end do
!
! 時別値の出力ファイルの定義
        write(fo1,'(i4.4,a1,i4.4,a11)') iyr,'_',num,'_hourly.csv'
    open(3,file=fo1,status='replace')
! 日別値の出力ファイルの定義
        write(fo2,'(i4.4,a1,i4.4,a10)') iyr,'_',num,'_daily.csv'
    open(4,file=fo2,status='replace')
!
! 見出し行の出力
        lad=head(365, 5)
        lam=head(365, 6)
        lod=head(365, 7)
        lom=head(365, 8)
        sth=head(365, 9)
        woh=head(365,10)
        wch=head(365,11)
        write(3,200) iyr,snum,snam1
        write(3,210) lad,lam,lod,lom,sth,woh,wch
        write(3,220) (elem(ie),ie=1,10)
        write(3,230) (unith(ie),ie=1,10)
        write(4,200) iyr,snum,snam1
        write(4,210) lad,lam,lod,lom,sth,woh,wch
        write(4,222) (elem(ie),ie=1,10)
        write(4,232) (unitd(ie),ie=1,10)
!
! 時別値と日別値の出力
        do nd=1,366
                    write(4,240) nd,(datd(nd,ie),rmkd(nd,ie),ie=1,10)
                do hr=1,24
                    write(3,250) nd,hr,(dath(nd,hr,ie),rmkh(nd,hr,ie),ie=1,10)
                end do
        end do
        200 format('年=',i4.4,',,','EA地点番号=,',i4.4,',EA地点名=,',a30)
        210 format('緯度(度)=,',i0,'.',i3.3,',経度(度)=,',i0,'.',i3.3,&
                   ',標高(m)=,',i0,',風速観測高さ(0.1m)=,',i0,',風速補正高さ(0.1m)=,',i0) 
        220 format('年間通日,時刻,',10(a8,',RMK,'))
        222 format('年間通日,',10(a8,',R,'))
        230 format(',,', 10(a8,',,'))
        232 format(',', 10(a8,',,'))
        240 format(21(i0,','))
        250 format(22(i0,','))
!
    close(3)
    close(4)
    end program wea2_read
