9 use fckit_configuration_module,
only: fckit_configuration, fckit_yamlconfiguration
10 use fckit_pathname_module,
only : fckit_pathname
20 character(len=:),
allocatable :: name
21 character(len=1) :: grid
23 character(len=:),
allocatable :: levels
24 character(len=:),
allocatable :: getval_name
25 character(len=:),
allocatable :: getval_name_surface
26 character(len=:),
allocatable :: io_file
27 character(len=:),
allocatable :: io_name
28 character(len=:),
allocatable :: property
43 procedure :: create => soca_fields_metadata_create
46 procedure :: clone => soca_fields_metadata_clone
66 subroutine soca_fields_metadata_create(self, filename)
68 character(len=:),
allocatable,
intent(in) :: filename
70 type(fckit_configuration) :: conf
71 type(fckit_configuration),
allocatable :: conf_list(:)
75 character(len=:),
allocatable :: str
78 conf = fckit_yamlconfiguration( fckit_pathname(filename))
79 call conf%get_or_die(
"", conf_list)
80 allocate(self%metadata(
size(conf_list)))
81 do i=1,
size(self%metadata)
83 call conf_list(i)%get_or_die(
"name", self%metadata(i)%name)
85 if(.not. conf_list(i)%get(
"grid", str)) str =
'h'
86 self%metadata(i)%grid = str
88 if(.not. conf_list(i)%get(
"masked", bool)) bool = .true.
89 self%metadata(i)%masked = bool
91 if(.not. conf_list(i)%get(
"levels", str)) str =
"1"
92 self%metadata(i)%levels = str
94 if(.not. conf_list(i)%get(
"getval name", str)) str=self%metadata(i)%name
95 self%metadata(i)%getval_name = str
97 if(.not. conf_list(i)%get(
"getval name surface", str)) str=
""
98 self%metadata(i)%getval_name_surface = str
100 if(.not. conf_list(i)%get(
"io name", str)) str =
""
101 self%metadata(i)%io_name = str
103 if(.not. conf_list(i)%get(
"io file", str)) str =
""
104 self%metadata(i)%io_file = str
106 if(.not. conf_list(i)%get(
"property", str)) str =
"none"
107 self%metadata(i)%property = str
109 if(.not. conf_list(i)%get(
"dummy_atm", bool)) bool = .false.
110 self%metadata(i)%dummy_atm = bool
114 do i=1,
size(self%metadata)
115 do j=i+1,
size(self%metadata)
116 if ( self%metadata(i)%name == self%metadata(j)%name .or. &
117 self%metadata(i)%name == self%metadata(j)%getval_name .or. &
118 self%metadata(i)%name == self%metadata(j)%getval_name_surface .or. &
119 self%metadata(i)%getval_name == self%metadata(j)%name .or. &
120 self%metadata(i)%getval_name == self%metadata(j)%getval_name .or. &
121 self%metadata(i)%getval_name == self%metadata(j)%getval_name_surface .or. &
122 ( self%metadata(i)%getval_name_surface /=
"" .and. ( &
123 self%metadata(i)%getval_name_surface == self%metadata(j)%name .or. &
124 self%metadata(i)%getval_name_surface == self%metadata(j)%getval_name )))
then
126 write(str, *)
"Duplicate field metadata: ", i, self%metadata(i)%name, &
127 j, self%metadata(j)%name
140 subroutine soca_fields_metadata_clone(self, rhs)
144 self%metadata = rhs%metadata
155 character(len=:),
allocatable,
intent(in) :: name
161 do i=1,
size(self%metadata)
162 if( trim(self%metadata(i)%name) == trim(name) .or. &
163 trim(self%metadata(i)%getval_name) == trim(name) .or. &
164 trim(self%metadata(i)%getval_name_surface) == trim(name) )
then
165 field = self%metadata(i)
170 call abor1_ftn(
"Unable to find field metadata for: " // name)