FV3-JEDI
fields_metadata_mod.f90
Go to the documentation of this file.
1 ! (C) Copyright 2020 UCAR
2 !
3 ! This software is licensed under the terms of the Apache Licence Version 2.0
4 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5 
7 
8 use iso_c_binding
9 
10 use fckit_c_interop_module, only: c_ptr_to_string
11 
12 use string_f_c_mod, only: f_c_string
13 
14 implicit none
15 
16 private
18 
19 integer, parameter :: clen = 2048 ! If this changes, change below and in FieldsMetadata.interface.cc
20 
22  private
23  type(c_ptr) :: ptr = c_null_ptr
24  contains
25  procedure, public :: get_field
26 end type fields_metadata
27 
29  character(len=clen) :: field_io_name
30  character(len=clen) :: field_name
31  character(len=clen) :: array_kind
32  integer :: levels
33  character(len=clen) :: long_name
34  character(len=clen) :: space
35  character(len=clen) :: stagger_loc
36  logical :: tracer
37  character(len=clen) :: units
38  character(len=clen) :: io_file
39 end type field_metadata
40 
41 interface fields_metadata
42  module procedure create
43 end interface
44 
45 ! --------------------------------------------------------------------------------------------------
46 
47 interface
48  subroutine c_fields_metadata_get_field(ptr, field_io_name, field_name, array_kind, levels, &
49  long_name, space, stagger_loc, tracer, units, io_file) &
50  bind(c, name='fields_metadata_get_field_f')
51  use iso_c_binding
52  integer, parameter :: clen = 2048
53  type(c_ptr), value :: ptr
54  character(len=1, kind=c_char), intent(in) :: field_io_name(clen)
55  character(len=1, kind=c_char), intent(inout) :: field_name(clen)
56  character(len=1, kind=c_char), intent(inout) :: array_kind(clen)
57  integer(kind=c_int), intent(inout) :: levels
58  character(len=1, kind=c_char), intent(inout) :: long_name(clen)
59  character(len=1, kind=c_char), intent(inout) :: space(clen)
60  character(len=1, kind=c_char), intent(inout) :: stagger_loc(clen)
61  logical(c_bool), intent(inout) :: tracer
62  character(len=1, kind=c_char), intent(inout) :: units(clen)
63  character(len=1, kind=c_char), intent(inout) :: io_file(clen)
64  end subroutine c_fields_metadata_get_field
65 end interface
66 
67 ! --------------------------------------------------------------------------------------------------
68 
69 contains
70 
71 ! --------------------------------------------------------------------------------------------------
72 
73 function create(c_ptr_this) result(this)
74 
75 type(c_ptr), value :: c_ptr_this
76 type(fields_metadata) :: this
77 
78 this%ptr = c_ptr_this
79 
80 end function create
81 
82 ! --------------------------------------------------------------------------------------------------
83 
84 function get_field(self, field_io_name_in) result(field)
85 
86 class(fields_metadata), intent(in) :: self
87 character(len=*), intent(in) :: field_io_name_in
88 type(field_metadata) :: field
89 
90 character(len=1, kind=c_char), allocatable :: field_io_name(:)
91 
92 ! String pointers
93 character(len=1, kind=c_char), allocatable :: field_name(:)
94 character(len=1, kind=c_char), allocatable :: array_kind(:)
95 character(len=1, kind=c_char), allocatable :: long_name(:)
96 character(len=1, kind=c_char), allocatable :: space(:)
97 character(len=1, kind=c_char), allocatable :: stagger_loc(:)
98 character(len=1, kind=c_char), allocatable :: units(:)
99 character(len=1, kind=c_char), allocatable :: io_file(:)
100 
101 character(len=clen, kind=c_char) :: field_name_
102 
103 integer(c_int) :: levels
104 logical(c_bool) :: tracer
105 
106 integer :: n, iolen
107 
108 ! field_io_name that can be passed to c++
109 iolen = len(trim(field_io_name_in))
110 allocate(field_io_name(clen))
111 field_io_name = ''
112 do n = 1,iolen
113  field_io_name(n) = field_io_name_in(n:n)
114 enddo
115 field_io_name(iolen+1) = c_null_char
116 
117 ! Allocate outputs
118 allocate(field_name(clen))
119 allocate(array_kind(clen))
120 allocate(long_name(clen))
121 allocate(space(clen))
122 allocate(stagger_loc(clen))
123 allocate(units(clen))
124 allocate(io_file(clen))
125 
126 field_name = c_null_char
127 array_kind = c_null_char
128 long_name = c_null_char
129 space = c_null_char
130 stagger_loc = c_null_char
131 units = c_null_char
132 io_file = c_null_char
133 
134 ! Get information from C++ object
135 call c_fields_metadata_get_field(self%ptr, field_io_name, field_name, array_kind, levels, &
136  long_name, space, stagger_loc, tracer, units, io_file )
137 
138 ! FieldNameIO
139 field%field_io_name = ''
140 do n = 1,clen
141  if (field_io_name(n) == c_null_char) exit
142  field%field_io_name(n:n) = field_io_name(n)
143 enddo
144 
145 ! FieldName
146 field%field_name = ''
147 do n = 1,clen
148  if (field_name(n) == c_null_char) exit
149  field%field_name(n:n) = field_name(n)
150 enddo
151 
152 ! ArrayKind
153 field%array_kind = ''
154 do n = 1,clen
155  if (array_kind(n) == c_null_char) exit
156  field%array_kind(n:n) = array_kind(n)
157 enddo
158 
159 ! Levels
160 field%levels = levels
161 
162 ! LongName
163 field%long_name = ''
164 do n = 1,clen
165  if (long_name(n) == c_null_char) exit
166  field%long_name(n:n) = long_name(n)
167 enddo
168 
169 ! Space
170 field%space = ''
171 do n = 1,clen
172  if (space(n) == c_null_char) exit
173  field%space(n:n) = space(n)
174 enddo
175 
176 ! StaggerLoc
177 field%stagger_loc = ''
178 do n = 1,clen
179  if (stagger_loc(n) == c_null_char) exit
180  field%stagger_loc(n:n) = stagger_loc(n)
181 enddo
182 
183 ! Tracer
184 field%tracer = tracer
185 
186 ! Units
187 field%units = ''
188 do n = 1,clen
189  if (units(n) == c_null_char) exit
190  field%units(n:n) = units(n)
191 enddo
192 
193 ! IO file name
194 field%io_file = ''
195 do n = 1,clen
196  if (io_file(n) == c_null_char) exit
197  field%io_file(n:n) = io_file(n)
198 enddo
199 
200 end function get_field
201 
202 ! --------------------------------------------------------------------------------------------------
203 
204 end module fields_metadata_mod
fields_metadata_mod::get_field
type(field_metadata) function get_field(self, field_io_name_in)
Definition: fields_metadata_mod.f90:85
fields_metadata_mod::c_fields_metadata_get_field
Definition: fields_metadata_mod.f90:48
fields_metadata_mod::field_metadata
Definition: fields_metadata_mod.f90:28
fields_metadata_mod
Definition: fields_metadata_mod.f90:6
fields_metadata_mod::fields_metadata
Definition: fields_metadata_mod.f90:21
fields_metadata_mod::clen
integer, parameter clen
Definition: fields_metadata_mod.f90:19
fields_metadata_mod::create
type(fields_metadata) function create(c_ptr_this)
Definition: fields_metadata_mod.f90:74