FV3-JEDI
fv3jedi_geom_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 !> Fortran module handling geometry for the FV3 model
7 
9 
10 use atlas_module, only: atlas_fieldset, atlas_functionspace_pointcloud
11 use iso_c_binding
12 
13 use fckit_mpi_module, only: fckit_mpi_comm
14 use fckit_configuration_module, only: fckit_configuration
15 
17 
20 
21 implicit none
22 
23 private
24 public :: fv3jedi_geom_registry
25 
26 ! --------------------------------------------------------------------------------------------------
27 
28 #define LISTED_TYPE fv3jedi_geom
29 
30 !> Linked list interface - defines registry_t type
31 #include "oops/util/linkedList_i.f"
32 
33 !> Global registry
34 type(registry_t) :: fv3jedi_geom_registry
35 
36 ! --------------------------------------------------------------------------------------------------
37 
38 contains
39 
40 ! --------------------------------------------------------------------------------------------------
41 
42 !> Linked list implementation
43 #include "oops/util/linkedList_c.f"
44 
45 ! --------------------------------------------------------------------------------------------------
46 
47 subroutine c_fv3jedi_geom_initialize(c_conf, c_comm) bind(c,name='fv3jedi_geom_initialize_f90')
48 
49 implicit none
50 
51 type(c_ptr), intent(in) :: c_conf
52 type(c_ptr), value, intent(in) :: c_comm
53 
54 type(fckit_mpi_comm) :: f_comm
55 type(fckit_configuration) :: f_conf
56 
57 ! Fortran APIs
58 ! ------------
59 f_conf = fckit_configuration(c_conf)
60 f_comm = fckit_mpi_comm(c_comm)
61 
62 call initialize(f_conf, f_comm)
63 
64 end subroutine c_fv3jedi_geom_initialize
65 
66 ! --------------------------------------------------------------------------------------------------
67 
68 subroutine c_fv3jedi_geom_setup(c_key_self, c_conf, c_comm, c_fields_meta) &
69  bind(c, name='fv3jedi_geom_setup_f90')
70 
71 implicit none
72 
73 !Arguments
74 integer(c_int), intent(inout) :: c_key_self
75 type(c_ptr), intent(in) :: c_conf
76 type(c_ptr), value, intent(in) :: c_comm
77 type(c_ptr), value, intent(in) :: c_fields_meta
78 
79 type(fv3jedi_geom), pointer :: self
80 type(fckit_configuration) :: f_conf
81 type(fckit_mpi_comm) :: f_comm
82 type(fields_metadata) :: f_fields_metadata
83 
84 ! LinkedList
85 ! ----------
86 call fv3jedi_geom_registry%init()
87 call fv3jedi_geom_registry%add(c_key_self)
88 call fv3jedi_geom_registry%get(c_key_self,self)
89 
90 ! Fortran APIs
91 ! ------------
92 f_conf = fckit_configuration(c_conf)
93 f_comm = fckit_mpi_comm(c_comm)
94 f_fields_metadata = fields_metadata(c_fields_meta)
95 
96 ! Call implementation
97 ! -------------------
98 call self%create(f_conf, f_comm, f_fields_metadata)
99 
100 end subroutine c_fv3jedi_geom_setup
101 
102 ! --------------------------------------------------------------------------------------------------
103 
104 subroutine c_fv3jedi_geom_clone(c_key_self, c_key_other, c_fields_meta) bind(c,name='fv3jedi_geom_clone_f90')
105 
106 implicit none
107 
108 integer(c_int), intent(inout) :: c_key_self
109 integer(c_int), intent(in) :: c_key_other
110 type(c_ptr), value, intent(in) :: c_fields_meta
111 
112 type(fv3jedi_geom), pointer :: self
113 type(fv3jedi_geom), pointer :: other
114 type(fields_metadata) :: f_fields_metadata
115 
116 ! LinkedList
117 ! ----------
118 call fv3jedi_geom_registry%add(c_key_self)
119 call fv3jedi_geom_registry%get(c_key_self, self)
120 call fv3jedi_geom_registry%get(c_key_other, other)
121 
122 ! Fortran APIs
123 ! ------------
124 f_fields_metadata = fields_metadata(c_fields_meta)
125 
126 ! Call implementation
127 ! -------------------
128 call self%clone(other, f_fields_metadata)
129 
130 end subroutine c_fv3jedi_geom_clone
131 
132 ! --------------------------------------------------------------------------------------------------
133 
134 subroutine c_fv3jedi_geom_delete(c_key_self) bind(c,name='fv3jedi_geom_delete_f90')
135 
136 implicit none
137 
138 integer(c_int), intent(inout) :: c_key_self
139 type(fv3jedi_geom), pointer :: self
140 
141 ! LinkedList
142 ! ----------
143 call fv3jedi_geom_registry%get(c_key_self, self)
144 
145 ! Call implementation
146 ! -------------------
147 call self%delete()
148 
149 ! LinkedList
150 ! ----------
151 call fv3jedi_geom_registry%remove(c_key_self)
152 
153 end subroutine c_fv3jedi_geom_delete
154 
155 ! --------------------------------------------------------------------------------------------------
156 
157 subroutine c_fv3jedi_geom_print(c_key_self, c_cube) bind(c,name='fv3jedi_geom_print_f90')
158 
159 implicit none
160 
161 integer(c_int), intent(in) :: c_key_self
162 integer(c_int), intent(inout) :: c_cube
163 
164 type(fv3jedi_geom), pointer :: self
165 
166 ! LinkedList
167 ! ----------
168 call fv3jedi_geom_registry%get(c_key_self, self)
169 
170 ! Get Cube size
171 ! -------------
172 c_cube = self%npx - 1
173 
174 end subroutine c_fv3jedi_geom_print
175 
176 ! --------------------------------------------------------------------------------------------------
177 
178 subroutine c_fv3jedi_geom_set_atlas_lonlat(c_key_self, c_afieldset) &
179  bind(c,name='fv3jedi_geom_set_atlas_lonlat_f90')
180 
181 implicit none
182 
183 !Arguments
184 integer(c_int), intent(in) :: c_key_self
185 type(c_ptr), intent(in), value :: c_afieldset
186 
187 type(fv3jedi_geom), pointer :: self
188 type(atlas_fieldset) :: afieldset
189 
190 ! LinkedList
191 ! ----------
192 call fv3jedi_geom_registry%get(c_key_self,self)
193 
194 ! Fortran APIs
195 ! ------------
196 afieldset = atlas_fieldset(c_afieldset)
197 
198 ! Call implementation
199 ! -------------------
200 call self%set_atlas_lonlat(afieldset)
201 
202 end subroutine c_fv3jedi_geom_set_atlas_lonlat
203 
204 ! --------------------------------------------------------------------------------------------------
205 
206 subroutine c_fv3jedi_geom_set_atlas_functionspace_pointer(c_key_self,c_afunctionspace) &
207  bind(c,name='fv3jedi_geom_set_atlas_functionspace_pointer_f90')
208 
209 integer(c_int), intent(in) :: c_key_self
210 type(c_ptr), intent(in), value :: c_afunctionspace
211 
212 type(fv3jedi_geom),pointer :: self
213 
214 ! LinkedList
215 ! ----------
216 call fv3jedi_geom_registry%get(c_key_self,self)
217 
218 ! Create function space
219 ! ---------------------
220 self%afunctionspace = atlas_functionspace_pointcloud(c_afunctionspace)
221 
223 
224 ! --------------------------------------------------------------------------------------------------
225 
226 subroutine c_fv3jedi_geom_fill_atlas_fieldset(c_key_self, c_afieldset) &
227  bind(c,name='fv3jedi_geom_fill_atlas_fieldset_f90')
228 
229 implicit none
230 
231 integer(c_int), intent(in) :: c_key_self
232 type(c_ptr), value, intent(in) :: c_afieldset
233 
234 type(fv3jedi_geom), pointer :: self
235 type(atlas_fieldset) :: afieldset
236 
237 ! LinkedList
238 ! ----------
239 call fv3jedi_geom_registry%get(c_key_self,self)
240 afieldset = atlas_fieldset(c_afieldset)
241 
242 ! Call implementation
243 ! -------------------
244 call self%fill_atlas_fieldset(afieldset)
245 
247 
248 ! --------------------------------------------------------------------------------------------------
249 
250 subroutine c_fv3jedi_geom_start_end(c_key_self, ist, iend, jst, jend, npz) &
251  bind(c, name='fv3jedi_geom_start_end_f90')
252 
253 implicit none
254 
255 integer(c_int), intent( in) :: c_key_self
256 integer(c_int), intent(out) :: ist, iend, jst, jend, npz
257 
258 type(fv3jedi_geom), pointer :: self
259 
260 ! LinkedList
261 ! ----------
262 call fv3jedi_geom_registry%get(c_key_self, self)
263 
264 ist = self%isc
265 iend = self%iec
266 jst = self%jsc
267 jend = self%jec
268 npz = self%npz
269 
270 end subroutine c_fv3jedi_geom_start_end
271 
272 !--------------------------------------------------------------------------------------------------
273 
274 subroutine c_fv3jedi_geom_verticalcoord(c_key_self, vc, npz, psurf) &
275  bind(c, name='fv3jedi_geom_verticalCoord_f90')
276 
277 implicit none
278 
279 integer(c_int), intent( in) :: c_key_self
280 integer(c_int), intent( in) :: npz
281 real(c_double), intent( in) :: psurf
282 real(c_double), intent(out) :: vc(npz)
283 
284 type(fv3jedi_geom), pointer :: self
285 
286 ! LinkedList
287 ! ----------
288 call fv3jedi_geom_registry%get(c_key_self, self)
289 
290 ! Call implementation
291 ! -------------------
292 call getverticalcoordlogp(self, vc, npz, psurf)
293 
294 end subroutine c_fv3jedi_geom_verticalcoord
295 
296 ! --------------------------------------------------------------------------------------------------
297 
fv3jedi_geom_interface_mod::c_fv3jedi_geom_print
subroutine c_fv3jedi_geom_print(c_key_self, c_cube)
Definition: fv3jedi_geom_interface_mod.F90:158
fv3jedi_geom_interface_mod::c_fv3jedi_geom_fill_atlas_fieldset
subroutine c_fv3jedi_geom_fill_atlas_fieldset(c_key_self, c_afieldset)
Definition: fv3jedi_geom_interface_mod.F90:228
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_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_geom_interface_mod::c_fv3jedi_geom_start_end
subroutine c_fv3jedi_geom_start_end(c_key_self, ist, iend, jst, jend, npz)
Definition: fv3jedi_geom_interface_mod.F90:252
fields_metadata_mod
Definition: fields_metadata_mod.f90:6
fv3jedi_geom_mod::getverticalcoordlogp
subroutine, public getverticalcoordlogp(self, vc, npz, psurf)
Definition: fv3jedi_geom_mod.f90:840
fv3jedi_geom_interface_mod::c_fv3jedi_geom_clone
subroutine c_fv3jedi_geom_clone(c_key_self, c_key_other, c_fields_meta)
Definition: fv3jedi_geom_interface_mod.F90:105
fv3jedi_geom_mod::fv3jedi_geom
Fortran derived type to hold geometry data for the FV3JEDI model.
Definition: fv3jedi_geom_mod.f90:46
fv3jedi_geom_interface_mod::c_fv3jedi_geom_initialize
subroutine c_fv3jedi_geom_initialize(c_conf, c_comm)
Linked list implementation.
Definition: fv3jedi_geom_interface_mod.F90:48
fv3jedi_geom_mod::initialize
subroutine, public initialize(conf, comm)
Definition: fv3jedi_geom_mod.f90:100
fv3jedi_geom_interface_mod::c_fv3jedi_geom_set_atlas_lonlat
subroutine c_fv3jedi_geom_set_atlas_lonlat(c_key_self, c_afieldset)
Definition: fv3jedi_geom_interface_mod.F90:180
fields_metadata_mod::fields_metadata
Definition: fields_metadata_mod.f90:21
fv3jedi_geom_interface_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_interface_mod.F90:8
fv3jedi_geom_interface_mod::c_fv3jedi_geom_setup
subroutine c_fv3jedi_geom_setup(c_key_self, c_conf, c_comm, c_fields_meta)
Definition: fv3jedi_geom_interface_mod.F90:70
fv3jedi_geom_interface_mod::c_fv3jedi_geom_set_atlas_functionspace_pointer
subroutine c_fv3jedi_geom_set_atlas_functionspace_pointer(c_key_self, c_afunctionspace)
Definition: fv3jedi_geom_interface_mod.F90:208
fv3jedi_kinds_mod
Definition: fv3jedi_kinds_mod.f90:6
fv3jedi_geom_interface_mod::c_fv3jedi_geom_verticalcoord
subroutine c_fv3jedi_geom_verticalcoord(c_key_self, vc, npz, psurf)
Definition: fv3jedi_geom_interface_mod.F90:276
fv3jedi_geom_interface_mod::c_fv3jedi_geom_delete
subroutine c_fv3jedi_geom_delete(c_key_self)
Definition: fv3jedi_geom_interface_mod.F90:135