9 use fckit_configuration_module,
only: fckit_configuration
10 use fckit_mpi_module,
only: fckit_mpi_comm
24 #define LISTED_TYPE ufo_geovals
27 #include "oops/util/linkedList_i.f"
36 #include "oops/util/linkedList_c.f"
41 integer(c_int),
intent(inout) :: c_key_self
53 use oops_variables_mod
55 integer(c_int),
intent(inout) :: c_key_self
56 integer(c_int),
intent(in) :: c_nlocs
57 type(c_ptr),
value,
intent(in) :: c_vars
60 type(oops_variables) :: vars
66 vars = oops_variables(c_vars)
76 integer(c_int),
intent(in) :: c_key_self
77 integer(c_int),
intent(in) :: c_key_other
93 integer(c_int),
intent(in) :: c_key_self
94 integer(c_int),
intent(in) :: c_key_other
95 integer(c_int),
intent(in) :: ind
112 integer(c_int),
intent(in) :: c_key_self
113 integer(c_int),
intent(in) :: c_key_locs
114 type(c_ptr),
value,
intent(in) :: c_conf
118 character(len=30) :: ic
119 character(len=:),
allocatable :: str
120 type(fckit_configuration) :: f_conf
125 f_conf = fckit_configuration(c_conf)
126 call f_conf%get_or_die(
"analytic_init",str)
137 integer(c_int),
intent(inout) :: c_key_self
153 integer(c_int),
intent(in) :: c_key_self
168 integer(c_int),
intent(in) :: c_key_self
169 integer(c_int),
intent(in) :: lvar
170 character(kind=c_char, len=1),
intent(in) :: c_var(lvar+1)
171 integer(c_int),
intent(in) :: lvar1
172 character(kind=c_char, len=1),
intent(in) :: c_var1(lvar1+1)
173 character(len=MAXVARLEN) :: varname
174 character(len=MAXVARLEN) :: vardir
177 call c_f_string(c_var, varname)
178 call c_f_string(c_var1, vardir)
189 integer(c_int),
intent(in) :: c_key_self
202 integer(c_int),
intent(in) :: c_key_self
203 real(c_double),
intent(inout) :: vrms
216 integer(c_int),
intent(in) :: c_key_self
229 integer(c_int),
intent(in) :: c_key_self
230 real(c_double),
intent(in) :: zz
243 integer(c_int),
intent(in) :: c_key_self
244 integer(c_int),
intent(in) :: nlocs
245 real(c_float),
intent(in) :: values(nlocs)
258 integer(c_int),
intent(in) :: c_key_self
259 integer(c_int),
intent(in) :: c_key_rhs
274 integer(c_int),
intent(in) :: c_key_self
275 integer(c_int),
intent(in) :: c_key_other
290 integer(c_int),
intent(in) :: c_key_self
291 integer(c_int),
intent(in) :: c_key_other
306 integer(c_int),
intent(in) :: c_key_self
307 integer(c_int),
intent(in) :: c_key_other
322 integer(c_int),
intent(in) :: c_key_self
323 integer(c_int),
intent(in) :: c_key_other
338 integer(c_int),
intent(in) :: c_key_self, c_key_other
339 real(c_double),
intent(inout) :: prod
340 type(c_ptr),
value,
intent(in) :: c_comm
343 type(fckit_mpi_comm) :: f_comm
348 f_comm = fckit_mpi_comm(c_comm)
356 subroutine ufo_geovals_split_c(c_key_self, c_key_other1, c_key_other2) bind(c,name='ufo_geovals_split_f90')
358 integer(c_int),
intent(in) :: c_key_self, c_key_other1, c_key_other2
371 subroutine ufo_geovals_merge_c(c_key_self, c_key_other1, c_key_other2) bind(c,name='ufo_geovals_merge_f90')
373 integer(c_int),
intent(in) :: c_key_self, c_key_other1, c_key_other2
388 integer(c_int),
intent(in) :: c_key_self
389 integer(c_int),
intent(inout) :: kobs
390 integer(c_int),
intent(in) :: kvar
391 real(c_double),
intent(inout) :: pmin, pmax, prms
404 integer(c_int),
intent(in) :: c_key_self
405 integer(c_size_t),
intent(inout) :: kobs
419 integer(c_int),
intent(in) :: c_key_self
420 integer(c_int),
intent(in) :: lvar
421 character(kind=c_char, len=1),
intent(in) :: c_var(lvar+1)
422 integer(c_int),
intent(out) :: nlevs
425 character(len=MAXVARLEN) :: varname
428 call c_f_string(c_var, varname)
433 nlevs =
size(geoval%vals,1)
439 subroutine ufo_geovals_get2d_c(c_key_self, lvar, c_var, nlocs, values) bind(c, name='ufo_geovals_get2d_f90')
443 integer(c_int),
intent(in) :: c_key_self
444 integer(c_int),
intent(in) :: lvar
445 character(kind=c_char, len=1),
intent(in) :: c_var(lvar+1)
446 integer(c_int),
intent(in) :: nlocs
447 real(c_float),
intent(inout) :: values(nlocs)
449 character(max_string) :: err_msg
451 character(len=MAXVARLEN) :: varname
454 call c_f_string(c_var, varname)
459 if (
size(geoval%vals,1) /= 1)
then
460 write(err_msg,*)
'ufo_geovals_get2d_f90',trim(varname),
'is not a 2D var:',
size(geoval%vals,1),
' levels'
461 call abor1_ftn(err_msg)
463 if (nlocs /=
size(geoval%vals,2))
then
464 write(err_msg,*)
'ufo_geovals_get2d_f90',trim(varname),
'error locs number:',nlocs,
size(geoval%vals,2)
465 call abor1_ftn(err_msg)
468 values(:) = geoval%vals(1,:)
474 subroutine ufo_geovals_get_c(c_key_self, lvar, c_var, lev, nlocs, values) bind(c, name='ufo_geovals_get_f90')
478 integer(c_int),
intent(in) :: c_key_self
479 integer(c_int),
intent(in) :: lvar
480 character(kind=c_char, len=1),
intent(in) :: c_var(lvar+1)
481 integer(c_int),
intent(in) :: lev
482 integer(c_int),
intent(in) :: nlocs
483 real(c_float),
intent(inout) :: values(nlocs)
485 character(max_string) :: err_msg
487 character(len=MAXVARLEN) :: varname
490 call c_f_string(c_var, varname)
495 if (lev<1 .or. lev>
size(geoval%vals,1))
then
496 write(err_msg,*)
'ufo_geovals_get_f90',trim(varname),
'level out of range:',lev,
size(geoval%vals,1)
497 call abor1_ftn(err_msg)
499 if (nlocs /=
size(geoval%vals,2))
then
500 write(err_msg,*)
'ufo_geovals_get_f90',trim(varname),
'error locs number:',nlocs,
size(geoval%vals,2)
501 call abor1_ftn(err_msg)
504 values(:) = geoval%vals(lev,:)
511 bind(c, name=
'ufo_geovals_getdouble_f90')
515 integer(c_int),
intent(in) :: c_key_self
516 integer(c_int),
intent(in) :: lvar
517 character(kind=c_char, len=1),
intent(in) :: c_var(lvar+1)
518 integer(c_int),
intent(in) :: lev
519 integer(c_int),
intent(in) :: nlocs
520 real(c_double),
intent(inout) :: values(nlocs)
523 character(len=MAXVARLEN) :: varname
526 call c_f_string(c_var, varname)
529 values(:) = geoval%vals(lev,:)
537 use oops_variables_mod
539 integer(c_int),
intent(in) :: c_key_self
540 integer(c_int),
intent(in) :: lvar
541 character(kind=c_char, len=1),
intent(in) :: c_var(lvar+1)
542 integer(c_int),
intent(in) :: lev
543 integer(c_int),
intent(in) :: nlocs
544 real(c_double),
intent(inout) :: values(nlocs)
547 character(len=MAXVARLEN) :: varname
549 type(oops_variables) :: var
552 call c_f_string(c_var, varname)
554 self%geovals(1)%nval=5
555 geoval%nval=self%geovals(1)%nval
557 allocate(geoval%vals(geoval%nval,geoval%nlocs))
558 geoval%vals(lev,:) = values(:)
567 integer(c_int),
intent(in) :: c_key_self
568 real(c_double),
intent(inout) :: mxval
569 integer(c_int),
intent(inout) :: iloc, ivar
581 use oops_variables_mod
585 integer(c_int),
intent(inout) :: c_key_self
586 type(c_ptr),
value,
intent(in) :: c_conf
587 type(c_ptr),
value,
intent(in) :: c_obspace
588 type(c_ptr),
value,
intent(in) :: c_vars
591 character(max_string) :: filename
592 integer :: loc_multiplier
593 character(len=:),
allocatable :: str
594 type(fckit_configuration) :: f_conf
595 type(oops_variables) :: vars
602 f_conf = fckit_configuration(c_conf)
603 call f_conf%get_or_die(
"filename",str)
606 if (f_conf%has(
"loc_multiplier"))
then
607 call f_conf%get_or_die(
"loc_multiplier", loc_multiplier)
612 vars = oops_variables(c_vars)
622 integer(c_int),
intent(in) :: c_key_self
623 type(c_ptr),
value,
intent(in) :: c_conf
624 type(c_ptr),
value,
intent(in) :: c_comm
627 character(max_string) :: fout, filename
629 type(fckit_mpi_comm) :: comm
630 character(len=10) :: cproc
632 character(len=:),
allocatable :: str
633 type(fckit_configuration) :: f_conf
636 f_conf = fckit_configuration(c_conf)
637 call f_conf%get_or_die(
"filename",str)
641 comm = fckit_mpi_comm(c_comm)
643 write(cproc,fmt=
'(i4.4)') comm%rank()
647 ppos = scan(trim(filename),
'.', back=.true.)
650 fout = filename(1:ppos-1) //
'_' // trim(adjustl(cproc)) // trim(filename(ppos:))
653 fout = trim(filename) //
'_' // trim(adjustl(cproc))