WAVEWATCH III  beta 0.0.1
w3metamd.F90
Go to the documentation of this file.
1 
4 !/ ------------------------------------------------------------------- /
5 !/
18 !/ ------------------------------------------------------------------- /
19 MODULE w3metamd
20  !/
21  !/ +-----------------------------------+
22  !/ | WAVEWATCH III NOAA/NCEP |
23  !/ | C. Bunney |
24  !/ | |
25  !/ | FORTRAN 90 |
26  !/ | Last update : 16-Dec-2020 |
27  !/ +-----------------------------------+
28  !/
29  !/ 16-Dec-2020 : Creation ( version 7.12 )
30  !/
31  ! 1. Purpose :
32  !
33  ! Provides types for handling "meta data" (attribute/value pairs)
34  ! and a linked list construct for dynamic storage.
35  !/ ------------------------------------------------------------------- /
36 
38  CHARACTER(LEN=*), PARAMETER :: unsetc = "unset"
40  REAL, PARAMETER :: unsetr = huge(1.0)
41 
44  CHARACTER(LEN=64) :: attname = unsetc
45  CHARACTER(LEN=120) :: attval = unsetc
46  CHARACTER :: TYPE = 'c'
47  TYPE(meta_pair_t), POINTER :: next
48  END TYPE meta_pair_t
49 
52  TYPE (meta_pair_t), POINTER :: head => null(), tail => null()
53  INTEGER :: n = 0
54  END TYPE meta_list_t
55 
57  INTERFACE meta_list_append
58  MODULE PROCEDURE meta_list_append_m
59  MODULE PROCEDURE meta_list_append_r
60  MODULE PROCEDURE meta_list_append_i
61  MODULE PROCEDURE meta_list_append_c
62  END INTERFACE meta_list_append
63 
64 CONTAINS
65 
66 
67  !/ ------------------------------------------------------------------- /
73  !/ ------------------------------------------------------------------- /
74  SUBROUTINE del_meta_list(LIST)
75 
76  IMPLICIT NONE
77 
78  TYPE(meta_list_t), INTENT(INOUT) :: LIST
79  !/ ------------------------------------------------------------------- /
80  !/ Local parameters
81  !/
82  TYPE(meta_pair_t), POINTER :: P
83 
84  IF(.NOT. ASSOCIATED(list%HEAD)) RETURN
85 
86  DO
87  NULLIFY(p)
88  IF(ASSOCIATED(list%HEAD%NEXT)) p => list%HEAD%NEXT
89  DEALLOCATE(list%HEAD)
90  IF(.NOT. ASSOCIATED(p)) EXIT
91  list%HEAD => p
92  ENDDO
93 
94  NULLIFY(list%HEAD)
95  NULLIFY(list%TAIL)
96  list%N = 0
97 
98  END SUBROUTINE del_meta_list
99 
100 
101  !/ ------------------------------------------------------------------- /
114  !/ ------------------------------------------------------------------- /
115  FUNCTION copy_meta_list(LIST) RESULT(COPY)
116 
117  IMPLICIT NONE
118 
119  TYPE(meta_list_t), INTENT(IN) :: list
120  TYPE(meta_list_t) :: copy
121  !/ ------------------------------------------------------------------- /
122  !/ Local parameters
123  !/
124  TYPE(meta_pair_t), POINTER :: p
125 
126  NULLIFY(copy%HEAD)
127  NULLIFY(copy%TAIL)
128  copy%N = 0
129  IF(list%N .EQ. 0) RETURN
130 
131  ! Deep copy list
132  p => list%HEAD
133  DO
134  CALL meta_list_append_m(copy, p)
135  IF(.NOT. ASSOCIATED(p%NEXT)) EXIT
136  p => p%NEXT
137  ENDDO
138 
139  END FUNCTION copy_meta_list
140 
141 
142  !/ ------------------------------------------------------------------- /
148  !/ ------------------------------------------------------------------- /
149  SUBROUTINE print_meta_list(LIST)
150 
151  IMPLICIT NONE
152 
153  TYPE(meta_list_t), INTENT(IN) :: LIST
154  !/ ------------------------------------------------------------------- /
155  !/ Local parameters
156  !/
157  TYPE(meta_pair_t), POINTER :: P
158 
159  IF(.NOT. ASSOCIATED(list%HEAD)) THEN
160  WRITE(*,*) 'List empty.'
161  RETURN
162  ENDIF
163 
164  p => list%HEAD
165  DO
166  WRITE(*, '(A," [",A1,"] : ", A)') trim(p%ATTNAME), p%TYPE, &
167  trim(p%ATTVAL)
168  IF(.NOT. ASSOCIATED(p%NEXT)) EXIT
169  p => p%NEXT
170  ENDDO
171 
172  END SUBROUTINE print_meta_list
173 
174 
175  !/ ------------------------------------------------------------------- /
182  !/ ------------------------------------------------------------------- /
183  SUBROUTINE meta_list_append_m(LIST, META)
184 
185  IMPLICIT NONE
186 
187  TYPE(meta_list_t), INTENT(INOUT) :: LIST
188  TYPE(meta_pair_t), INTENT(IN) :: META
189  !/ ------------------------------------------------------------------- /
190  !/ Local parameters
191  !/
192  TYPE(meta_pair_t), POINTER :: P
193 
194  ALLOCATE(p)
195 
196  ! Empty list?
197  IF(list%N .EQ. 0) THEN
198  !IF(.NOT. ASSOCIATED(LIST%HEAD)) THEN
199  list%HEAD => p
200  ELSE
201  list%TAIL%NEXT => p
202  ENDIF
203  list%TAIL => p
204 
205  p%ATTNAME = meta%ATTNAME
206  p%ATTVAL = meta%ATTVAL
207  p%TYPE = meta%TYPE
208 
209  NULLIFY(p%NEXT)
210 
211  list%N = list%N + 1
212 
213  END SUBROUTINE meta_list_append_m
214 
215 
216  !/ ------------------------------------------------------------------- /
224  !/ ------------------------------------------------------------------- /
225  SUBROUTINE meta_list_append_r(LIST, ATTNAME, RVAL)
226 
227  IMPLICIT NONE
228 
229  TYPE(meta_list_t), INTENT(INOUT) :: LIST
230  CHARACTER(*), INTENT(IN) :: ATTNAME
231  REAL, INTENT(IN) :: RVAL
232  !/ ------------------------------------------------------------------- /
233  !/ Local parameters
234  !/
235  TYPE(meta_pair_t) :: META
236 
237  meta%ATTNAME = attname
238  WRITE(meta%ATTVAL,*) rval
239  meta%TYPE = 'r'
240  CALL meta_list_append(list, meta)
241 
242  END SUBROUTINE meta_list_append_r
243 
244 
245  !/ ------------------------------------------------------------------- /
253  !/ ------------------------------------------------------------------- /
254  SUBROUTINE meta_list_append_i(LIST, ATTNAME, IVAL)
255 
256  IMPLICIT NONE
257 
258  TYPE(meta_list_t), INTENT(INOUT) :: LIST
259  CHARACTER(*), INTENT(IN) :: ATTNAME
260  INTEGER, INTENT(IN) :: IVAL
261  !/ ------------------------------------------------------------------- /
262  !/ Local parameters
263  !/
264  TYPE(meta_pair_t) :: META
265 
266  meta%ATTNAME = attname
267  WRITE(meta%ATTVAL,*) ival
268  meta%TYPE = 'i'
269  CALL meta_list_append(list, meta)
270 
271  END SUBROUTINE meta_list_append_i
272 
273 
274  !/ ------------------------------------------------------------------- /
282  !/ ------------------------------------------------------------------- /
283  SUBROUTINE meta_list_append_c(LIST, ATTNAME, SVAL)
284 
285  IMPLICIT NONE
286 
287  TYPE(meta_list_t), INTENT(INOUT) :: LIST
288  CHARACTER(*), INTENT(IN) :: ATTNAME, SVAL
289  !/ ------------------------------------------------------------------- /
290  !/ Local parameters
291  !/
292  TYPE(meta_pair_t) :: META
293 
294  meta%ATTNAME = attname
295  meta%ATTVAL = sval
296  meta%TYPE = 'c'
297  CALL meta_list_append(list, meta)
298 
299  END SUBROUTINE meta_list_append_c
300 
301 
302  !/ ------------------------------------------------------------------- /
311  !/ ------------------------------------------------------------------- /
312  SUBROUTINE meta_list_find_attr(LIST, ATTN, META, ERR)
313  IMPLICIT NONE
314 
315  TYPE(meta_list_t), INTENT(IN) :: LIST
316  CHARACTER(*), INTENT(IN) :: ATTN
317  TYPE(meta_pair_t), POINTER, INTENT(OUT) :: META
318  INTEGER, INTENT(OUT) :: ERR
319 
320  err = 0
321 
322  ! Empty list?
323  IF(.NOT. ASSOCIATED(list%HEAD)) THEN
324  err = 1
325  RETURN
326  ENDIF
327 
328  meta => list%HEAD
329 
330  DO
331  IF(trim(meta%ATTNAME) == trim(attn)) RETURN
332  IF(.NOT. ASSOCIATED(meta%NEXT)) EXIT
333  meta => meta%NEXT
334  ENDDO
335 
336  ! Not found
337  NULLIFY(meta)
338  err = 2
339 
340  END SUBROUTINE meta_list_find_attr
341 
342 
343  !/ ------------------------------------------------------------------- /
352  !/ ------------------------------------------------------------------- /
353  FUNCTION meta_list_has_attr(LIST, ATTN) RESULT(FOUND)
354 
355  IMPLICIT NONE
356 
357  TYPE(meta_list_t), INTENT(IN) :: list
358  CHARACTER(*), INTENT(IN) :: attn
359  LOGICAL :: found
360  !/ ------------------------------------------------------------------- /
361  !/ Local parameters
362  !/
363  TYPE(meta_pair_t), POINTER :: p
364 
365  found = .false.
366 
367  ! Empty list?
368  IF(.NOT. ASSOCIATED(list%HEAD)) THEN
369  RETURN
370  ENDIF
371 
372  p => list%HEAD
373 
374  DO
375  IF(trim(p%ATTNAME) == trim(attn)) THEN
376  found = .true.
377  RETURN
378  ENDIF
379 
380  IF(.NOT. ASSOCIATED(p%NEXT)) EXIT
381  p => p%NEXT
382  ENDDO
383 
384  END FUNCTION meta_list_has_attr
385 
386  !/ ------------------------------------------------------------------- /
387 END MODULE w3metamd
388 !/ ------------------------------------------------------------------- /
w3metamd::print_meta_list
subroutine print_meta_list(LIST)
Prints meta pairs in list to screen.
Definition: w3metamd.F90:150
w3metamd::meta_list_has_attr
logical function meta_list_has_attr(LIST, ATTN)
Tests whether list contains an entry with specified attname.
Definition: w3metamd.F90:354
w3metamd::unsetc
character(len= *), parameter unsetc
Value to represent "unset" character variable.
Definition: w3metamd.F90:38
w3metamd::meta_list_find_attr
subroutine meta_list_find_attr(LIST, ATTN, META, ERR)
Find (first) entry in list with matching attname.
Definition: w3metamd.F90:313
w3metamd::unsetr
real, parameter unsetr
Value to represent "unset" real variable.
Definition: w3metamd.F90:40
w3metamd::meta_list_append_m
subroutine meta_list_append_m(LIST, META)
Append META_PAIR_T object to list.
Definition: w3metamd.F90:184
w3metamd::meta_list_append_c
subroutine meta_list_append_c(LIST, ATTNAME, SVAL)
Append CHARACTER string value attribute to list.
Definition: w3metamd.F90:284
w3metamd::meta_list_append
Interface to facilitate adding real/int/character values to list.
Definition: w3metamd.F90:57
w3metamd::meta_list_t
Linked list of meta data pairs.
Definition: w3metamd.F90:51
w3metamd::meta_list_append_i
subroutine meta_list_append_i(LIST, ATTNAME, IVAL)
Append INTEGER value attribute to list.
Definition: w3metamd.F90:255
w3metamd
Dynamic storage for meta data attribute/value pairs.
Definition: w3metamd.F90:19
w3metamd::meta_list_append_r
subroutine meta_list_append_r(LIST, ATTNAME, RVAL)
Append REAL value attribute to list.
Definition: w3metamd.F90:226
w3metamd::del_meta_list
subroutine del_meta_list(LIST)
Deletes all entries in list.
Definition: w3metamd.F90:75
w3metamd::copy_meta_list
type(meta_list_t) function copy_meta_list(LIST)
Create a deep copy of a meta data list.
Definition: w3metamd.F90:116
w3metamd::meta_pair_t
Type for storing a user defined metadata pair as linked list element.
Definition: w3metamd.F90:43