# Calendar and Date Management (Advanced)

Under construction.

!= Sample program for gtool_historyauto/gtool5
!
! * 2009/10/18 Y.Morikawa
! * 2003/08/21 M.Odaka
! * 2001/02/27 S.Takehiro
!
! Solving diffusion equation
! $! du/dt = \kappa d^2 u/dx^2 !$
! for giving values of $u$ at $x=[0,1]$.
!
program diffusion_cal2

use gtool_historyauto                             ! Access module (モジュール指定)
use dc_calendar                               ! Access module (モジュール指定)
use dc_types                                      ! Access module (モジュール指定)

integer, parameter     :: nx=30                   ! Grid number   (グリッド数)
real(DP), parameter    :: dx=1.0/(nx-1)           ! Grid interval (グリッド間隔)
type(DC_CAL)         :: cal_gre             ! Gregorian Calendar (グレゴリオ暦)
type(DC_CAL)         :: cal_mars            ! Martian Calendar   (火星っぽい暦)
type(DC_CAL_DATE)    :: start_date          ! Start Date (モデル開始日時)
type(DC_CAL_DATE)    :: end_date            ! End Date   (モデル終了日時)
real(DP)             :: dt                  ! Time step    [sec] (時間間隔 [秒])
real(DP)             :: curtime             ! Current time [sec] (経過時刻 [秒])
real(DP)             :: endtime             ! End time     [sec] (終了時刻 [秒])
real(DP)             :: dsptime             ! Output interval [day] (出力間隔 [日])

real(DP)             :: sec_of_year         ! Second of year (年始めからの通秒)
real(DP)             :: day_of_year         ! Day of year    (年始めからの通日)
real(DP)             :: sec_of_day          ! Second of day  (日始めからの通秒)
logical              :: flag_leapyear       ! Leap year      (閏年)

real(DP), dimension(nx):: x=(/(dx*(i-1),i=1,nx)/) ! X coordinate (座標変数)
real(DP), dimension(nx):: temp                    ! Temperature (温度)
real(DP), parameter    :: kappa=1.0e-9            ! Diffusion coefficient (熱拡散係数)

character(256):: date_str1, date_str2

character(32):: cal_type
integer:: month_in_year, day_in_month(1:12), hour_in_day, min_in_hour
integer, pointer:: day_in_month_ptr(:) =>null()
real(DP):: sec_in_min

call DCCalCreate( cal_type = 'Gregorian', cal = cal_gre )
call DCCalCreate( month_in_year = 1 , &
&               day_in_month  = (/669/), &
&               hour_in_day   = 24, &
&               min_in_hour   = 1 , &
&               sec_in_min    = 3694.0_DP, &
&               cal           = cal_mars )
! Set calendar
! (暦設定)

call DCCalDateCreate( year = 2000, month =  1, day = 1, &
&                   hour =    0, min   =  0, sec = 0.0_DP, &
&                   date = start_date )
call DCCalDateCreate( year = 2001, month =  1, day = 1, &
&                   hour =    0, min   =  0, sec = 0.0_DP, &
&                   date = end_date )
! Set date
! (日時設定)

curtime = DCCalConvertByUnit(  0.0_DP, 'sec', 'sec', cal = cal_mars )
! Set initial time
! (初期時刻設定)
endtime = DCCalDateDifference( start_date, end_date, cal = cal_mars )
! Set end time
! (終了時刻設定)
dt      = DCCalConvertByUnit(  1.0_DP, 'day', 'sec', cal = cal_mars )
! Set time step
! (時間ステップ設定)
dsptime = 10
! Set output interval
! (出力間隔設定)

temp = exp(-((x-0.5)/0.1)**2)                     ! Set initial value
! (初期値設定)

call HistoryAutoCreate( &                         ! Create output file
& title='Diffusion equation',                &  ! (ヒストリー作成)
& source='Sample program of gtool_historyauto/gtool5',   &
& institution='GFD_Dennou Club davis project',           &
& dims=(/'x','t'/), dimsizes=(/nx,0/),                   &
& longnames=(/'X-coordinate','time        '/),           &
& units=(/'m  ','day'/),                                 &
& origin=curtime, terminus=endtime, interval=dsptime,    &
& cal=cal_mars, start_date=start_date )

call HistoryAutoPutAxis('x',x)                    ! Output 'x' (次元変数出力)

call HistoryAutoAddVariable( &                    ! Set output variable
& varname='temp', dims=(/'x','t'/), &           ! (変数定義)
& longname='temperature', units='K', xtype='double', &
& file='diffusion_cal2.nc' )

call HistoryAutoPut(curtime,'temp',temp)          ! Output 'temp' (変数出力)

write(6,*) "Calendars: "

call DCCalInquire( cal_type, &
&                month_in_year    = month_in_year, &
&                day_in_month_ptr = day_in_month_ptr, &
&                hour_in_day      = hour_in_day, &
&                min_in_hour      = min_in_hour, &
&                sec_in_min       = sec_in_min, &
&                cal              = cal_mars )
! Inquire calendar
! (暦に関して問い合わせ)

write(6,*) "       Martian Cal:   month in year:  ", month_in_year
write(6,*) "                      days in months: ", day_in_month_ptr
write(6,*) "                      hour in day:    ", hour_in_day
write(6,*) "                      min in hour:    ", min_in_hour
write(6,*) "                      sec in min:     ", sec_in_min
deallocate(day_in_month_ptr)

call DCCalInquire( cal_type, &
&                month_in_year    = month_in_year, &
&                day_in_month     = day_in_month, &
&                hour_in_day      = hour_in_day, &
&                min_in_hour      = min_in_hour, &
&                sec_in_min       = sec_in_min, &
&                cal              = cal_gre )
! Inquire calendar
! (暦に関して問い合わせ)

write(6,*) "       Gregorian Cal: month in year:  ", month_in_year
write(6,*) "                      days in months: ", day_in_month
write(6,*) "                      hour in day:    ", hour_in_day
write(6,*) "                      min in hour:    ", min_in_hour
write(6,*) "                      sec in min:     ", sec_in_min

write(6,*) ""

call DCCalDateInquire( date_str1, date = start_date )
! Inquire date and set a character variable
! (日時を問い合わせて文字型変数へ代入)

write(6,*) "Start: ", trim(date_str1)
! Display start date
! (開始日時の表示)

sec_of_year   = DCCalDateEvalSecOfYear( curtime, start_date, cal_mars )
! Second of year (年始めからの通秒)
day_of_year   = DCCalDateEvalDayOfYear( curtime, start_date, cal_mars )
! Day of year    (年始めからの通日)
sec_of_day    = DCCalDateEvalSecOfDay( curtime, start_date, cal_mars )
! Second of day  (日始めからの通秒)
flag_leapyear = DCCalDateChkLeapYear( curtime, start_date, cal_mars )
! Leap year      (閏年)

write(6,*) "       Martian Cal:   second of year: ", sec_of_year
write(6,*) "                      day of year:    ", day_of_year
write(6,*) "                      second of day:  ", sec_of_day
write(6,*) "                      leap year:      ", flag_leapyear

sec_of_year   = DCCalDateEvalSecOfYear( curtime, start_date, cal_gre )
! Second of year (年始めからの通秒)
day_of_year   = DCCalDateEvalDayOfYear( curtime, start_date, cal_gre )
! Day of year    (年始めからの通日)
sec_of_day    = DCCalDateEvalSecOfDay( curtime, start_date, cal_gre )
! Second of day  (日始めからの通秒)
flag_leapyear = DCCalDateChkLeapYear( curtime, start_date, cal_gre )
! Leap year      (閏年)

write(6,*) "       Gregorian Cal: second of year: ", sec_of_year
write(6,*) "                      day of year:    ", day_of_year
write(6,*) "                      second of day:  ", sec_of_day
write(6,*) "                      leap year:      ", flag_leapyear

do while ( curtime < endtime )                    ! Check termination (終了判定)

temp(2:nx-1) = temp(2:nx-1) &                   ! Time integration (時間積分)
& + kappa*(temp(3:nx)-2*temp(2:nx-1)+temp(1:nx-2))/dx**2*dt

call HistoryAutoPut(curtime,'temp',temp)        ! Output 'temp' (変数出力)

curtime = curtime + dt                          ! Progress model time (モデル時刻進行)
enddo

call DCCalDateInquire( date_str1, curtime, start_date, cal = cal_mars )
call DCCalDateInquire( date_str2, curtime, start_date, cal = cal_gre )
! Inquire date and set a character variable
! (日時を問い合わせて文字型変数へ代入)

write(6,*) "End:   ", trim(date_str1), " (Mars), ", trim(date_str2), " (Gregorian)"
! Display end date (終了日時出力)

sec_of_year   = DCCalDateEvalSecOfYear( curtime, start_date, cal_mars )
! Second of year (年始めからの通秒)
day_of_year   = DCCalDateEvalDayOfYear( curtime, start_date, cal_mars )
! Day of year    (年始めからの通日)
sec_of_day    = DCCalDateEvalSecOfDay( curtime, start_date, cal_mars )
! Second of day  (日始めからの通秒)
flag_leapyear = DCCalDateChkLeapYear( curtime, start_date, cal_mars )
! Leap year      (閏年)

write(6,*) "       Martian Cal:   second of year: ", sec_of_year
write(6,*) "                      day of year:    ", day_of_year
write(6,*) "                      second of day:  ", sec_of_day
write(6,*) "                      leap year:      ", flag_leapyear

sec_of_year   = DCCalDateEvalSecOfYear( curtime, start_date, cal_gre )
! Second of year (年始めからの通秒)
day_of_year   = DCCalDateEvalDayOfYear( curtime, start_date, cal_gre )
! Day of year    (年始めからの通日)
sec_of_day    = DCCalDateEvalSecOfDay( curtime, start_date, cal_gre )
! Second of day  (日始めからの通秒)
flag_leapyear = DCCalDateChkLeapYear( curtime, start_date, cal_gre )
! Leap year      (閏年)

write(6,*) "       Gregorian Cal: second of year: ", sec_of_year
write(6,*) "                      day of year:    ", day_of_year
write(6,*) "                      second of day:  ", sec_of_day
write(6,*) "                      leap year:      ", flag_leapyear

call HistoryAutoClose
stop
end program diffusion_cal2


$Id: dc_calendar2.rd,v 1.6 2010-08-26 10:50:09 morikawa Exp$