50 integer(i4),
save,
private :: calendar = 1
73 module procedure setcalendarinteger, setcalendarstring
78 subroutine setcalendarstring(selector)
79 character(*),
intent(in) :: selector
83 call setcalendarinteger(1)
85 call setcalendarinteger(2)
87 call setcalendarinteger(3)
89 print*,
"Unknown selector! Select on of 'julian', '365day', '360day'."
92 end subroutine setcalendarstring
95 subroutine setcalendarinteger(selector)
96 integer(i4),
intent(in) :: selector
98 if ((selector .lt. 1) .or. (selector .gt. 3))
then
99 print*,
"Unknown selector! Select on of 1, 2, 3."
104 end subroutine setcalendarinteger
126 integer(i4),
intent(in),
optional :: selector
130 if (
present(selector))
then
131 if ((selector .gt. 0) .and. (selector .lt. 4))
then
166 elemental subroutine caldat(julian, dd, mm, yy, calendar)
170 integer(i4),
intent(in) :: julian
171 integer(i4),
intent(out) :: dd, mm, yy
172 integer(i4),
intent(in),
optional :: calendar
217 elemental subroutine dec2date(julian, dd, mm, yy, hh, nn, ss, calendar)
221 real(
dp),
intent(in) :: julian
222 integer(i4),
intent(out),
optional :: dd, mm, yy, hh, nn, ss
223 integer(i4),
intent(in),
optional :: calendar
265 elemental function date2dec(dd, mm, yy, hh, nn, ss, calendar)
269 integer(i4),
intent(in),
optional :: dd, mm, yy
270 integer(i4),
intent(in),
optional :: hh, nn, ss
271 integer(i4),
intent(in),
optional :: calendar
312 elemental function julday(dd, mm, yy, calendar)
316 integer(i4),
intent(in) :: dd, mm, yy
317 integer(i4),
intent(in),
optional :: calendar
389 INTEGER(i4),
INTENT(IN) :: julian
390 INTEGER(i4),
INTENT(OUT) :: dd, mm, yy
392 INTEGER(i8) :: a, b, c, d, e, g
393 INTEGER(i4),
PARAMETER :: igreg = 2299161_i4
395 if (julian < igreg)
then
398 g = int((real(julian,
dp) - 1867216.25_dp) / 36524.25_dp,
i8)
399 a = julian + 1_i8 + g - g / 4_i8
403 c = int((real(b,
dp) - 122.1_dp) / 365.25_dp,
i8)
404 d = int(365.25_dp * real(c,
dp),
i8)
405 e = int(real(b - d,
dp) / 30.6001_dp,
i8)
407 dd = int(b - d - int(30.6001_dp * real(e,
dp),
i8),
i4)
410 mm = int(e - 1_i8,
i4)
412 mm = int(e - 13_i8,
i4)
416 yy = int(c - 4716_i8,
i4)
418 yy = int(c - 4715_i8,
i4)
490 INTEGER(i4),
INTENT(IN),
OPTIONAL :: dd, mm, yy
491 INTEGER(i4),
INTENT(IN),
OPTIONAL :: hh, nn, ss
494 INTEGER(i4),
PARAMETER :: igreg2 = 15 + 31 * (10 + 12 * 1582)
495 INTEGER(i4),
PARAMETER :: igreg1 = 4 + 31 * (10 + 12 * 1582)
496 INTEGER(i4) :: idd, imm, iyy
497 REAL(
dp) :: ihh, inn, iss
498 INTEGER(i8) :: jm, jy
499 REAL(
dp) :: jd, h, eps
504 if (
present(dd)) idd = dd
506 if (
present(mm)) imm = mm
508 if (
present(yy)) iyy = yy
510 if (
present(hh)) ihh = real(hh,
dp)
512 if (
present(nn)) inn = real(nn,
dp)
514 if (
present(ss)) iss = real(ss,
dp)
520 jm = int(imm + 12,
i8)
521 jy = int(iyy - 1,
i8)
526 h = ihh / 24._dp + inn / 1440._dp + iss / 86400._dp
528 if (dd + 31 * (mm + 12 * yy) >= igreg2)
then
530 b = 2_i8 - a + a / 4_i8
531 else if (dd + 31 * (mm + 12 * yy) <= igreg1)
then
539 floor(30.6001_dp * real(jm + 1_i8,
dp)) + jd + h + real(b,
dp) - 1524.5_dp
542 eps = epsilon(1.0_dp)
614 REAL(
dp),
INTENT(IN) :: julian
615 INTEGER(i4),
INTENT(OUT),
OPTIONAL :: dd, mm, yy
616 INTEGER(i4),
INTENT(OUT),
OPTIONAL :: hh, nn, ss
618 INTEGER(i4) :: day, month, year, hour, minute, second
622 INTEGER(i8) :: a, b, c, d, e, g, z
623 INTEGER(i4),
PARAMETER :: igreg = 2299161_i4
625 z = int(julian + 0.5,
i8)
630 g = int((real(z,
dp) - 1867216.25_dp) / 36524.25_dp,
i8)
631 a = z + 1_i8 + g - g / 4_i8
635 c = int((real(b,
dp) - 122.1_dp) / 365.25_dp,
i8)
636 d = int(365.25_dp * real(c,
dp),
i8)
637 e = int(real(b - d,
dp) / 30.6001_dp,
i8)
639 day = int(b - d - int(30.6001_dp * real(e,
dp),
i8),
i4)
642 month = int(e - 1_i8,
i4)
644 month = int(e - 13_i8,
i4)
648 year = int(c - 4716_i8,
i4)
650 year = int(c - 4715_i8,
i4)
663 fraction = julian + 0.5_dp - real(z,
dp)
664 hour = min(max(floor(fraction * 24.0_dp), 0), 23)
665 fraction = fraction - real(hour,
dp) / 24.0_dp
666 minute = min(max(floor(fraction * 1440.0_dp), 0), 59)
667 second = max(nint((fraction - real(minute,
dp) / 1440.0_dp) * 86400.0_dp), 0)
678 call caldat(
julday(day, month, year) + 1, day, month, year)
683 if (
present(dd)) dd = day
684 if (
present(mm)) mm = month
685 if (
present(yy)) yy = year
686 if (
present(hh)) hh = hour
687 if (
present(nn)) nn = minute
688 if (
present(ss)) ss = second
748 INTEGER(i4),
INTENT(IN) :: dd, mm, yy
751 INTEGER(i4),
PARAMETER :: igreg2 = 15 + 31 * (10 + 12 * 1582)
752 INTEGER(i4),
PARAMETER :: igreg1 = 4 + 31 * (10 + 12 * 1582)
753 INTEGER(i8) :: jd, jm, jy
760 jm = int(mm + 12,
i8)
766 if (dd + 31 * (mm + 12 * yy) >= igreg2)
then
768 b = 2_i8 - a + a / 4_i8
769 else if (dd + 31 * (mm + 12 * yy) <= igreg1)
then
777 juldayjulian = int(365.25_dp * real(jy + 4716_i8,
dp) + real(int(30.6001 * real(jm + 1_i8,
dp),
i8),
dp) &
778 + real(jd + b,
dp) - 1524.5_dp + 0.5_dp,
i4)
808 ELEMENTAL FUNCTION ndays(dd, mm, yy)
812 INTEGER(i4),
INTENT(IN) :: dd, mm, yy
815 INTEGER(i4),
PARAMETER :: imslday = 2415021_i4
847 ELEMENTAL SUBROUTINE ndyin(julian, dd, mm, yy)
851 INTEGER(i4),
INTENT(IN) :: julian
852 INTEGER(i4),
INTENT(OUT) :: dd, mm, yy
854 INTEGER(i4),
PARAMETER :: imslday = 2415021_i4
856 call caldat(julian + imslday, dd, mm, yy)
887 integer(i4),
intent(in) :: julian
888 integer(i4),
intent(out) :: dd, mm, yy
889 integer(i4),
parameter :: year = 360, month = 30
890 integer(i4) :: remainder
893 remainder = mod(abs(julian), year)
894 mm = remainder / month + 1
895 dd = mod(abs(julian), month) + 1
925 integer(i4),
intent(in) :: dd, mm, yy
927 integer(i4),
parameter :: year = 360, month = 30
929 julday360 = abs(yy) * year + (mm - 1) * month + (dd - 1)
964 real(
dp),
intent(in) :: julian
965 integer(i4),
intent(out),
optional :: dd, mm, yy
966 integer(i4),
intent(out),
optional :: hh, nn, ss
967 integer(i4) :: day, month, year
968 real(
dp) :: fraction, fjulian
969 integer(i4) :: hour, minute, second
971 fjulian = julian + .5_dp
972 call caldat360(int(floor(fjulian),
i4), day, month, year)
974 fraction = fjulian - floor(fjulian)
975 hour = min(max(floor(fraction * 24.0_dp), 0), 23)
976 fraction = fraction - real(hour,
dp) / 24.0_dp
977 minute = min(max(floor(fraction * 1440.0_dp), 0), 59)
978 second = max(nint((fraction - real(minute,
dp) / 1440.0_dp) * 86400.0_dp), 0)
994 if (
present(dd)) dd = day
995 if (
present(mm)) mm = month
996 if (
present(yy)) yy = year
997 if (
present(hh)) hh = hour
998 if (
present(nn)) nn = minute
999 if (
present(ss)) ss = second
1032 integer(i4),
intent(in),
optional :: dd, mm, yy
1033 integer(i4),
intent(in),
optional :: hh, nn, ss
1035 integer(i4) :: idd, imm, iyy
1036 real(
dp) :: ihh, inn, iss
1041 if (
present(dd)) idd = dd
1043 if (
present(mm)) imm = mm
1045 if (
present(yy)) iyy = yy
1047 if (
present(hh)) ihh = real(hh,
dp)
1049 if (
present(nn)) inn = real(nn,
dp)
1051 if (
present(ss)) iss = real(ss,
dp)
1053 hour = ihh / 24._dp + inn / 1440._dp + iss / 86400._dp - .5_dp
1059 eps = epsilon(1.0_dp)
1092 integer(i4),
intent(in) :: julian
1093 integer(i4),
intent(out) :: dd, mm, yy
1094 integer(i4),
parameter :: year = 365
1095 integer(i4),
dimension(12),
parameter :: months = (/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
1096 integer(i4) :: remainder
1099 remainder = mod(abs(julian), year) + 1
1101 do mm = 1,
size(months)
1102 if (remainder .le. months(mm))
then
1105 remainder = remainder - months(mm)
1138 integer(i4),
intent(in) :: dd, mm, yy
1140 integer(i4),
parameter :: year = 365
1141 integer(i4),
dimension(12),
parameter :: months = (/31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/)
1143 julday365 = abs(yy) * year + sum(months(1 : mm - 1)) + (dd - 1)
1179 real(
dp),
intent(in) :: julian
1180 integer(i4),
intent(out),
optional :: dd, mm, yy
1181 integer(i4),
intent(out),
optional :: hh, nn, ss
1182 integer(i4) :: day, month, year
1183 real(
dp) :: fraction, fjulian
1184 integer(i4) :: hour, minute, second
1186 fjulian = julian + .5_dp
1187 call caldat365(int(floor(fjulian),
i4), day, month, year)
1189 fraction = fjulian - floor(fjulian)
1190 hour = min(max(floor(fraction * 24.0_dp), 0), 23)
1191 fraction = fraction - real(hour,
dp) / 24.0_dp
1192 minute = min(max(floor(fraction * 1440.0_dp), 0), 59)
1193 second = max(nint((fraction - real(minute,
dp) / 1440.0_dp) * 86400.0_dp), 0)
1196 if (second==60)
then
1199 if (minute==60)
then
1209 if (
present(dd)) dd = day
1210 if (
present(mm)) mm = month
1211 if (
present(yy)) yy = year
1212 if (
present(hh)) hh = hour
1213 if (
present(nn)) nn = minute
1214 if (
present(ss)) ss = second
1247 integer(i4),
intent(in),
optional :: dd, mm, yy
1248 integer(i4),
intent(in),
optional :: hh, nn, ss
1250 integer(i4) :: idd, imm, iyy
1251 real(
dp) :: ihh, inn, iss
1256 if (
present(dd)) idd = dd
1258 if (
present(mm)) imm = mm
1260 if (
present(yy)) iyy = yy
1262 if (
present(hh)) ihh = real(hh,
dp)
1264 if (
present(nn)) inn = real(nn,
dp)
1266 if (
present(ss)) iss = real(ss,
dp)
1268 hour = ihh / 24._dp + inn / 1440._dp + iss / 86400._dp - .5_dp
1274 eps = epsilon(1.0_dp)
Set module private variable calendar.
Julian date conversion routines.
pure integer(i4) function selectcalendar(selector)
Select a calendar.
elemental real(dp) function, public date2dec(dd, mm, yy, hh, nn, ss, calendar)
Fractional Julian day from day, month, year, hour, minute, second in the current calendar.
elemental real(dp) function date2decjulian(dd, mm, yy, hh, nn, ss)
Fractional Julian day from day, month, year, hour, minute, second.
elemental subroutine, public caldat(julian, dd, mm, yy, calendar)
Day, month and year from Julian day in the current or given calendar.
elemental subroutine, public dec2date(julian, dd, mm, yy, hh, nn, ss, calendar)
Day, month, year, hour, minute, and second from fractional Julian day in the current or given calenda...
elemental real(dp) function date2dec365(dd, mm, yy, hh, nn, ss)
Fractional Julian day from day, month, year, hour, minute, second in 365 day calendar.
elemental subroutine dec2date365(julian, dd, mm, yy, hh, nn, ss)
Day, month, year, hour, minute, and second from fractional Julian day in a 365_day calendar.
elemental subroutine caldat365(julian, dd, mm, yy)
Day, month and year from Julian day in a 365 day calendar.
elemental integer(i4) function juldayjulian(dd, mm, yy)
Julian day from day, month and year.
elemental subroutine caldat360(julian, dd, mm, yy)
Day, month and year from Julian day in a 360 day calendar.
elemental integer(i4) function julday365(dd, mm, yy)
Julian day from day, month and year in a 365_day calendar.
elemental subroutine dec2datejulian(julian, dd, mm, yy, hh, nn, ss)
Day, month, year, hour, minute, and second from fractional Julian day.
elemental integer(i4) function, public julday(dd, mm, yy, calendar)
Julian day from day, month and year in the current or given calendar.
elemental integer(i4) function, public ndays(dd, mm, yy)
IMSL Julian day from day, month and year.
elemental subroutine dec2date360(julian, dd, mm, yy, hh, nn, ss)
Day, month, year, hour, minute, and second from fractional Julian day in a 360_day calendar.
elemental subroutine, public caldatjulian(julian, dd, mm, yy)
Day, month and year from Julian day.
elemental integer(i4) function julday360(dd, mm, yy)
Julian day from day, month and year in a 360_day calendar.
elemental real(dp) function date2dec360(dd, mm, yy, hh, nn, ss)
Fractional Julian day from day, month, year, hour, minute, second in 360 day calendar.
elemental subroutine, public ndyin(julian, dd, mm, yy)
Day, month and year from IMSL Julian day.
Define number representations.
integer, parameter i4
4 Byte Integer Kind
integer, parameter i8
8 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.