WAVEWATCH III  beta 0.0.1
w3metamd Module Reference

Dynamic storage for meta data attribute/value pairs. More...

Data Types

interface  meta_list_append
 Interface to facilitate adding real/int/character values to list. More...
 
type  meta_list_t
 Linked list of meta data pairs. More...
 
type  meta_pair_t
 Type for storing a user defined metadata pair as linked list element. More...
 

Functions/Subroutines

subroutine del_meta_list (LIST)
 Deletes all entries in list. More...
 
type(meta_list_t) function copy_meta_list (LIST)
 Create a deep copy of a meta data list. More...
 
subroutine print_meta_list (LIST)
 Prints meta pairs in list to screen. More...
 
subroutine meta_list_append_m (LIST, META)
 Append META_PAIR_T object to list. More...
 
subroutine meta_list_append_r (LIST, ATTNAME, RVAL)
 Append REAL value attribute to list. More...
 
subroutine meta_list_append_i (LIST, ATTNAME, IVAL)
 Append INTEGER value attribute to list. More...
 
subroutine meta_list_append_c (LIST, ATTNAME, SVAL)
 Append CHARACTER string value attribute to list. More...
 
subroutine meta_list_find_attr (LIST, ATTN, META, ERR)
 Find (first) entry in list with matching attname. More...
 
logical function meta_list_has_attr (LIST, ATTN)
 Tests whether list contains an entry with specified attname. More...
 

Variables

character(len= *), parameter unsetc = "unset"
 Value to represent "unset" character variable. More...
 
real, parameter unsetr = HUGE(1.0)
 Value to represent "unset" real variable. More...
 

Detailed Description

Dynamic storage for meta data attribute/value pairs.

Provides types for handling "meta data" (attribute/value pairs) and a linked list construct for dynamic storage.

Change log

Date Ver Comments
16-Dec-2020 7.12 Creation
Author
Chris Bunney
Date
16-Dec-2020

Function/Subroutine Documentation

◆ copy_meta_list()

type(meta_list_t) function w3metamd::copy_meta_list ( type(meta_list_t), intent(in)  LIST)

Create a deep copy of a meta data list.

A "deep copy" ensures that a copy is made of the underlying linked list, rather than a simply copy of the pointers to the existing list.

Parameters
[in]LISTThe list to copy
Returns
A new META_LIST_T
Author
Chris Bunney

Definition at line 116 of file w3metamd.F90.

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 

References meta_list_append_m().

◆ del_meta_list()

subroutine w3metamd::del_meta_list ( type(meta_list_t), intent(inout)  LIST)

Deletes all entries in list.

Parameters
[in,out]LISTThe list to clear.
Author
Chris Bunney

Definition at line 75 of file w3metamd.F90.

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 

Referenced by w3ounfmetamd::teardown_meta().

◆ meta_list_append_c()

subroutine w3metamd::meta_list_append_c ( type(meta_list_t), intent(inout)  LIST,
character(*), intent(in)  ATTNAME,
character(*), intent(in)  SVAL 
)

Append CHARACTER string value attribute to list.

Parameters
[in,out]LISTThe list to append to
[in]ATTNAMEThe attribute name
[in]SVALThe attribute value (CHARACTER string)
Author
Chris Bunney

Definition at line 284 of file w3metamd.F90.

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 

◆ meta_list_append_i()

subroutine w3metamd::meta_list_append_i ( type(meta_list_t), intent(inout)  LIST,
character(*), intent(in)  ATTNAME,
integer, intent(in)  IVAL 
)

Append INTEGER value attribute to list.

Parameters
[in,out]LISTThe list to append to
[in]ATTNAMEThe attribute name
[in]IVALThe attribute value (INTEGER)
Author
Chris Bunney

Definition at line 255 of file w3metamd.F90.

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 

◆ meta_list_append_m()

subroutine w3metamd::meta_list_append_m ( type(meta_list_t), intent(inout)  LIST,
type(meta_pair_t), intent(in)  META 
)

Append META_PAIR_T object to list.

Parameters
[in,out]LISTThe list to append to
[in]METAThe META_PAIR_T object to append.
Author
Chris Bunney

Definition at line 184 of file w3metamd.F90.

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 

Referenced by copy_meta_list().

◆ meta_list_append_r()

subroutine w3metamd::meta_list_append_r ( type(meta_list_t), intent(inout)  LIST,
character(*), intent(in)  ATTNAME,
real, intent(in)  RVAL 
)

Append REAL value attribute to list.

Parameters
[in,out]LISTThe list to append to
[in]ATTNAMEThe attribute name
[in]RVALThe attribute value (REAL)
Author
Chris Bunney

Definition at line 226 of file w3metamd.F90.

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 

◆ meta_list_find_attr()

subroutine w3metamd::meta_list_find_attr ( type(meta_list_t), intent(in)  LIST,
character(*), intent(in)  ATTN,
type(meta_pair_t), intent(out), pointer  META,
integer, intent(out)  ERR 
)

Find (first) entry in list with matching attname.

Parameters
[in]LISTList to search
[in]ATTNAttribute name to search for
[out]METAMeta data type to store matched result in
[out]ERRError status (0=Found, 1=Empty list, 2=Not found)
Author
Chris Bunney

Definition at line 313 of file w3metamd.F90.

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 

◆ meta_list_has_attr()

logical function w3metamd::meta_list_has_attr ( type(meta_list_t), intent(in)  LIST,
character(*), intent(in)  ATTN 
)

Tests whether list contains an entry with specified attname.

Parameters
[in]LISTThe list to search
[in]ATTNAttribute name to search for
Returns
LOGICAL: True if match found, False otherwise.
Author
Chris Bunney

Definition at line 354 of file w3metamd.F90.

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 

◆ print_meta_list()

subroutine w3metamd::print_meta_list ( type(meta_list_t), intent(in)  LIST)

Prints meta pairs in list to screen.

Parameters
[in]LISTLinked list of meta data to print
Author
Chris Bunney

Definition at line 150 of file w3metamd.F90.

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 

Variable Documentation

◆ unsetc

character(len=*), parameter w3metamd::unsetc = "unset"

Value to represent "unset" character variable.

Definition at line 38 of file w3metamd.F90.

38  CHARACTER(LEN=*), PARAMETER :: UNSETC = "unset"

◆ unsetr

real, parameter w3metamd::unsetr = HUGE(1.0)

Value to represent "unset" real variable.

Definition at line 40 of file w3metamd.F90.

40  REAL, PARAMETER :: UNSETR = huge(1.0)