FV3-JEDI
fv3jedi_state_interface_mod.F90
Go to the documentation of this file.
1 ! (C) Copyright 2017-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 
6 ! --------------------------------------------------------------------------------------------------
7 
9 
10 ! iso
11 use iso_c_binding
12 
13 ! fckit
14 use fckit_configuration_module, only: fckit_configuration
15 
16 ! oops
17 use datetime_mod
18 use duration_mod
19 use oops_variables_mod
20 
21 ! fv3jedi
28 
29 private
30 public :: fv3jedi_state_registry
31 
32 ! --------------------------------------------------------------------------------------------------
33 
34 #define LISTED_TYPE fv3jedi_state
35 
36 !> Linked list interface - defines registry_t type
37 #include "oops/util/linkedList_i.f"
38 
39 !> Global registry
40 type(registry_t) :: fv3jedi_state_registry
41 
42 ! --------------------------------------------------------------------------------------------------
43 
44 contains
45 
46 ! --------------------------------------------------------------------------------------------------
47 
48 !> Linked list implementation
49 #include "oops/util/linkedList_c.f"
50 
51 ! --------------------------------------------------------------------------------------------------
52 
53 subroutine fv3jedi_state_create_c(c_key_self, c_key_geom, c_vars) &
54  bind(c,name='fv3jedi_state_create_f90')
55 
56 implicit none
57 integer(c_int), intent(inout) :: c_key_self
58 integer(c_int), intent(in) :: c_key_geom !< Geometry
59 type(c_ptr), value, intent(in) :: c_vars !< List of variables
60 
61 type(fv3jedi_state), pointer :: self
62 type(fv3jedi_geom), pointer :: geom
63 type(oops_variables) :: vars
64 
65 call fv3jedi_geom_registry%get(c_key_geom, geom)
66 call fv3jedi_state_registry%init()
67 call fv3jedi_state_registry%add(c_key_self)
68 call fv3jedi_state_registry%get(c_key_self,self)
69 
70 vars = oops_variables(c_vars)
71 call self%create(geom, vars)
72 
73 end subroutine fv3jedi_state_create_c
74 
75 ! --------------------------------------------------------------------------------------------------
76 
77 subroutine fv3jedi_state_delete_c(c_key_self) bind(c,name='fv3jedi_state_delete_f90')
78 
79 implicit none
80 integer(c_int), intent(inout) :: c_key_self
81 type(fv3jedi_state), pointer :: self
82 
83 call fv3jedi_state_registry%get(c_key_self,self)
84 
85 call self%delete()
86 
87 call fv3jedi_state_registry%remove(c_key_self)
88 
89 end subroutine fv3jedi_state_delete_c
90 
91 ! --------------------------------------------------------------------------------------------------
92 
93 subroutine fv3jedi_state_zero_c(c_key_self) bind(c,name='fv3jedi_state_zero_f90')
94 
95 implicit none
96 integer(c_int), intent(in) :: c_key_self
97 type(fv3jedi_state), pointer :: self
98 
99 call fv3jedi_state_registry%get(c_key_self,self)
100 call self%zero()
101 
102 end subroutine fv3jedi_state_zero_c
103 
104 ! --------------------------------------------------------------------------------------------------
105 
106 subroutine fv3jedi_state_copy_c(c_key_self,c_key_rhs) bind(c,name='fv3jedi_state_copy_f90')
107 
108 implicit none
109 integer(c_int), intent(in) :: c_key_self
110 integer(c_int), intent(in) :: c_key_rhs
111 
112 type(fv3jedi_state), pointer :: self
113 type(fv3jedi_state), pointer :: other
114 call fv3jedi_state_registry%get(c_key_self,self)
115 call fv3jedi_state_registry%get(c_key_rhs,other)
116 
117 call self%copy(other)
118 
119 end subroutine fv3jedi_state_copy_c
120 
121 ! --------------------------------------------------------------------------------------------------
122 
123 subroutine fv3jedi_state_axpy_c(c_key_self,c_zz,c_key_rhs) bind(c,name='fv3jedi_state_axpy_f90')
124 
125 implicit none
126 integer(c_int), intent(in) :: c_key_self
127 real(c_double), intent(in) :: c_zz
128 integer(c_int), intent(in) :: c_key_rhs
129 
130 type(fv3jedi_state), pointer :: self
131 type(fv3jedi_state), pointer :: rhs
132 real(kind=kind_real) :: zz
133 
134 call fv3jedi_state_registry%get(c_key_self,self)
135 call fv3jedi_state_registry%get(c_key_rhs,rhs)
136 zz = c_zz
137 
138 call self%accumul(zz,rhs)
139 
140 end subroutine fv3jedi_state_axpy_c
141 
142 ! --------------------------------------------------------------------------------------------------
143 
144 subroutine fv3jedi_state_add_incr_c(c_key_geom,c_key_self,c_key_rhs) &
145  bind(c,name='fv3jedi_state_add_incr_f90')
146 
147 implicit none
148 integer(c_int), intent(in) :: c_key_geom
149 integer(c_int), intent(in) :: c_key_self
150 integer(c_int), intent(in) :: c_key_rhs
151 type(fv3jedi_geom), pointer :: geom
152 type(fv3jedi_state), pointer :: self
153 type(fv3jedi_increment), pointer :: rhs
154 
155 call fv3jedi_state_registry%get(c_key_self,self)
156 call fv3jedi_increment_registry%get(c_key_rhs,rhs)
157 call fv3jedi_geom_registry%get(c_key_geom, geom)
158 
159 call self%add_incr(geom,rhs%fields)
160 
161 end subroutine fv3jedi_state_add_incr_c
162 
163 ! --------------------------------------------------------------------------------------------------
164 
165 subroutine fv3jedi_state_change_resol_c(c_key_state,c_key_geom,c_key_rhs,c_key_geom_rhs) &
166  bind(c,name='fv3jedi_state_change_resol_f90')
167 
168 implicit none
169 integer(c_int), intent(in) :: c_key_state
170 integer(c_int), intent(in) :: c_key_geom
171 integer(c_int), intent(in) :: c_key_rhs
172 integer(c_int), intent(in) :: c_key_geom_rhs
173 
174 type(fv3jedi_state), pointer :: self, other
175 type(fv3jedi_geom), pointer :: geom, geom_other
176 
177 call fv3jedi_state_registry%get(c_key_state,self)
178 call fv3jedi_geom_registry%get(c_key_geom, geom)
179 call fv3jedi_state_registry%get(c_key_rhs, other)
180 call fv3jedi_geom_registry%get(c_key_geom_rhs, geom_other)
181 
182 call self%change_resol(geom, other, geom_other)
183 
184 end subroutine fv3jedi_state_change_resol_c
185 
186 ! --------------------------------------------------------------------------------------------------
187 
188 subroutine fv3jedi_state_read_file_c(c_key_geom, c_key_state, c_conf, c_dt) &
189  bind(c,name='fv3jedi_state_read_file_f90')
190 
191 implicit none
192 integer(c_int), intent(in) :: c_key_state !< State
193 type(c_ptr), intent(in) :: c_conf !< Configuration
194 type(c_ptr), intent(inout) :: c_dt !< DateTime
195 integer(c_int), intent(in) :: c_key_geom !< Geometry
196 
197 type(fv3jedi_state), pointer :: self
198 type(datetime) :: fdate
199 type(fv3jedi_geom), pointer :: geom
200 type(fckit_configuration) :: f_conf
201 
202 call fv3jedi_geom_registry%get(c_key_geom, geom)
203 call fv3jedi_state_registry%get(c_key_state,self)
204 call c_f_datetime(c_dt, fdate)
205 f_conf = fckit_configuration(c_conf)
206 
207 call self%read(geom, f_conf, fdate)
208 
209 end subroutine fv3jedi_state_read_file_c
210 
211 ! --------------------------------------------------------------------------------------------------
212 
213 subroutine fv3jedi_state_analytic_init_c(c_key_state, c_key_geom, c_conf, c_dt) &
214  bind(c,name='fv3jedi_state_analytic_init_f90')
215 
216 implicit none
217 integer(c_int), intent(in) :: c_key_state !< State
218 integer(c_int), intent(in) :: c_key_geom !< Geometry
219 type(c_ptr), intent(in) :: c_conf !< Configuration
220 type(c_ptr), intent(inout) :: c_dt !< DateTime
221 
222 type(fv3jedi_state), pointer :: self
223 type(fv3jedi_geom), pointer :: geom
224 type(datetime) :: fdate
225 type(fckit_configuration) :: f_conf
226 
227 call fv3jedi_geom_registry%get(c_key_geom, geom)
228 call fv3jedi_state_registry%get(c_key_state,self)
229 call c_f_datetime(c_dt, fdate)
230 f_conf = fckit_configuration(c_conf)
231 call self%analytic_IC(geom, f_conf, fdate)
232 
233 end subroutine fv3jedi_state_analytic_init_c
234 
235 ! --------------------------------------------------------------------------------------------------
236 
237 subroutine fv3jedi_state_write_file_c(c_key_geom, c_key_state, c_conf, c_dt) &
238  bind(c,name='fv3jedi_state_write_file_f90')
239 
240 implicit none
241 integer(c_int), intent(in) :: c_key_state !< State
242 type(c_ptr), intent(in) :: c_conf !< Configuration
243 type(c_ptr), intent(in) :: c_dt !< DateTime
244 integer(c_int), intent(in) :: c_key_geom !< Geometry
245 
246 type(fv3jedi_state), pointer :: self
247 type(datetime) :: fdate
248 type(fv3jedi_geom), pointer :: geom
249 type(fckit_configuration) :: f_conf
250 
251 call fv3jedi_geom_registry%get(c_key_geom, geom)
252 call fv3jedi_state_registry%get(c_key_state,self)
253 call c_f_datetime(c_dt, fdate)
254 f_conf = fckit_configuration(c_conf)
255 
256 call self%write(geom, f_conf, fdate)
257 
258 end subroutine fv3jedi_state_write_file_c
259 
260 ! --------------------------------------------------------------------------------------------------
261 
262 subroutine fv3jedi_state_norm_c(c_key_state, prms) bind(c,name='fv3jedi_state_norm_f90')
263 
264 implicit none
265 integer(c_int), intent(in) :: c_key_state
266 real(c_double), intent(inout) :: prms
267 
268 type(fv3jedi_state), pointer :: self
269 real(kind=kind_real) :: zz
270 
271 call fv3jedi_state_registry%get(c_key_state,self)
272 
273 call self%norm(zz)
274 
275 prms = zz
276 
277 end subroutine fv3jedi_state_norm_c
278 
279 ! --------------------------------------------------------------------------------------------------
280 
281 subroutine fv3jedi_state_getnfieldsncube_c(c_key_self, c_number_fields, c_cube_size) &
282  bind(c,name='fv3jedi_state_getnfieldsncube_f90')
283 
284 implicit none
285 integer(c_int), intent(in) :: c_key_self
286 integer(c_int), intent(out) :: c_number_fields
287 integer(c_int), intent(out) :: c_cube_size
288 
289 type(fv3jedi_state), pointer :: self
290 
291 call fv3jedi_state_registry%get(c_key_self,self)
292 
293 c_number_fields = self%nf
294 c_cube_size = self%npx-1
295 
296 end subroutine fv3jedi_state_getnfieldsncube_c
297 
298 ! --------------------------------------------------------------------------------------------------
299 
300 subroutine fv3jedi_state_getminmaxrms_c(c_key_self, c_f_num, c_f_name_len, c_f_name, c_minmaxrms ) &
301  bind(c,name='fv3jedi_state_getminmaxrms_f90')
302 
303 implicit none
304 integer(c_int), intent(in) :: c_key_self
305 integer(c_int), intent(in) :: c_f_num
306 integer(c_int), intent(in) :: c_f_name_len
307 character(len=1,kind=c_char), intent(inout) :: c_f_name(c_f_name_len)
308 real(c_double), intent(inout) :: c_minmaxrms(3)
309 
310 type(fv3jedi_state), pointer :: self
311 character(len=field_clen) :: field_name
312 integer :: n
313 
314 call fv3jedi_state_registry%get(c_key_self,self)
315 
316 call self%minmaxrms(c_f_num, field_name, c_minmaxrms)
317 
318 do n = 1,c_f_name_len
319  c_f_name(n) = field_name(n:n)
320 enddo
321 
322 end subroutine fv3jedi_state_getminmaxrms_c
323 
324 ! --------------------------------------------------------------------------------------------------
325 
326 subroutine fv3jedi_state_sersize_c(c_key_self,inc_size) bind(c,name='fv3jedi_state_sersize_f90')
327 
328 implicit none
329 integer(c_int), intent(in) :: c_key_self
330 integer(c_int), intent(inout) :: inc_size
331 type(fv3jedi_state), pointer :: self
332 integer var, i, j, k
333 
334 call fv3jedi_state_registry%get(c_key_self, self)
335 
336 inc_size = 0
337 do var = 1, self%nf
338  inc_size = inc_size + (self%fields(var)%iec-self%fields(var)%isc+1)*&
339  (self%fields(var)%jec-self%fields(var)%jsc+1)*&
340  self%fields(var)%npz
341 end do
342 
343 end subroutine fv3jedi_state_sersize_c
344 
345 ! --------------------------------------------------------------------------------------------------
346 
347 subroutine fv3jedi_state_serialize_c(c_key_self,c_vsize,c_vect_inc) &
348  bind(c,name='fv3jedi_state_serialize_f90')
349 
350 implicit none
351 
352 ! Passed variables
353 integer(c_int),intent(in) :: c_key_self !< State
354 integer(c_int),intent(in) :: c_vsize !< Size
355 real(c_double),intent(out) :: c_vect_inc(c_vsize) !< Vector
356 
357 type(fv3jedi_state),pointer :: self
358 
359 call fv3jedi_state_registry%get(c_key_self, self)
360 ! Call Fortran
361 call self%serialize(c_vsize,c_vect_inc)
362 
363 end subroutine fv3jedi_state_serialize_c
364 
365 ! --------------------------------------------------------------------------------------------------
366 
367 subroutine fv3jedi_state_deserialize_c(c_key_self,c_vsize,c_vect_inc,c_index) &
368  bind(c,name='fv3jedi_state_deserialize_f90')
369 
370 implicit none
371 
372 ! Passed variables
373 integer(c_int),intent(in) :: c_key_self !< State
374 integer(c_int),intent(in) :: c_vsize !< Size
375 real(c_double),intent(in) :: c_vect_inc(c_vsize) !< Vector
376 integer(c_int), intent(inout):: c_index !< Index
377 
378 type(fv3jedi_state),pointer :: self
379 
380 call fv3jedi_state_registry%get(c_key_self, self)
381 
382 ! Call Fortran
383 call self%deserialize(c_vsize,c_vect_inc,c_index)
384 
385 
386 end subroutine fv3jedi_state_deserialize_c
387 
388 ! --------------------------------------------------------------------------------------------------
389 
fv3jedi_state_interface_mod::fv3jedi_state_create_c
subroutine fv3jedi_state_create_c(c_key_self, c_key_geom, c_vars)
Linked list implementation.
Definition: fv3jedi_state_interface_mod.F90:55
fv3jedi_state_mod::fv3jedi_state
Fortran derived type to hold FV3JEDI state.
Definition: fv3jedi_state_mod.F90:30
fv3jedi_state_interface_mod::fv3jedi_state_zero_c
subroutine fv3jedi_state_zero_c(c_key_self)
Definition: fv3jedi_state_interface_mod.F90:94
fv3jedi_field_mod
Definition: fv3jedi_field_mod.f90:6
fv3jedi_state_interface_mod::fv3jedi_state_sersize_c
subroutine fv3jedi_state_sersize_c(c_key_self, inc_size)
Definition: fv3jedi_state_interface_mod.F90:327
fv3jedi_state_interface_mod::fv3jedi_state_change_resol_c
subroutine fv3jedi_state_change_resol_c(c_key_state, c_key_geom, c_key_rhs, c_key_geom_rhs)
Definition: fv3jedi_state_interface_mod.F90:167
fv3jedi_state_interface_mod
Definition: fv3jedi_state_interface_mod.F90:8
fv3jedi_state_mod
Definition: fv3jedi_state_mod.F90:6
fv3jedi_geom_interface_mod::fv3jedi_geom_registry
type(registry_t), public fv3jedi_geom_registry
Linked list interface - defines registry_t type.
Definition: fv3jedi_geom_interface_mod.F90:34
fv3jedi_state_interface_mod::fv3jedi_state_registry
type(registry_t), public fv3jedi_state_registry
Linked list interface - defines registry_t type.
Definition: fv3jedi_state_interface_mod.F90:40
fv3jedi_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_state_interface_mod::fv3jedi_state_getnfieldsncube_c
subroutine fv3jedi_state_getnfieldsncube_c(c_key_self, c_number_fields, c_cube_size)
Definition: fv3jedi_state_interface_mod.F90:283
fv3jedi_state_interface_mod::fv3jedi_state_write_file_c
subroutine fv3jedi_state_write_file_c(c_key_geom, c_key_state, c_conf, c_dt)
Definition: fv3jedi_state_interface_mod.F90:239
fv3jedi_state_interface_mod::fv3jedi_state_copy_c
subroutine fv3jedi_state_copy_c(c_key_self, c_key_rhs)
Definition: fv3jedi_state_interface_mod.F90:107
fv3jedi_increment_mod
Definition: fv3jedi_increment_mod.F90:6
fv3jedi_state_interface_mod::fv3jedi_state_read_file_c
subroutine fv3jedi_state_read_file_c(c_key_geom, c_key_state, c_conf, c_dt)
Definition: fv3jedi_state_interface_mod.F90:190
fv3jedi_state_interface_mod::fv3jedi_state_norm_c
subroutine fv3jedi_state_norm_c(c_key_state, prms)
Definition: fv3jedi_state_interface_mod.F90:263
fv3jedi_geom_mod::fv3jedi_geom
Fortran derived type to hold geometry data for the FV3JEDI model.
Definition: fv3jedi_geom_mod.f90:46
fv3jedi_state_interface_mod::fv3jedi_state_delete_c
subroutine fv3jedi_state_delete_c(c_key_self)
Definition: fv3jedi_state_interface_mod.F90:78
fv3jedi_state_interface_mod::fv3jedi_state_analytic_init_c
subroutine fv3jedi_state_analytic_init_c(c_key_state, c_key_geom, c_conf, c_dt)
Definition: fv3jedi_state_interface_mod.F90:215
fv3jedi_state_interface_mod::fv3jedi_state_deserialize_c
subroutine fv3jedi_state_deserialize_c(c_key_self, c_vsize, c_vect_inc, c_index)
Definition: fv3jedi_state_interface_mod.F90:369
fv3jedi_state_interface_mod::fv3jedi_state_serialize_c
subroutine fv3jedi_state_serialize_c(c_key_self, c_vsize, c_vect_inc)
Definition: fv3jedi_state_interface_mod.F90:349
fv3jedi_geom_interface_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_interface_mod.F90:8
fv3jedi_kinds_mod::kind_real
integer, parameter, public kind_real
Definition: fv3jedi_kinds_mod.f90:14
fv3jedi_state_interface_mod::fv3jedi_state_axpy_c
subroutine fv3jedi_state_axpy_c(c_key_self, c_zz, c_key_rhs)
Definition: fv3jedi_state_interface_mod.F90:124
fv3jedi_kinds_mod
Definition: fv3jedi_kinds_mod.f90:6
fv3jedi_state_interface_mod::fv3jedi_state_getminmaxrms_c
subroutine fv3jedi_state_getminmaxrms_c(c_key_self, c_f_num, c_f_name_len, c_f_name, c_minmaxrms)
Definition: fv3jedi_state_interface_mod.F90:302
fv3jedi_increment_mod::fv3jedi_increment_registry
type(registry_t), public fv3jedi_increment_registry
Linked list interface - defines registry_t type.
Definition: fv3jedi_increment_mod.F90:60
fv3jedi_state_interface_mod::fv3jedi_state_add_incr_c
subroutine fv3jedi_state_add_incr_c(c_key_geom, c_key_self, c_key_rhs)
Definition: fv3jedi_state_interface_mod.F90:146
fv3jedi_increment_mod::fv3jedi_increment
Definition: fv3jedi_increment_mod.F90:34
fv3jedi_field_mod::field_clen
integer, parameter, public field_clen
Definition: fv3jedi_field_mod.f90:31