OOPS
qg_fields_interface.F90
Go to the documentation of this file.
1 ! (C) Copyright 2009-2016 ECMWF.
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 ! In applying this licence, ECMWF does not waive the privileges and immunities
6 ! granted to it by virtue of its status as an intergovernmental organisation nor
7 ! does it submit to any jurisdiction.
8 
10 
11 use atlas_module, only: atlas_fieldset
12 use datetime_mod
13 use fckit_configuration_module, only: fckit_configuration
14 use iso_c_binding
15 use kinds
16 use qg_fields_mod
17 use qg_geom_mod
19 use qg_gom_mod
20 use qg_locs_mod
22 
23 implicit none
24 
25 private
26 ! ------------------------------------------------------------------------------
27 contains
28 ! ------------------------------------------------------------------------------
29 !> Create fields from geometry and variables
30 subroutine qg_fields_create_c(c_key_self,c_key_geom,c_vars,c_lbc) bind(c,name='qg_fields_create_f90')
31 
32 implicit none
33 
34 ! Passed variables
35 integer(c_int),intent(inout) :: c_key_self !< Fields
36 integer(c_int),intent(in) :: c_key_geom !< Geometry
37 type(c_ptr),value,intent(in) :: c_vars !< List of variables
38 logical(c_bool),intent(in) :: c_lbc !< Boundaries flag
39 
40 ! Local variables
41 type(qg_fields),pointer :: self
42 type(qg_geom),pointer :: geom
43 type(oops_variables) :: vars
44 logical :: lbc
45 
46 ! Interface
47 call qg_fields_registry%init()
48 call qg_fields_registry%add(c_key_self)
49 call qg_fields_registry%get(c_key_self,self)
50 call qg_geom_registry%get(c_key_geom,geom)
51 vars = oops_variables(c_vars)
52 lbc = c_lbc
53 
54 ! Call Fortran
55 call qg_fields_create(self,geom,vars,lbc)
56 
57 end subroutine qg_fields_create_c
58 ! ------------------------------------------------------------------------------
59 !> Create fields from another one
60 subroutine qg_fields_create_from_other_c(c_key_self,c_key_other) bind(c,name='qg_fields_create_from_other_f90')
61 
62 implicit none
63 
64 ! Passed variables
65 integer(c_int),intent(inout) :: c_key_self !< Fields
66 integer(c_int),intent(in) :: c_key_other !< Other fields
67 
68 ! Local variables
69 type(qg_fields),pointer :: self
70 type(qg_fields),pointer :: other
71 
72 ! Interface
73 call qg_fields_registry%get(c_key_other,other)
74 call qg_fields_registry%init()
75 call qg_fields_registry%add(c_key_self)
76 call qg_fields_registry%get(c_key_self,self)
77 
78 ! Call Fortran
79 call qg_fields_create_from_other(self,other)
80 
81 end subroutine qg_fields_create_from_other_c
82 ! ------------------------------------------------------------------------------
83 !> Delete fields
84 subroutine qg_fields_delete_c(c_key_self) bind(c,name='qg_fields_delete_f90')
85 
86 implicit none
87 
88 ! Passed variables
89 integer(c_int),intent(inout) :: c_key_self !< Fields
90 
91 ! Local variables
92 type(qg_fields),pointer :: self
93 
94 ! Interface
95 call qg_fields_registry%get(c_key_self,self)
96 
97 ! Call Fortran
98 call qg_fields_delete(self)
99 
100 ! Clear interface
101 call qg_fields_registry%remove(c_key_self)
102 
103 end subroutine qg_fields_delete_c
104 ! ------------------------------------------------------------------------------
105 !> Set fields to zero
106 subroutine qg_fields_zero_c(c_key_self) bind(c,name='qg_fields_zero_f90')
107 
108 implicit none
109 
110 ! Passed variables
111 integer(c_int),intent(in) :: c_key_self !< Fields
112 
113 ! Local variables
114 type(qg_fields),pointer :: self
115 
116 ! Interface
117 call qg_fields_registry%get(c_key_self,self)
118 
119 ! Call Fortran
120 call qg_fields_zero(self)
121 
122 end subroutine qg_fields_zero_c
123 ! ------------------------------------------------------------------------------
124 !> Set fields to ones
125 subroutine qg_fields_ones_c(c_key_self) bind(c,name='qg_fields_ones_f90')
126 
127 implicit none
128 
129 ! Passed variables
130 integer(c_int),intent(in) :: c_key_self !< Fields
131 
132 ! Local variables
133 type(qg_fields),pointer :: self
134 
135 ! Interface
136 call qg_fields_registry%get(c_key_self,self)
137 
138 ! Call Fortran
139 call qg_fields_ones(self)
140 
141 end subroutine qg_fields_ones_c
142 ! ------------------------------------------------------------------------------
143 !> Set fields to Diracs
144 subroutine qg_fields_dirac_c(c_key_self,c_conf) bind(c,name='qg_fields_dirac_f90')
145 
146 implicit none
147 
148 ! Passed variables
149 integer(c_int),intent(in) :: c_key_self !< Fields
150 type(c_ptr),value,intent(in) :: c_conf !< Configuration
151 
152 ! Local variables
153 type(fckit_configuration) :: f_conf
154 type(qg_fields),pointer :: self
155 
156 ! Interface
157 f_conf = fckit_configuration(c_conf)
158 call qg_fields_registry%get(c_key_self,self)
159 
160 ! Call Fortran
161 call qg_fields_dirac(self,f_conf)
162 
163 end subroutine qg_fields_dirac_c
164 ! ------------------------------------------------------------------------------
165 !> Generate random fields
166 subroutine qg_fields_random_c(c_key_self) bind(c,name='qg_fields_random_f90')
167 
168 implicit none
169 
170 ! Passed variables
171 integer(c_int),intent(in) :: c_key_self !< Fields
172 
173 ! Local variables
174 type(qg_fields),pointer :: self
175 
176 ! Interface
177 call qg_fields_registry%get(c_key_self,self)
178 
179 ! Call Fortran
180 call qg_fields_random(self)
181 
182 end subroutine qg_fields_random_c
183 ! ------------------------------------------------------------------------------
184 !> Copy fields
185 subroutine qg_fields_copy_c(c_key_self,c_key_other) bind(c,name='qg_fields_copy_f90')
186 
187 implicit none
188 
189 ! Passed variables
190 integer(c_int),intent(in) :: c_key_self !< Fields
191 integer(c_int),intent(in) :: c_key_other !< Other fields
192 
193 ! Local variables
194 type(qg_fields),pointer :: self
195 type(qg_fields),pointer :: other
196 
197 ! Interface
198 call qg_fields_registry%get(c_key_self,self)
199 call qg_fields_registry%get(c_key_other,other)
200 
201 ! Call Fortran
202 call qg_fields_copy(self,other)
203 
204 end subroutine qg_fields_copy_c
205 ! ------------------------------------------------------------------------------
206 !> Add fields
207 subroutine qg_fields_self_add_c(c_key_self,c_key_rhs) bind(c,name='qg_fields_self_add_f90')
208 
209 implicit none
210 
211 ! Passed variables
212 integer(c_int),intent(in) :: c_key_self !< Fields
213 integer(c_int),intent(in) :: c_key_rhs !< Right-hand side
214 
215 ! Local variables
216 type(qg_fields),pointer :: self
217 type(qg_fields),pointer :: rhs
218 
219 ! Interface
220 call qg_fields_registry%get(c_key_self,self)
221 call qg_fields_registry%get(c_key_rhs,rhs)
222 
223 ! Call Fortran
224 call qg_fields_self_add(self,rhs)
225 
226 end subroutine qg_fields_self_add_c
227 ! ------------------------------------------------------------------------------
228 !> Subtract fields
229 subroutine qg_fields_self_sub_c(c_key_self,c_key_rhs) bind(c,name='qg_fields_self_sub_f90')
230 
231 implicit none
232 
233 ! Passed variables
234 integer(c_int),intent(in) :: c_key_self !< Fields
235 integer(c_int),intent(in) :: c_key_rhs !< Right-hand side
236 
237 ! Local variables
238 type(qg_fields),pointer :: self
239 type(qg_fields),pointer :: rhs
240 
241 ! Interface
242 call qg_fields_registry%get(c_key_self,self)
243 call qg_fields_registry%get(c_key_rhs,rhs)
244 
245 ! Call Fortran
246 call qg_fields_self_sub(self,rhs)
247 
248 end subroutine qg_fields_self_sub_c
249 ! ------------------------------------------------------------------------------
250 !> Multiply fields by a scalar
251 subroutine qg_fields_self_mul_c(c_key_self,c_zz) bind(c,name='qg_fields_self_mul_f90')
252 
253 implicit none
254 
255 ! Passed variables
256 integer(c_int),intent(in) :: c_key_self !< Fields
257 real(c_double),intent(in) :: c_zz !< Multiplier
258 
259 ! Local variables
260 type(qg_fields),pointer :: self
261 
262 ! Interface
263 call qg_fields_registry%get(c_key_self,self)
264 
265 ! Call Fortran
266 call qg_fields_self_mul(self,c_zz)
267 
268 end subroutine qg_fields_self_mul_c
269 ! ------------------------------------------------------------------------------
270 !> Apply axpy operator to fields
271 subroutine qg_fields_axpy_c(c_key_self,c_zz,c_key_rhs) bind(c,name='qg_fields_axpy_f90')
272 
273 implicit none
274 
275 ! Passed variables
276 integer(c_int),intent(in) :: c_key_self !< Fields
277 real(c_double),intent(in) :: c_zz !< Multiplier
278 integer(c_int),intent(in) :: c_key_rhs !< Right-hand side
279 
280 ! Local variables
281 type(qg_fields),pointer :: self
282 type(qg_fields),pointer :: rhs
283 
284 ! Interface
285 call qg_fields_registry%get(c_key_self,self)
286 call qg_fields_registry%get(c_key_rhs,rhs)
287 
288 ! Call Fortran
289 call qg_fields_axpy(self,c_zz,rhs)
290 
291 end subroutine qg_fields_axpy_c
292 ! ------------------------------------------------------------------------------
293 !> Schur product of fields
294 subroutine qg_fields_self_schur_c(c_key_self,c_key_rhs) bind(c,name='qg_fields_self_schur_f90')
295 
296 implicit none
297 
298 ! Passed variables
299 integer(c_int),intent(in) :: c_key_self !< Fields
300 integer(c_int),intent(in) :: c_key_rhs !< Right-hand side
301 
302 ! Local variables
303 type(qg_fields),pointer :: self
304 type(qg_fields),pointer :: rhs
305 
306 ! Interface
307 call qg_fields_registry%get(c_key_self,self)
308 call qg_fields_registry%get(c_key_rhs,rhs)
309 
310 ! Call Fortran
311 call qg_fields_self_schur(self,rhs)
312 
313 end subroutine qg_fields_self_schur_c
314 ! ------------------------------------------------------------------------------
315 !> Compute dot product for fields
316 subroutine qg_fields_dot_prod_c(c_key_fld1,c_key_fld2,c_prod) bind(c,name='qg_fields_dot_prod_f90')
317 
318 implicit none
319 
320 ! Passed variables
321 integer(c_int),intent(in) :: c_key_fld1 !< First fields
322 integer(c_int),intent(in) :: c_key_fld2 !< Second fields
323 real(c_double),intent(inout) :: c_prod !< Dot product
324 
325 ! Local variables
326 type(qg_fields),pointer :: fld1,fld2
327 
328 ! Interface
329 call qg_fields_registry%get(c_key_fld1,fld1)
330 call qg_fields_registry%get(c_key_fld2,fld2)
331 
332 ! Call Fortran
333 call qg_fields_dot_prod(fld1,fld2,c_prod)
334 
335 end subroutine qg_fields_dot_prod_c
336 ! ------------------------------------------------------------------------------
337 !> Add increment to fields
338 subroutine qg_fields_add_incr_c(c_key_self,c_key_rhs) bind(c,name='qg_fields_add_incr_f90')
339 
340 implicit none
341 
342 ! Passed variables
343 integer(c_int),intent(in) :: c_key_self !< Fields
344 integer(c_int),intent(in) :: c_key_rhs !< Right-hand side
345 
346 ! Local variables
347 type(qg_fields),pointer :: self
348 type(qg_fields),pointer :: rhs
349 
350 ! Interface
351 call qg_fields_registry%get(c_key_self,self)
352 call qg_fields_registry%get(c_key_rhs,rhs)
353 
354 ! Call Fortran
355 call qg_fields_add_incr(self,rhs)
356 
357 end subroutine qg_fields_add_incr_c
358 ! ------------------------------------------------------------------------------
359 !> Compute increment from the difference of two fields
360 subroutine qg_fields_diff_incr_c(c_key_lhs,c_key_fld1,c_key_fld2) bind(c,name='qg_fields_diff_incr_f90')
361 
362 implicit none
363 
364 ! Passed variables
365 integer(c_int),intent(in) :: c_key_lhs !< Left-hand side
366 integer(c_int),intent(in) :: c_key_fld1 !< First fields
367 integer(c_int),intent(in) :: c_key_fld2 !< Second fields
368 
369 ! Local variables
370 type(qg_fields),pointer :: lhs
371 type(qg_fields),pointer :: fld1
372 type(qg_fields),pointer :: fld2
373 
374 ! Interface
375 call qg_fields_registry%get(c_key_lhs,lhs)
376 call qg_fields_registry%get(c_key_fld1,fld1)
377 call qg_fields_registry%get(c_key_fld2,fld2)
378 
379 ! Call Fortran
380 call qg_fields_diff_incr(lhs,fld1,fld2)
381 
382 end subroutine qg_fields_diff_incr_c
383 ! ------------------------------------------------------------------------------
384 !> Change fields resolution
385 subroutine qg_fields_change_resol_c(c_key_fld,c_key_rhs) bind(c,name='qg_fields_change_resol_f90')
386 
387 implicit none
388 
389 ! Passed variables
390 integer(c_int),intent(in) :: c_key_fld !< Fields
391 integer(c_int),intent(in) :: c_key_rhs !< Right-hand side
392 
393 ! Local variables
394 type(qg_fields),pointer :: fld,rhs
395 
396 ! Interface
397 call qg_fields_registry%get(c_key_fld,fld)
398 call qg_fields_registry%get(c_key_rhs,rhs)
399 
400 ! Call Fortran
401 call qg_fields_change_resol(fld,rhs)
402 
403 end subroutine qg_fields_change_resol_c
404 ! ------------------------------------------------------------------------------
405 !> Read fields from file
406 subroutine qg_fields_read_file_c(c_key_fld,c_conf,c_dt) bind(c,name='qg_fields_read_file_f90')
407 
408 implicit none
409 
410 ! Passed variables
411 integer(c_int),intent(in) :: c_key_fld !< Fields
412 type(c_ptr),value,intent(in) :: c_conf !< Configuration
413 type(c_ptr),value,intent(in) :: c_dt !< Date and time
414 
415 ! Local variables
416 type(fckit_configuration) :: f_conf
417 type(qg_fields),pointer :: fld
418 type(datetime) :: fdate
419 
420 ! Interface
421 f_conf = fckit_configuration(c_conf)
422 call qg_fields_registry%get(c_key_fld,fld)
423 call c_f_datetime(c_dt,fdate)
424 
425 ! Call Fortran
426 call qg_fields_read_file(fld,f_conf,fdate)
427 
428 end subroutine qg_fields_read_file_c
429 ! ------------------------------------------------------------------------------
430 !> Write fields to file
431 subroutine qg_fields_write_file_c(c_key_fld,c_conf,c_dt) bind(c,name='qg_fields_write_file_f90')
432 
433 implicit none
434 
435 ! Passed variables
436 integer(c_int),intent(in) :: c_key_fld !< Fields
437 type(c_ptr),value,intent(in) :: c_conf !< Configuration
438 type(c_ptr),value,intent(in) :: c_dt !< Date and time
439 
440 ! Local variables
441 type(fckit_configuration) :: f_conf
442 type(qg_fields),pointer :: fld
443 type(datetime) :: fdate
444 
445 ! Interface
446 f_conf = fckit_configuration(c_conf)
447 call qg_fields_registry%get(c_key_fld,fld)
448 call c_f_datetime(c_dt,fdate)
449 
450 ! Call Fortran
451 call qg_fields_write_file(fld,f_conf,fdate)
452 
453 end subroutine qg_fields_write_file_c
454 ! ------------------------------------------------------------------------------
455 !> Analytic initialization of fields
456 subroutine qg_fields_analytic_init_c(c_key_fld,c_conf,c_dt) bind(c,name='qg_fields_analytic_init_f90')
457 
458 implicit none
459 
460 ! Passed variables
461 integer(c_int),intent(in) :: c_key_fld !< Fields
462 type(c_ptr),value,intent(in) :: c_conf !< Configuration
463 type(c_ptr),value,intent(in) :: c_dt !< Date and time
464 
465 ! Local variables
466 type(fckit_configuration) :: f_conf
467 type(qg_fields),pointer :: fld
468 type(datetime) :: fdate
469 
470 ! Interface
471 f_conf = fckit_configuration(c_conf)
472 call qg_fields_registry%get(c_key_fld,fld)
473 call c_f_datetime(c_dt,fdate)
474 
475 ! Call Fortran
476  call qg_fields_analytic_init(fld,f_conf,fdate)
477 
478 end subroutine qg_fields_analytic_init_c
479 ! ------------------------------------------------------------------------------
480 !> Fields statistics
481 subroutine qg_fields_gpnorm_c(c_key_fld,nb,pstat) bind(c,name='qg_fields_gpnorm_f90')
482 
483 implicit none
484 
485 ! Passed variables
486 integer(c_int),intent(in) :: c_key_fld !< Fields
487 integer(c_int),intent(in) :: nb !< Number of boundaries
488 real(c_double),intent(inout) :: pstat(4*(1+nb)) !< Statistics
489 
490 ! Local variables
491 type(qg_fields),pointer :: fld
492 
493 ! Interface
494 call qg_fields_registry%get(c_key_fld,fld)
495 
496 ! Call Fortran
497 call qg_fields_gpnorm(fld,nb,pstat)
498 
499 end subroutine qg_fields_gpnorm_c
500 ! ------------------------------------------------------------------------------
501 !> Fields RMS
502 subroutine qg_fields_rms_c(c_key_fld,prms) bind(c,name='qg_fields_rms_f90')
503 
504 implicit none
505 
506 ! Passed variables
507 integer(c_int),intent(in) :: c_key_fld !< Fields
508 real(c_double),intent(inout) :: prms
509 
510 ! Local variables
511 type(qg_fields),pointer :: fld
512 
513 ! Interface
514 call qg_fields_registry%get(c_key_fld,fld)
515 
516 ! Call Fortran
517 call qg_fields_rms(fld,prms)
518 
519 end subroutine qg_fields_rms_c
520 ! ------------------------------------------------------------------------------
521 !> Get fields geometry
522 subroutine qg_fields_sizes_c(c_key_fld,c_nx,c_ny,c_nz,c_nb) bind(c,name='qg_fields_sizes_f90')
523 
524 implicit none
525 
526 ! Passed variables
527 integer(c_int),intent(in) :: c_key_fld !< Fields
528 integer(c_int),intent(inout) :: c_nx !< X size
529 integer(c_int),intent(inout) :: c_ny !< Y size
530 integer(c_int),intent(inout) :: c_nz !< Z size
531 integer(c_int),intent(inout) :: c_nb !< Number of boundaries
532 
533 ! Local variables
534 type(qg_fields),pointer :: fld
535 
536 ! Interface
537 call qg_fields_registry%get(c_key_fld,fld)
538 
539 ! Call Fortran
540 call qg_fields_sizes(fld,c_nx,c_ny,c_nz,c_nb)
541 
542 end subroutine qg_fields_sizes_c
543 ! ------------------------------------------------------------------------------
544 !> Get fields variables
545 subroutine qg_fields_vars_c(c_key_fld,c_lq,c_lbc) bind(c,name='qg_fields_vars_f90')
546 
547 implicit none
548 
549 ! Passed variables
550 integer(c_int),intent(in) :: c_key_fld !< Fields
551 integer(c_int),intent(inout) :: c_lq !< Potential vorticity flag
552 integer(c_int),intent(inout) :: c_lbc !< Boundaries flag
553 
554 ! Local variables
555 type(qg_fields),pointer :: fld
556 
557 ! Interface
558 call qg_fields_registry%get(c_key_fld,fld)
559 
560 ! Call Fortran
561 call qg_fields_vars(fld,c_lq,c_lbc)
562 
563 end subroutine qg_fields_vars_c
564 ! ------------------------------------------------------------------------------
565 !> Create ATLAS fields
566 subroutine qg_fields_set_atlas_c(c_key_fld,c_vars,c_afieldset) bind (c,name='qg_fields_set_atlas_f90')
567 
568 implicit none
569 
570 ! Passed variables
571 integer(c_int),intent(in) :: c_key_fld !< Fields
572 type(c_ptr),value,intent(in) :: c_vars !< List of variables
573 type(c_ptr),intent(in),value :: c_afieldset !< ATLAS fieldset pointer
574 
575 ! Local variables
576 type(qg_fields),pointer :: fld
577 type(oops_variables) :: vars
578 type(atlas_fieldset) :: afieldset
579 
580 ! Interface
581 call qg_fields_registry%get(c_key_fld,fld)
582 vars = oops_variables(c_vars)
583 afieldset = atlas_fieldset(c_afieldset)
584 
585 ! Call Fortran
586 call qg_fields_set_atlas(fld,vars,afieldset)
587 
588 end subroutine qg_fields_set_atlas_c
589 ! ------------------------------------------------------------------------------
590 !> Convert fields to ATLAS
591 subroutine qg_fields_to_atlas_c(c_key_fld,c_vars,c_afieldset) bind (c,name='qg_fields_to_atlas_f90')
592 
593 implicit none
594 
595 ! Passed variables
596 integer(c_int),intent(in) :: c_key_fld !< Fields
597 type(c_ptr),value,intent(in) :: c_vars !< List of variables
598 type(c_ptr),intent(in),value :: c_afieldset !< ATLAS fieldset pointer
599 
600 ! Local variables
601 type(qg_fields),pointer :: fld
602 type(oops_variables) :: vars
603 type(atlas_fieldset) :: afieldset
604 
605 ! Interface
606 call qg_fields_registry%get(c_key_fld,fld)
607 vars = oops_variables(c_vars)
608 afieldset = atlas_fieldset(c_afieldset)
609 
610 ! Call Fortran
611 call qg_fields_to_atlas(fld,vars,afieldset)
612 
613 end subroutine qg_fields_to_atlas_c
614 ! ------------------------------------------------------------------------------
615 !> Get fields from ATLAS
616 subroutine qg_fields_from_atlas_c(c_key_fld,c_vars,c_afieldset) bind (c,name='qg_fields_from_atlas_f90')
617 
618 implicit none
619 
620 ! Passed variables
621 integer(c_int),intent(in) :: c_key_fld !< Fields
622 type(c_ptr),value,intent(in) :: c_vars !< List of variables
623 type(c_ptr),intent(in),value :: c_afieldset !< ATLAS fieldset pointer
624 
625 ! Local variables
626 type(qg_fields),pointer :: fld
627 type(oops_variables) :: vars
628 type(atlas_fieldset) :: afieldset
629 
630 ! Interface
631 call qg_fields_registry%get(c_key_fld,fld)
632 vars = oops_variables(c_vars)
633 afieldset = atlas_fieldset(c_afieldset)
634 
635 ! Call Fortran
636 call qg_fields_from_atlas(fld,vars,afieldset)
637 
638 end subroutine qg_fields_from_atlas_c
639 ! ------------------------------------------------------------------------------
640 !> Get points from fields
641 subroutine qg_fields_getpoint_c(c_key_fld,c_key_iter,c_nval,c_vals) bind(c,name='qg_fields_getpoint_f90')
642 
643 implicit none
644 
645 ! Passed variables
646 integer(c_int),intent(in) :: c_key_fld !< Fields
647 integer(c_int),intent(in) :: c_key_iter !< Geometry iterator
648 integer(c_int),intent(in) :: c_nval !< Number of values
649 real(c_double),intent(inout) :: c_vals(c_nval) !< Values
650 
651 ! Local variables
652 type(qg_fields),pointer :: fld
653 type(qg_geom_iter),pointer :: iter
654 
655 ! Interface
656 call qg_fields_registry%get(c_key_fld,fld)
657 call qg_geom_iter_registry%get(c_key_iter,iter)
658 
659 ! Call Fortran
660 call qg_fields_getpoint(fld,iter,c_nval,c_vals)
661 
662 end subroutine qg_fields_getpoint_c
663 ! ------------------------------------------------------------------------------
664 !> Set points for the fields
665 subroutine qg_fields_setpoint_c(c_key_fld,c_key_iter,c_nval,c_vals) bind(c,name='qg_fields_setpoint_f90')
666 
667 implicit none
668 
669 ! Passed variables
670 integer(c_int),intent(in) :: c_key_fld !< Fields
671 integer(c_int),intent(in) :: c_key_iter !< Geometry iterator
672 integer(c_int),intent(in) :: c_nval !< Number of values
673 real(c_double),intent(in) :: c_vals(c_nval) !< Values
674 
675 ! Local variables
676 type(qg_fields),pointer :: fld
677 type(qg_geom_iter),pointer :: iter
678 
679 ! Interface
680 call qg_fields_registry%get(c_key_fld,fld)
681 call qg_geom_iter_registry%get(c_key_iter,iter)
682 
683 ! Call Fortran
684 call qg_fields_setpoint(fld,iter,c_nval,c_vals)
685 
686 end subroutine qg_fields_setpoint_c
687 ! ------------------------------------------------------------------------------
688 !> Serialize fields
689 subroutine qg_fields_serialize_c(c_key_fld,c_vsize,c_vect_fld) bind(c,name='qg_fields_serialize_f90')
690 
691 implicit none
692 
693 ! Passed variables
694 integer(c_int),intent(in) :: c_key_fld !< Fields
695 integer(c_int),intent(in) :: c_vsize !< Size
696 real(c_double),intent(out) :: c_vect_fld(c_vsize) !< Vector
697 
698 ! Local variables
699 type(qg_fields),pointer :: fld
700 
701 ! Interface
702 call qg_fields_registry%get(c_key_fld,fld)
703 
704 ! Call Fortran
705 call qg_fields_serialize(fld,c_vsize,c_vect_fld)
706 
707 
708 end subroutine qg_fields_serialize_c
709 ! ------------------------------------------------------------------------------
710 !> Deserialize fields
711 subroutine qg_fields_deserialize_c(c_key_self,c_vsize,c_vect_fld,c_index) bind(c,name='qg_fields_deserialize_f90')
712 
713 implicit none
714 
715 ! Passed variables
716 integer(c_int),intent(in) :: c_key_self !< Fields
717 integer(c_int),intent(in) :: c_vsize !< Size
718 real(c_double),intent(in) :: c_vect_fld(c_vsize) !< Vector
719 integer(c_int), intent(inout):: c_index !< Index
720 
721 ! Local variables
722 type(qg_fields),pointer :: self
723 
724 ! Interface
725 call qg_fields_registry%get(c_key_self,self)
726 
727 ! Call Fortran
728 call qg_fields_deserialize(self,c_vsize,c_vect_fld,c_index)
729 
730 end subroutine qg_fields_deserialize_c
731 ! ------------------------------------------------------------------------------
732 end module qg_fields_interface
qg_fields_mod
Definition: qg_fields_mod.F90:9
qg_fields_mod::qg_fields_rms
subroutine, public qg_fields_rms(fld, prms)
Fields RMS.
Definition: qg_fields_mod.F90:1044
qg_fields_mod::qg_fields
Definition: qg_fields_mod.F90:51
qg_fields_interface::qg_fields_self_sub_c
subroutine qg_fields_self_sub_c(c_key_self, c_key_rhs)
Subtract fields.
Definition: qg_fields_interface.F90:230
qg_geom_mod
Definition: qg_geom_mod.F90:9
qg_fields_mod::qg_fields_read_file
subroutine, public qg_fields_read_file(fld, f_conf, vdate)
Read fields from file.
Definition: qg_fields_mod.F90:633
qg_fields_interface::qg_fields_self_mul_c
subroutine qg_fields_self_mul_c(c_key_self, c_zz)
Multiply fields by a scalar.
Definition: qg_fields_interface.F90:252
qg_fields_interface::qg_fields_diff_incr_c
subroutine qg_fields_diff_incr_c(c_key_lhs, c_key_fld1, c_key_fld2)
Compute increment from the difference of two fields.
Definition: qg_fields_interface.F90:361
qg_fields_mod::qg_fields_axpy
subroutine, public qg_fields_axpy(self, zz, rhs)
Apply axpy operator to fields.
Definition: qg_fields_mod.F90:436
qg_fields_mod::qg_fields_sizes
subroutine, public qg_fields_sizes(fld, nx, ny, nz, nb)
Get fields geometry.
Definition: qg_fields_mod.F90:1075
qg_fields_mod::qg_fields_ones
subroutine, public qg_fields_ones(self)
Set fields to ones.
Definition: qg_fields_mod.F90:240
qg_fields_interface::qg_fields_gpnorm_c
subroutine qg_fields_gpnorm_c(c_key_fld, nb, pstat)
Fields statistics.
Definition: qg_fields_interface.F90:482
qg_fields_interface::qg_fields_delete_c
subroutine qg_fields_delete_c(c_key_self)
Delete fields.
Definition: qg_fields_interface.F90:85
qg_fields_interface::qg_fields_change_resol_c
subroutine qg_fields_change_resol_c(c_key_fld, c_key_rhs)
Change fields resolution.
Definition: qg_fields_interface.F90:386
qg_fields_mod::qg_fields_set_atlas
subroutine, public qg_fields_set_atlas(self, vars, afieldset)
Set ATLAS field.
Definition: qg_fields_mod.F90:1127
qg_fields_mod::qg_fields_dot_prod
subroutine, public qg_fields_dot_prod(fld1, fld2, zprod)
Compute dot product for fields.
Definition: qg_fields_mod.F90:485
qg_fields_mod::qg_fields_write_file
subroutine, public qg_fields_write_file(fld, f_conf, vdate)
Write fields to file.
Definition: qg_fields_mod.F90:746
qg_fields_mod::qg_fields_zero
subroutine, public qg_fields_zero(self)
Set fields to zero.
Definition: qg_fields_mod.F90:218
qg_fields_interface::qg_fields_random_c
subroutine qg_fields_random_c(c_key_self)
Generate random fields.
Definition: qg_fields_interface.F90:167
qg_fields_mod::qg_fields_self_schur
subroutine, public qg_fields_self_schur(self, rhs)
Schur product of fields.
Definition: qg_fields_mod.F90:461
qg_fields_mod::qg_fields_vars
subroutine, public qg_fields_vars(fld, lq, lbc)
Get fields variables.
Definition: qg_fields_mod.F90:1101
qg_fields_interface::qg_fields_ones_c
subroutine qg_fields_ones_c(c_key_self)
Set fields to ones.
Definition: qg_fields_interface.F90:126
qg_fields_interface::qg_fields_to_atlas_c
subroutine qg_fields_to_atlas_c(c_key_fld, c_vars, c_afieldset)
Convert fields to ATLAS.
Definition: qg_fields_interface.F90:592
qg_fields_mod::qg_fields_create
subroutine, public qg_fields_create(self, geom, vars, lbc)
Linked list implementation.
Definition: qg_fields_mod.F90:79
qg_geom_mod::qg_geom
Definition: qg_geom_mod.F90:26
oops_variables_mod
Fortran interface to Variables.
Definition: variables_mod.F90:9
qg_locs_mod
Definition: qg_locs_mod.F90:9
qg_fields_interface::qg_fields_zero_c
subroutine qg_fields_zero_c(c_key_self)
Set fields to zero.
Definition: qg_fields_interface.F90:107
qg_fields_mod::qg_fields_from_atlas
subroutine, public qg_fields_from_atlas(self, vars, afieldset)
Get fields from ATLAS.
Definition: qg_fields_mod.F90:1225
qg_geom_mod::qg_geom_registry
type(registry_t), public qg_geom_registry
Linked list interface - defines registry_t type.
Definition: qg_geom_mod.F90:53
qg_fields_mod::qg_fields_analytic_init
subroutine, public qg_fields_analytic_init(fld, f_conf, vdate)
Analytic initialization of fields.
Definition: qg_fields_mod.F90:879
qg_fields_interface::qg_fields_dot_prod_c
subroutine qg_fields_dot_prod_c(c_key_fld1, c_key_fld2, c_prod)
Compute dot product for fields.
Definition: qg_fields_interface.F90:317
qg_fields_mod::qg_fields_self_add
subroutine, public qg_fields_self_add(self, rhs)
Add fields.
Definition: qg_fields_mod.F90:365
qg_fields_mod::qg_fields_diff_incr
subroutine, public qg_fields_diff_incr(lhs, fld1, fld2)
Compute increment from the difference of two fields.
Definition: qg_fields_mod.F90:531
qg_fields_interface::qg_fields_rms_c
subroutine qg_fields_rms_c(c_key_fld, prms)
Fields RMS.
Definition: qg_fields_interface.F90:503
qg_fields_mod::qg_fields_gpnorm
subroutine, public qg_fields_gpnorm(fld, nb, pstat)
Fields statistics.
Definition: qg_fields_mod.F90:974
qg_fields_interface::qg_fields_dirac_c
subroutine qg_fields_dirac_c(c_key_self, c_conf)
Set fields to Diracs.
Definition: qg_fields_interface.F90:145
qg_fields_interface::qg_fields_copy_c
subroutine qg_fields_copy_c(c_key_self, c_key_other)
Copy fields.
Definition: qg_fields_interface.F90:186
qg_fields_mod::qg_fields_self_mul
subroutine, public qg_fields_self_mul(self, zz)
Multiply fields by a scalar.
Definition: qg_fields_mod.F90:413
qg_fields_interface::qg_fields_from_atlas_c
subroutine qg_fields_from_atlas_c(c_key_fld, c_vars, c_afieldset)
Get fields from ATLAS.
Definition: qg_fields_interface.F90:617
qg_fields_interface::qg_fields_getpoint_c
subroutine qg_fields_getpoint_c(c_key_fld, c_key_iter, c_nval, c_vals)
Get points from fields.
Definition: qg_fields_interface.F90:642
qg_geom_iter_mod::qg_geom_iter_registry
type(registry_t), public qg_geom_iter_registry
Linked list interface - defines registry_t type.
Definition: qg_geom_iter_mod.F90:34
qg_fields_interface::qg_fields_set_atlas_c
subroutine qg_fields_set_atlas_c(c_key_fld, c_vars, c_afieldset)
Create ATLAS fields.
Definition: qg_fields_interface.F90:567
qg_fields_mod::qg_fields_serialize
subroutine, public qg_fields_serialize(fld, vsize, vect_fld)
Serialize fields.
Definition: qg_fields_mod.F90:1341
qg_fields_mod::qg_fields_setpoint
subroutine, public qg_fields_setpoint(fld, iter, nval, vals)
Set fields values at a specified gridpoint.
Definition: qg_fields_mod.F90:1311
qg_fields_interface::qg_fields_vars_c
subroutine qg_fields_vars_c(c_key_fld, c_lq, c_lbc)
Get fields variables.
Definition: qg_fields_interface.F90:546
qg_fields_mod::qg_fields_getpoint
subroutine, public qg_fields_getpoint(fld, iter, nval, vals)
Get points from fields.
Definition: qg_fields_mod.F90:1281
qg_fields_interface::qg_fields_create_c
subroutine qg_fields_create_c(c_key_self, c_key_geom, c_vars, c_lbc)
Create fields from geometry and variables.
Definition: qg_fields_interface.F90:31
qg_fields_mod::qg_fields_self_sub
subroutine, public qg_fields_self_sub(self, rhs)
Subtract fields.
Definition: qg_fields_mod.F90:389
qg_fields_interface::qg_fields_serialize_c
subroutine qg_fields_serialize_c(c_key_fld, c_vsize, c_vect_fld)
Serialize fields.
Definition: qg_fields_interface.F90:690
qg_fields_mod::qg_fields_create_from_other
subroutine, public qg_fields_create_from_other(self, other)
Create fields from another one.
Definition: qg_fields_mod.F90:168
qg_fields_interface::qg_fields_deserialize_c
subroutine qg_fields_deserialize_c(c_key_self, c_vsize, c_vect_fld, c_index)
Deserialize fields.
Definition: qg_fields_interface.F90:712
qg_fields_interface::qg_fields_add_incr_c
subroutine qg_fields_add_incr_c(c_key_self, c_key_rhs)
Add increment to fields.
Definition: qg_fields_interface.F90:339
oops_variables_mod::oops_variables
Definition: variables_mod.F90:16
qg_fields_interface::qg_fields_analytic_init_c
subroutine qg_fields_analytic_init_c(c_key_fld, c_conf, c_dt)
Analytic initialization of fields.
Definition: qg_fields_interface.F90:457
qg_fields_interface
Definition: qg_fields_interface.F90:9
qg_geom_iter_mod::qg_geom_iter
Definition: qg_geom_iter_mod.F90:22
qg_geom_iter_mod
Definition: qg_geom_iter_mod.F90:9
qg_fields_mod::qg_fields_random
subroutine, public qg_fields_random(self)
Generate random fields.
Definition: qg_fields_mod.F90:305
qg_fields_interface::qg_fields_self_schur_c
subroutine qg_fields_self_schur_c(c_key_self, c_key_rhs)
Schur product of fields.
Definition: qg_fields_interface.F90:295
qg_fields_interface::qg_fields_read_file_c
subroutine qg_fields_read_file_c(c_key_fld, c_conf, c_dt)
Read fields from file.
Definition: qg_fields_interface.F90:407
qg_gom_mod
Definition: qg_gom_mod.F90:9
qg_fields_mod::qg_fields_add_incr
subroutine, public qg_fields_add_incr(self, rhs)
Add increment to fields.
Definition: qg_fields_mod.F90:504
qg_fields_mod::qg_fields_deserialize
subroutine, public qg_fields_deserialize(self, vsize, vect_fld, index)
Deserialize fields.
Definition: qg_fields_mod.F90:1384
qg_fields_mod::qg_fields_registry
type(registry_t), public qg_fields_registry
Linked list interface - defines registry_t type.
Definition: qg_fields_mod.F90:68
qg_fields_interface::qg_fields_self_add_c
subroutine qg_fields_self_add_c(c_key_self, c_key_rhs)
Add fields.
Definition: qg_fields_interface.F90:208
qg_fields_interface::qg_fields_setpoint_c
subroutine qg_fields_setpoint_c(c_key_fld, c_key_iter, c_nval, c_vals)
Set points for the fields.
Definition: qg_fields_interface.F90:666
qg_fields_interface::qg_fields_sizes_c
subroutine qg_fields_sizes_c(c_key_fld, c_nx, c_ny, c_nz, c_nb)
Get fields geometry.
Definition: qg_fields_interface.F90:523
qg_fields_mod::qg_fields_copy
subroutine, public qg_fields_copy(self, other, bconly)
Copy fields.
Definition: qg_fields_mod.F90:321
qg_fields_interface::qg_fields_write_file_c
subroutine qg_fields_write_file_c(c_key_fld, c_conf, c_dt)
Write fields to file.
Definition: qg_fields_interface.F90:432
qg_fields_mod::qg_fields_dirac
subroutine, public qg_fields_dirac(self, f_conf)
Set fields to Diracs.
Definition: qg_fields_mod.F90:262
qg_fields_mod::qg_fields_to_atlas
subroutine, public qg_fields_to_atlas(self, vars, afieldset)
Convert fields to ATLAS.
Definition: qg_fields_mod.F90:1160
qg_fields_interface::qg_fields_axpy_c
subroutine qg_fields_axpy_c(c_key_self, c_zz, c_key_rhs)
Apply axpy operator to fields.
Definition: qg_fields_interface.F90:272
qg_fields_interface::qg_fields_create_from_other_c
subroutine qg_fields_create_from_other_c(c_key_self, c_key_other)
Create fields from another one.
Definition: qg_fields_interface.F90:61
qg_fields_mod::qg_fields_change_resol
subroutine, public qg_fields_change_resol(fld, rhs)
Change fields resolution.
Definition: qg_fields_mod.F90:563
qg_fields_mod::qg_fields_delete
subroutine, public qg_fields_delete(self)
Delete fields.
Definition: qg_fields_mod.F90:201