source: LMDZ6/trunk/libf/phylmd/phyetat0_get_mod.F90 @ 4927

Last change on this file since 4927 was 4927, checked in by musat, 6 weeks ago

Initialisation by the "default" value of isnan fields
IonelaMusat?

File size: 6.5 KB
Line 
1MODULE phyetat0_get_mod
2
3  PRIVATE
4  PUBLIC :: phyetat0_get, phyetat0_srf
5
6  INTERFACE phyetat0_get
7    MODULE PROCEDURE phyetat0_get10, phyetat0_get20, phyetat0_get11, phyetat0_get21
8  END INTERFACE phyetat0_get
9  INTERFACE phyetat0_srf
10    MODULE PROCEDURE phyetat0_srf20, phyetat0_srf30, phyetat0_srf21, phyetat0_srf31
11  END INTERFACE phyetat0_srf
12
13CONTAINS
14
15!==============================================================================
16LOGICAL FUNCTION phyetat0_get10(field, name, descr, default) RESULT(lFound)
17! Read a field. Check whether reading succeded and use default value if not.
18  IMPLICIT NONE
19  REAL,             INTENT(INOUT) :: field(:) ! klon
20  CHARACTER(LEN=*), INTENT(IN)    :: name
21  CHARACTER(LEN=*), INTENT(IN)    :: descr
22  REAL,             INTENT(IN)    :: default
23!------------------------------------------------------------------------------
24  REAL :: fld(SIZE(field),1)
25  lFound = phyetat0_get21(fld, [name], descr, default); field = fld(:,1)
26END FUNCTION phyetat0_get10
27!==============================================================================
28LOGICAL FUNCTION phyetat0_get20(field, name, descr, default) RESULT(lFound)
29! Same as phyetat0_get11, field on multiple levels.
30  IMPLICIT NONE
31  REAL,             INTENT(INOUT) :: field(:,:) ! klon, nlev
32  CHARACTER(LEN=*), INTENT(IN)    :: name
33  CHARACTER(LEN=*), INTENT(IN)    :: descr
34  REAL,             INTENT(IN)    :: default
35!-----------------------------------------------------------------------------
36  lFound = phyetat0_get21(field, [name], descr, default)
37END FUNCTION phyetat0_get20
38!==============================================================================
39LOGICAL FUNCTION phyetat0_get11(field, name, descr, default) RESULT(lFound)
40! Same as phyetat0_get11, multiple names.
41  IMPLICIT NONE
42  REAL,             INTENT(INOUT) :: field(:) ! klon
43  CHARACTER(LEN=*), INTENT(IN)    :: name(:)
44  CHARACTER(LEN=*), INTENT(IN)    :: descr
45  REAL,             INTENT(IN)    :: default
46!-----------------------------------------------------------------------------
47  REAL :: fld(SIZE(field),1)
48  lFound = phyetat0_get21(fld, name, descr, default); field = fld(:,1)
49END FUNCTION phyetat0_get11
50!==============================================================================
51LOGICAL FUNCTION phyetat0_get21(field, name, descr, default, tname) RESULT(lFound)
52! Same as phyetat0_get11, field on multiple levels, multiple names.
53  USE iostart,           ONLY: get_field
54  USE print_control_mod, ONLY: lunout
55  IMPLICIT NONE
56  REAL,             INTENT(INOUT) :: field(:,:) ! klon, nlev
57  CHARACTER(LEN=*), INTENT(IN)    :: name(:)
58  CHARACTER(LEN=*), INTENT(IN)    :: descr
59  REAL,             INTENT(IN)    :: default
60  CHARACTER(LEN=*), OPTIONAL, INTENT(OUT) :: tname
61!-----------------------------------------------------------------------------
62  CHARACTER(LEN=LEN(name)) :: tnam
63  INTEGER :: i
64  DO i = 1, SIZE(name)
65    CALL get_field(TRIM(name(i)), field, lFound)
66    IF(isnan(field(1,1))) THEN
67      field(:,:) = default
68    ENDIF
69    IF(lFound) EXIT
70    WRITE(lunout,*) "phyetat0: Missing field <",TRIM(name(i)),"> "
71  END DO
72  IF(.NOT.lFound) THEN
73    WRITE(lunout,*) "Slightly distorted start ; continuing."
74    field(:,:) = default
75    tnam = name(1)
76  ELSE
77    tnam = name(i)
78  END IF
79  WRITE(lunout,'(2(a,ES14.7))') 'phyetat0: '//TRIM(tnam)//' ('//TRIM(descr)//') min/max=', &
80    MINval(field),' ',MAXval(field)
81  IF(PRESENT(tname)) tname = tnam
82END FUNCTION phyetat0_get21
83!==============================================================================
84LOGICAL FUNCTION phyetat0_srf20(field, name, descr, default) RESULT(lFound)
85! Read a field per sub-surface.
86! Check whether reading succeded and use default value if not.
87  IMPLICIT NONE
88  REAL,             INTENT(INOUT) :: field(:,:)
89  CHARACTER(LEN=*), INTENT(IN)    :: name
90  CHARACTER(LEN=*), INTENT(IN)    :: descr
91  REAL,             INTENT(IN)    :: default
92!-----------------------------------------------------------------------------
93  REAL :: fld(SIZE(field,1),1,SIZE(field,2))
94  lFound = phyetat0_srf31(fld, [name], descr, default); field = fld(:,1,:)
95END FUNCTION phyetat0_srf20
96
97!==============================================================================
98LOGICAL FUNCTION phyetat0_srf30(field, name, descr, default) RESULT(lFound)
99! Same as phyetat0_sfr11, multiple names tested one after the other.
100  IMPLICIT NONE
101  REAL,             INTENT(INOUT) :: field(:,:,:)
102  CHARACTER(LEN=*), INTENT(IN)    :: name
103  CHARACTER(LEN=*), INTENT(IN)    :: descr
104  REAL,             INTENT(IN)    :: default
105!-----------------------------------------------------------------------------
106  lFound = phyetat0_srf31(field, [name], descr, default)
107END FUNCTION phyetat0_srf30
108
109!==============================================================================
110LOGICAL FUNCTION phyetat0_srf21(field, name, descr, default) RESULT(lFound)
111! Same as phyetat0_sfr11, field on multiple levels.
112  IMPLICIT NONE
113  REAL,             INTENT(INOUT) :: field(:,:)
114  CHARACTER(LEN=*), INTENT(IN)    :: name(:)
115  CHARACTER(LEN=*), INTENT(IN)    :: descr
116  REAL,             INTENT(IN)    :: default
117!-----------------------------------------------------------------------------
118  REAL :: fld(SIZE(field,1),1,SIZE(field,2))
119  lFound = phyetat0_srf31(fld, name, descr, default); field = fld(:,1,:)
120END FUNCTION phyetat0_srf21
121
122!==============================================================================
123LOGICAL FUNCTION phyetat0_srf31(field, name, descr, default) RESULT(lFound)
124! Same as phyetat0_sfr11, field on multiple levels, multiple names tested one after the other.
125  USE iostart,           ONLY: get_field
126  USE print_control_mod, ONLY: lunout
127  USE strings_mod,       ONLY: int2str, maxlen
128  IMPLICIT NONE
129  REAL,             INTENT(INOUT) :: field(:,:,:)
130  CHARACTER(LEN=*), INTENT(IN)    :: name(:)
131  CHARACTER(LEN=*), INTENT(IN)    :: descr
132  REAL,             INTENT(IN)    :: default
133!-----------------------------------------------------------------------------
134  INTEGER :: nsrf, i
135  CHARACTER(LEN=maxlen) :: nam(SIZE(name)), tname, des
136  IF(SIZE(field,3)>99) CALL abort_physic("phyetat0", "Too much sub-cells", 1)
137  DO nsrf = 1, SIZE(field,3)
138    DO i = 1, SIZE(name); nam(i) = TRIM(name(i))//TRIM(int2str(nsrf,2)); END DO
139    des = TRIM(descr)//" srf:"//int2str(nsrf,2)
140    lFound = phyetat0_get21(field(:,:,nsrf), nam, TRIM(des), default, tname)
141  END DO
142  WRITE(lunout,'(2(a,ES14.7))') 'phyetat0: '//TRIM(tname)//' ('//TRIM(descr)//') min/max=', &
143    MINval(field),' ',MAXval(field)
144END FUNCTION phyetat0_srf31
145
146END MODULE phyetat0_get_mod
Note: See TracBrowser for help on using the repository browser.