Line data Source code
1 : !> \file mo_smi_global_variables.f90
2 : !> \brief \copybrief mo_smi_global_variables
3 : !> \details \copydetails mo_smi_global_variables
4 :
5 : !> \brief Global variables for SMI
6 : !> \copyright Copyright 2005-\today, the CHS Developers, Luis Samaniego, Sabine Attinger: All rights reserved.
7 : !! SMI is released under the LGPLv3+ license \license_note
8 : module mo_smi_global_variables
9 : !
10 : use mo_kind, only: i4, dp
11 :
12 : implicit none
13 :
14 : public
15 :
16 : !> \brief date definition for starting and end dates
17 : type period
18 : integer(i4) :: y_start, m_start, d_start
19 : integer(i4) :: y_end, m_end, d_end
20 : real(dp) :: j_start, j_end
21 : integer(i4) :: n_years, n_months, n_days
22 : integer(i4) :: n_leap_days
23 : character(256) :: unit
24 : integer(i4) , allocatable :: time_points(:)
25 : end type period
26 :
27 : contains
28 :
29 : !> \brief initialize object date and calculate derived variables from:
30 : !! y_start, m_start, d_start, y_end, m_end, d_end
31 20 : type (period) function period_init(y_start, m_start, d_start, y_end, m_end, d_end, time_points, unit, nCalendarStepYears)
32 :
33 : use mo_julian, only: date2dec, dec2date
34 :
35 : implicit none
36 :
37 : integer(i4), intent(in) :: y_start, m_start, d_start
38 : integer(i4), intent(in) :: y_end, m_end, d_end
39 : integer(i4), intent(in) :: time_points(:)
40 : character(len=*), intent(in) :: unit
41 : integer(i4), intent(in) :: nCalendarStepYears
42 : integer(i4) :: ii, day, month
43 :
44 10 : period_init%y_start = y_start
45 10 : period_init%m_start = m_start
46 10 : period_init%d_start = d_start
47 10 : period_init%y_end = y_end
48 10 : period_init%m_end = m_end
49 10 : period_init%d_end = d_end
50 36813 : period_init%time_points = time_points
51 10 : period_init%unit = trim(unit)
52 :
53 :
54 10 : period_init%j_start = date2dec(period_init%d_start, period_init%m_start, period_init%y_start)
55 10 : period_init%j_end = date2dec(period_init%d_end, period_init%m_end, period_init%y_end)
56 :
57 10 : period_init%n_years = period_init%y_end - period_init%y_start + 1_i4
58 10 : period_init%n_days = period_init%j_end - period_init%j_start + 1_i4
59 : period_init%n_months = (12_i4 - period_init%m_start + 1_i4) &
60 : + (period_init%y_end - period_init%y_start - 1_i4) * 12_i4 &
61 10 : + period_init%m_end
62 :
63 : ! count number of leap days
64 10 : period_init%n_leap_days = 0
65 36813 : do ii = 1, size(period_init%time_points)
66 36803 : call dec2date(real(period_init%j_start + period_init%time_points(ii) - 1, dp), dd=day, mm=month)
67 36803 : if ((month .eq. 2) .and. (day .eq. 29) .and. (nCalendarStepYears .ne. 12)) &
68 33 : period_init%n_leap_days = period_init%n_leap_days + 1_i4
69 : end do
70 :
71 10 : end function period_init
72 :
73 0 : end module mo_smi_global_variables
|