SURFEX v8.1
General documentation of Surfex
mode_prep_ctl.F90
Go to the documentation of this file.
2 
3 !**** *MODE_PREP_CTL* - Control PREP structure
4 
5 ! Author.
6 ! -------
7 ! Philippe Marguinaud *METEO FRANCE*
8 ! Original : 01-10-2014
9 
10 ! Description.
11 ! ------------
12 ! This module implements a structure and methods to control PREP execution,
13 ! retrieve fields to be interpolated so that an external program may
14 ! interpol the fields itself (Fullpos), and pass back interpolated fields to
15 ! PREP.
16 
17 USE modi_abor1_sfx
18 
19 IMPLICIT NONE
20 
22  CHARACTER (LEN=32) :: clname = '', cltype = '', clmask = ''
23  REAL, POINTER :: zfld2 (:,:) => null ()
24  REAL, POINTER :: zfld3 (:,:,:) => null ()
25  type(prep_ctl_fld), POINTER :: next => null()
26  type(prep_ctl_fld), POINTER :: prev => null()
27 END TYPE prep_ctl_fld
28 
30  LOGICAL :: lstep0 = .false. ! PREP step 0 (count fields to be interpolated)
31  LOGICAL :: lstep1 = .false. ! PREP step 1 (retrieve fields to be interpolated)
32  LOGICAL :: lstep2 = .false. ! PREP step 2 (pass interpolated fields to PREP and finish)
33 
34  LOGICAL :: lpart1 = .true. ! Invoke PREP_*_EXTERN routines
35  LOGICAL :: lpart2 = .false. ! Retrieve or pass back interpolated fields from/to PREP
36  LOGICAL :: lpart3 = .true. ! Do interpolations
37  LOGICAL :: lpart4 = .false. ! Unused for now
38  LOGICAL :: lpart5 = .true. ! Post-processing after interpolations
39  LOGICAL :: lpart6 = .true. ! Post-processing after interpolations (higher level)
40  type(prep_ctl_fld), POINTER :: head => null(), tail => null()
41 END TYPE
42 
45 END INTERFACE
46 
49 END INTERFACE
50 
51 CONTAINS
52 
53 LOGICAL FUNCTION prep_ctl_can (YDCTL)
54 
55 ! Returns true if we are not in a 2-part PREP
56 
57 type(prep_ctl), INTENT (INOUT) :: ydctl
58 
59 type(prep_ctl) :: ylctl
60 
61 prep_ctl_can = (ydctl%LSTEP0 .EQV. ylctl%LSTEP0) .AND. (ydctl%LSTEP1 .EQV. ylctl%LSTEP1) .AND. &
62  & (ydctl%LSTEP2 .EQV. ylctl%LSTEP2) .AND. (ydctl%LPART1 .EQV. ylctl%LPART1) .AND. &
63  & (ydctl%LPART1 .EQV. ylctl%LPART1) .AND. (ydctl%LPART2 .EQV. ylctl%LPART2) .AND. &
64  & (ydctl%LPART3 .EQV. ylctl%LPART3) .AND. (ydctl%LPART4 .EQV. ylctl%LPART4) .AND. &
65  & (ydctl%LPART5 .EQV. ylctl%LPART5) .AND. (ydctl%LPART6 .EQV. ylctl%LPART6)
66 
67 
68 END FUNCTION prep_ctl_can
69 
70 SUBROUTINE prep_ctl_count (YDCTL, KCOUNT)
71 
72 ! Reckon the number of 2D fields in YDCTL
73 
74 type(prep_ctl), INTENT (INOUT) :: ydctl
75 INTEGER, INTENT (OUT) :: KCOUNT
76 
77 type(prep_ctl_fld), POINTER :: ylcfl
78 
79 kcount = 0
80 
81 ylcfl => ydctl%HEAD
82 DO WHILE (ASSOCIATED (ylcfl))
83  IF (ASSOCIATED (ylcfl%ZFLD2)) THEN
84  kcount = kcount + SIZE (ylcfl%ZFLD2, 2)
85  ELSEIF (ASSOCIATED (ylcfl%ZFLD3)) THEN
86  kcount = kcount + SIZE (ylcfl%ZFLD3, 2) * SIZE (ylcfl%ZFLD3, 3)
87  ENDIF
88  ylcfl => ylcfl%NEXT
89 ENDDO
90 
91 END SUBROUTINE prep_ctl_count
92 
93 SUBROUTINE prep_ctl_free (YDCTL)
94 
95 ! Free a whole PREP_CTL structure
96 
97 type(prep_ctl), INTENT (INOUT) :: ydctl
98 
99 type(prep_ctl_fld), POINTER :: ylcfl
100 
101 ylcfl => ydctl%HEAD
102 DO WHILE (ASSOCIATED (ylcfl))
103  IF (ASSOCIATED (ylcfl%ZFLD2)) THEN
104  DEALLOCATE (ylcfl%ZFLD2)
105  ELSEIF (ASSOCIATED (ylcfl%ZFLD3)) THEN
106  DEALLOCATE (ylcfl%ZFLD3)
107  ENDIF
108  ylcfl => ylcfl%NEXT
109  DEALLOCATE (ydctl%HEAD)
110  ydctl%HEAD => ylcfl
111 ENDDO
112 
113 NULLIFY (ydctl%HEAD, ydctl%TAIL)
114 
115 END SUBROUTINE prep_ctl_free
116 
117 SUBROUTINE prep_ctl_push (YDCTL, YDCFL)
119 ! Add a new set of fields
120 
121 type(prep_ctl), INTENT (INOUT) :: ydctl
122 type(prep_ctl_fld), POINTER :: ydcfl
123 
124 IF (ASSOCIATED (ydctl%TAIL)) THEN
125  ydctl%TAIL%NEXT => ydcfl
126  ydcfl%PREV => ydctl%TAIL
127  ydctl%TAIL => ydcfl
128 ELSE
129  ydctl%HEAD => ydcfl
130  ydctl%TAIL => ydcfl
131 ENDIF
132 
133 NULLIFY (ydcfl)
134 
135 END SUBROUTINE prep_ctl_push
136 
137 SUBROUTINE prep_ctl_shift (YDCTL, YDCFL)
139 ! Get back a set of fields
140 
141 type(prep_ctl), INTENT (INOUT) :: ydctl
142 type(prep_ctl_fld), POINTER :: ydcfl
143 
144 ydcfl => ydctl%HEAD
145 
146 IF (.NOT. ASSOCIATED (ydcfl)) THEN
147  CALL abor1_sfx ('PREP_CTL_SHIFT: ATTEMPT TO SHIFT EMPTY FIELD LIST')
148 ENDIF
149 
150 ydctl%HEAD => ydcfl%NEXT
151 
152 IF (ASSOCIATED (ydctl%HEAD)) THEN
153  ydctl%HEAD%PREV => null()
154 ENDIF
155 
156 END SUBROUTINE prep_ctl_shift
157 
158 SUBROUTINE prep_ctl_int_part2_2 (YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN)
160 ! Retrieve/pass back fields
161 
162 type(prep_ctl), INTENT (INOUT) :: ydctl
163  CHARACTER (LEN=*), INTENT (IN) :: CDSURF
164  CHARACTER (LEN=*), INTENT (IN) :: CDTYPE
165  CHARACTER (LEN=*), INTENT (IN) :: CDMASK
166 REAL, POINTER :: PFIELDIN (:,:)
167 
168 type(prep_ctl_fld), POINTER :: ylcfl
169 
170 INTEGER :: IREP
171 
172 IF (ydctl%LPART2) THEN
173  IF (ydctl%LSTEP0 .OR. ydctl%LSTEP1) THEN
174  ALLOCATE (ylcfl)
175  ylcfl%CLTYPE = cdtype
176  ylcfl%CLNAME = cdsurf
177  ylcfl%CLMASK = cdmask
178  ylcfl%ZFLD2 => pfieldin
179  NULLIFY (pfieldin)
180  CALL prep_ctl_push (ydctl, ylcfl)
181  ELSEIF (ydctl%LSTEP2) THEN
182  CALL prep_ctl_shift (ydctl, ylcfl)
183  IF (ylcfl%CLNAME /= cdsurf .OR. ylcfl%CLTYPE /= cdtype) THEN
184  CALL abor1_sfx ('PREP_CTL_INT_PART2: FIELD MISMATCH: EXPECTED '&
185  &//trim(cdsurf)//'/'//trim(cdtype)//', GOT '// &
186  &trim(ylcfl%CLNAME)//'/'//trim(ylcfl%CLTYPE))
187  ENDIF
188  pfieldin => ylcfl%ZFLD2
189  NULLIFY (ylcfl%ZFLD2)
190  DEALLOCATE (ylcfl)
191  ENDIF
192 ENDIF
193 
194 END SUBROUTINE prep_ctl_int_part2_2
195 
196 SUBROUTINE prep_ctl_int_part4_2 (YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN, PFIELDOUT)
198 type(prep_ctl), INTENT (INOUT) :: ydctl
199  CHARACTER (LEN=*), INTENT (IN) :: CDSURF
200  CHARACTER (LEN=*), INTENT (IN) :: CDTYPE
201  CHARACTER (LEN=*), INTENT (IN) :: CDMASK
202 REAL, POINTER :: PFIELDIN (:,:)
203 REAL, POINTER :: PFIELDOUT (:,:)
204 
205 type(prep_ctl_fld), POINTER :: ylcfl
206 INTEGER :: IREP, ILONG, IPOSEX
207 INTEGER (8) :: JDIM (2)
208 
209 IF (ydctl%LPART4) THEN
210 ENDIF
211 
212 END SUBROUTINE prep_ctl_int_part4_2
213 
214 SUBROUTINE prep_ctl_int_part2_3 (YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN)
216 ! Retrieve/pass back fields
217 
218 type(prep_ctl), INTENT (INOUT) :: ydctl
219  CHARACTER (LEN=*), INTENT (IN) :: CDSURF
220  CHARACTER (LEN=*), INTENT (IN) :: CDTYPE
221  CHARACTER (LEN=*), INTENT (IN) :: CDMASK
222 REAL, POINTER :: PFIELDIN (:,:,:)
223 
224 type(prep_ctl_fld), POINTER :: ylcfl
225 
226 INTEGER :: IREP
227 
228 IF (ydctl%LPART2) THEN
229  IF (ydctl%LSTEP0 .OR. ydctl%LSTEP1) THEN
230  ALLOCATE (ylcfl)
231  ylcfl%CLTYPE = cdtype
232  ylcfl%CLNAME = cdsurf
233  ylcfl%CLMASK = cdmask
234  ylcfl%ZFLD3 => pfieldin
235  NULLIFY (pfieldin)
236  CALL prep_ctl_push (ydctl, ylcfl)
237  ELSEIF (ydctl%LSTEP2) THEN
238  CALL prep_ctl_shift (ydctl, ylcfl)
239  IF (ylcfl%CLNAME /= cdsurf .OR. ylcfl%CLTYPE /= cdtype) THEN
240  CALL abor1_sfx ('PREP_CTL_INT_PART2: FIELD MISMATCH: EXPECTED '&
241  &//trim(cdsurf)//'/'//trim(cdtype)//', GOT '// &
242  &trim(ylcfl%CLNAME)//'/'//trim(ylcfl%CLTYPE))
243  ENDIF
244  pfieldin => ylcfl%ZFLD3
245  NULLIFY (ylcfl%ZFLD3)
246  DEALLOCATE (ylcfl)
247  ENDIF
248 ENDIF
249 
250 END SUBROUTINE prep_ctl_int_part2_3
251 
252 SUBROUTINE prep_ctl_int_part4_3 (YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN, PFIELDOUT)
254 type(prep_ctl), INTENT (INOUT) :: ydctl
255  CHARACTER (LEN=*), INTENT (IN) :: CDSURF
256  CHARACTER (LEN=*), INTENT (IN) :: CDTYPE
257  CHARACTER (LEN=*), INTENT (IN) :: CDMASK
258 REAL, POINTER :: PFIELDIN (:,:,:)
259 REAL, POINTER :: PFIELDOUT (:,:,:)
260 
261 INTEGER :: IREP, ILONG, IPOSEX
262 INTEGER (8) :: JDIM (3)
263 type(prep_ctl_fld), POINTER :: ylcfl
264 
265 IF (ydctl%LPART4) THEN
266 ENDIF
267 
268 END SUBROUTINE prep_ctl_int_part4_3
269 
270 END MODULE
271 
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine prep_ctl_int_part4_3(YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN, PFIELDOUT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
subroutine prep_ctl_push(YDCTL, YDCFL)
subroutine prep_ctl_int_part2_3(YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN)
subroutine prep_ctl_count(YDCTL, KCOUNT)
logical function prep_ctl_can(YDCTL)
subroutine prep_ctl_int_part4_2(YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN, PFIELDOUT)
subroutine prep_ctl_free(YDCTL)
subroutine prep_ctl_shift(YDCTL, YDCFL)
subroutine prep_ctl_int_part2_2(YDCTL, CDSURF, CDTYPE, CDMASK, PFIELDIN)