1 |
|
|
MODULE cal_tools_m |
2 |
|
|
|
3 |
|
|
USE ioipsl, ONLY: ioconf_calendar, ioget_mon_len, lock_calendar, & |
4 |
|
|
ioget_calendar, ioget_year_len |
5 |
|
|
|
6 |
|
|
CONTAINS |
7 |
|
|
|
8 |
|
|
!------------------------------------------------------------------------------- |
9 |
|
|
! |
10 |
|
|
FUNCTION year_len(y,cal_in) |
11 |
|
|
! |
12 |
|
|
!------------------------------------------------------------------------------- |
13 |
|
|
IMPLICIT NONE |
14 |
|
|
!------------------------------------------------------------------------------- |
15 |
|
|
! Arguments: |
16 |
|
|
INTEGER :: year_len |
17 |
|
|
INTEGER, INTENT(IN) :: y |
18 |
|
|
CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: cal_in |
19 |
|
|
!------------------------------------------------------------------------------- |
20 |
|
|
! Local variables: |
21 |
|
|
CHARACTER(LEN=20) :: cal_lmdz |
22 |
|
|
!------------------------------------------------------------------------------- |
23 |
|
|
!--- No specified calendar: we need lmdz days number for current year |
24 |
|
|
IF(.NOT.PRESENT(cal_in)) THEN; year_len=ioget_year_len(y); RETURN; END IF |
25 |
|
|
|
26 |
|
|
!--- Get the lmdz calendar to reset at the end of the function |
27 |
|
|
CALL ioget_calendar(cal_lmdz) |
28 |
|
|
|
29 |
|
|
!--- Unlock calendar and set it to wanted one |
30 |
|
|
CALL lock_calendar(.FALSE.); CALL ioconf_calendar(TRIM(cal_in)) |
31 |
|
|
|
32 |
|
|
!--- Get the number of days in this year |
33 |
|
|
year_len=ioget_year_len(y) |
34 |
|
|
|
35 |
|
|
!--- Back to original calendar |
36 |
|
|
CALL lock_calendar(.FALSE.); CALL ioconf_calendar(TRIM(cal_lmdz)) |
37 |
|
|
|
38 |
|
|
END FUNCTION year_len |
39 |
|
|
! |
40 |
|
|
!------------------------------------------------------------------------------- |
41 |
|
|
|
42 |
|
|
|
43 |
|
|
!------------------------------------------------------------------------------- |
44 |
|
|
! |
45 |
|
|
FUNCTION mid_month(y,cal_in) |
46 |
|
|
! |
47 |
|
|
!------------------------------------------------------------------------------- |
48 |
|
|
IMPLICIT NONE |
49 |
|
|
!------------------------------------------------------------------------------- |
50 |
|
|
! Arguments: |
51 |
|
|
INTEGER, INTENT(IN) :: y ! year |
52 |
|
|
CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: cal_in ! calendar |
53 |
|
|
REAL, DIMENSION(14) :: mid_month ! mid-bins times |
54 |
|
|
!------------------------------------------------------------------------------- |
55 |
|
|
! Local variables: |
56 |
|
|
CHARACTER(LEN=20) :: cal_lmdz ! lmdz current calendar |
57 |
|
|
INTEGER, DIMENSION(14) :: tlen ! months lengths (days) |
58 |
|
|
INTEGER :: m ! months counter |
59 |
|
|
INTEGER :: nd ! number of days |
60 |
|
|
!------------------------------------------------------------------------------- |
61 |
|
|
IF(PRESENT(cal_in)) THEN |
62 |
|
|
CALL ioget_calendar(cal_lmdz) !--- Keep track of lmdz calendar |
63 |
|
|
CALL lock_calendar(.FALSE.) !--- Unlock calendar |
64 |
|
|
CALL ioconf_calendar(TRIM(cal_in)) !--- Change calendar to "cal_in" |
65 |
|
|
END IF |
66 |
|
|
|
67 |
|
|
!--- Get the length of each month |
68 |
|
|
tlen(1 )=ioget_mon_len(y-1,12) |
69 |
|
|
DO m=1,12; tlen(m+1)=ioget_mon_len(y,m); END DO |
70 |
|
|
tlen(14)=ioget_mon_len(y+1, 1) |
71 |
|
|
|
72 |
|
|
!--- Mid-bins times |
73 |
|
|
mid_month(1)=-0.5*REAL(tlen(1)) |
74 |
|
|
DO m=2,14; mid_month(m)=mid_month(m-1)+0.5*REAL(tlen(m-1)+tlen(m)); END DO |
75 |
|
|
|
76 |
|
|
IF(PRESENT(cal_in)) THEN |
77 |
|
|
CALL lock_calendar(.FALSE.) !--- Unlock calendar |
78 |
|
|
CALL ioconf_calendar(TRIM(cal_lmdz)) !--- Restore original calendar |
79 |
|
|
END IF |
80 |
|
|
|
81 |
|
|
END FUNCTION mid_month |
82 |
|
|
! |
83 |
|
|
!------------------------------------------------------------------------------- |
84 |
|
|
|
85 |
|
|
|
86 |
|
|
END MODULE cal_tools_m |
87 |
|
|
! |
88 |
|
|
!******************************************************************************* |
89 |
|
|
|