UFO
ObsSeaIceLinear.interface.F90
Go to the documentation of this file.
1 ! (C) Copyright 2017-2019 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 !> Fortran seaicelinear module for functions on the interface between C++ and Fortran
7 ! to handle linearized observation operators
8 
10 
11  use fckit_configuration_module, only: fckit_configuration
12  use iso_c_binding
13  use ufo_geovals_mod
15  use ufo_vars_mod
16 
17  implicit none
18 
19  private
20  integer, parameter :: max_string=800
21  type, public :: ufo_seaicelinear
22  integer :: ncat = -1 !< number of ice categories
23  end type ufo_seaicelinear
24 
25 #define LISTED_TYPE ufo_seaicelinear
26 
27  !> Linked list interface - defines registry_t type
28 #include "oops/util/linkedList_i.f"
29 
30  !> Global registry
31  type(registry_t) :: ufo_seaicelinear_registry
32 
33 contains
34 
35  ! ------------------------------------------------------------------------------
36  !> Linked list implementation
37 #include "oops/util/linkedList_c.f"
38 
39 ! ------------------------------------------------------------------------------
40 
41 subroutine ufo_seaicelinear_setup_c(c_key_self, c_conf) bind(c,name='ufo_seaicelinear_setup_f90')
42 integer(c_int), intent(inout) :: c_key_self
43 type(c_ptr), value, intent(in) :: c_conf
44 
45 type(ufo_seaicelinear), pointer :: self
46 type(fckit_configuration) :: f_conf
47 
48 call ufo_seaicelinear_registry%setup(c_key_self, self)
49 f_conf = fckit_configuration(c_conf)
50 !call self%setup(f_conf)
51 
52 end subroutine ufo_seaicelinear_setup_c
53 
54 ! ------------------------------------------------------------------------------
55 
56 subroutine ufo_seaicelinear_delete_c(c_key_self) bind(c,name='ufo_seaicelinear_delete_f90')
57 integer(c_int), intent(inout) :: c_key_self
58 
59 type(ufo_seaicelinear), pointer :: self
60 
61 call ufo_seaicelinear_registry%get(c_key_self, self)
62 call ufo_seaicelinear_registry%remove(c_key_self)
63 
64 end subroutine ufo_seaicelinear_delete_c
65 
66 ! ------------------------------------------------------------------------------
67 
68 subroutine ufo_seaicelinear_settraj_c(c_key_self, c_key_geovals, c_obsspace)&
69  bind(c,name='ufo_seaicelinear_settraj_f90')
70 integer(c_int), intent(in) :: c_key_self
71 integer(c_int), intent(in) :: c_key_geovals
72 type(c_ptr), value, intent(in) :: c_obsspace
73 
74 type(ufo_seaicelinear), pointer :: self
75 type(ufo_geovals), pointer :: geovals
76 type(ufo_geoval), pointer :: geoval
77 
78 call ufo_seaicelinear_registry%get(c_key_self, self)
79 call ufo_geovals_registry%get(c_key_geovals,geovals)
80 
81 call ufo_geovals_get_var(geovals, var_seaicefrac, geoval)
82 self%ncat = geoval%nval
83 
84 end subroutine ufo_seaicelinear_settraj_c
85 
86 ! ------------------------------------------------------------------------------
87 
88 subroutine ufo_seaicelinear_alloc_ad_c(c_key_self, c_key_geovals, c_obsspace, c_nobs, c_hofx)&
89  bind(c,name='ufo_seaicelinear_alloc_ad_f90')
90 integer(c_int), intent(in) :: c_key_self
91 integer(c_int), intent(in) :: c_key_geovals
92 type(c_ptr), value, intent(in) :: c_obsspace
93 integer(c_int), intent(in) :: c_nobs
94 real(c_double), intent(in) :: c_hofx(c_nobs)
95 
96 type(ufo_seaicelinear), pointer :: self
97 type(ufo_geovals), pointer :: geovals
98 type(ufo_geoval), pointer :: geoval
99 character(max_string) :: err_msg
100 
101 call ufo_seaicelinear_registry%get(c_key_self, self)
102 call ufo_geovals_registry%get(c_key_geovals,geovals)
103 
104 ! check if nlocs is consistent in geovals & hofx
105 if (geovals%nlocs /= size(c_hofx,1)) then
106  write(err_msg,*) ' error: nlocs inconsistent!'
107  call abor1_ftn(err_msg)
108 endif
109 
110 if (.not. geovals%linit ) geovals%linit=.true.
111 
112 ! check if sea ice fraction variables is in geovals and get it
113 call ufo_geovals_get_var(geovals, var_seaicefrac, geoval)
114 
115 if (.not.(allocated(geoval%vals))) then
116  if (self%ncat < 1) then
117  write(err_msg,*)' unknown number of categories'
118  call abor1_ftn(err_msg)
119  endif
120  allocate(geoval%vals(self%ncat,size(c_hofx,1)))
121 end if
122 end subroutine ufo_seaicelinear_alloc_ad_c
123 
124 ! ------------------------------------------------------------------------------
125 
126 end module ufo_seaicelinear_mod_c
ufo_avgkernel_mod::max_string
integer, parameter max_string
Definition: ufo_avgkernel_mod.F90:17
ufo_seaicelinear_mod_c::ufo_seaicelinear_registry
type(registry_t) ufo_seaicelinear_registry
Linked list interface - defines registry_t type.
Definition: ObsSeaIceLinear.interface.F90:31
ufo_seaicelinear_mod_c::ufo_seaicelinear_setup_c
subroutine ufo_seaicelinear_setup_c(c_key_self, c_conf)
Linked list implementation.
Definition: ObsSeaIceLinear.interface.F90:42
ufo_vars_mod::var_seaicefrac
character(len=maxvarlen), public var_seaicefrac
Definition: ufo_variables_mod.F90:137
ufo_geovals_mod
Definition: ufo_geovals_mod.F90:7
ufo_geovals_mod_c
Definition: GeoVaLs.interface.F90:7
ufo_seaicelinear_mod_c::ufo_seaicelinear_alloc_ad_c
subroutine ufo_seaicelinear_alloc_ad_c(c_key_self, c_key_geovals, c_obsspace, c_nobs, c_hofx)
Definition: ObsSeaIceLinear.interface.F90:90
ufo_vars_mod
Definition: ufo_variables_mod.F90:8
ufo_geovals_mod::ufo_geovals_get_var
subroutine, public ufo_geovals_get_var(self, varname, geoval)
Definition: ufo_geovals_mod.F90:128
ufo_seaicelinear_mod_c::ufo_seaicelinear_delete_c
subroutine ufo_seaicelinear_delete_c(c_key_self)
Definition: ObsSeaIceLinear.interface.F90:57
ufo_geovals_mod::ufo_geovals
type to hold interpolated fields required by the obs operators
Definition: ufo_geovals_mod.F90:47
ufo_seaicelinear_mod_c::ufo_seaicelinear_settraj_c
subroutine ufo_seaicelinear_settraj_c(c_key_self, c_key_geovals, c_obsspace)
Definition: ObsSeaIceLinear.interface.F90:70
ufo_seaicelinear_mod_c::ufo_seaicelinear
Definition: ObsSeaIceLinear.interface.F90:21
ufo_geovals_mod::ufo_geoval
type to hold interpolated field for one variable, one observation
Definition: ufo_geovals_mod.F90:40
ufo_seaicelinear_mod_c
Fortran seaicelinear module for functions on the interface between C++ and Fortran.
Definition: ObsSeaIceLinear.interface.F90:9
ufo_geovals_mod_c::ufo_geovals_registry
type(registry_t), public ufo_geovals_registry
Linked list interface - defines registry_t type.
Definition: GeoVaLs.interface.F90:30