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 | |
---|