SABER
interpolatorbump_mod.F90
Go to the documentation of this file.
1 # 1 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2 # 1 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/../generics.fypp" 1
3 !----------------------------------------------------------------------
4 ! Header: generics
5 !> Generic ranks, dimensions and types
6 ! Author: Benjamin Menetrier
7 ! Licensing: this code is distributed under the CeCILL-C license
8 ! Copyright 2015-... UCAR, CERFACS, METEO-FRANCE and IRIT
9 !----------------------------------------------------------------------
10 
11 # 56 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/../generics.fypp"
12 # 2 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp" 2
13 # 1 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/../instrumentation.fypp" 1
14 # 1 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/../subr_list.fypp" 1
15 !----------------------------------------------------------------------
16 ! Header: subr_list
17 !> Subroutines/functions list
18 ! Author: Benjamin Menetrier
19 ! Licensing: this code is distributed under the CeCILL-C license
20 ! Copyright 2015-... UCAR, CERFACS, METEO-FRANCE and IRIT
21 !----------------------------------------------------------------------
22 
23 # 726 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/../subr_list.fypp"
24 # 2 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/../instrumentation.fypp" 2
25 !----------------------------------------------------------------------
26 ! Header: instrumentation
27 !> Instrumentation functions
28 ! Author: Benjamin Menetrier
29 ! Licensing: this code is distributed under the CeCILL-C license
30 ! Copyright 2015-... UCAR, CERFACS, METEO-FRANCE and IRIT
31 !----------------------------------------------------------------------
32 
33 # 112 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/../instrumentation.fypp"
34 # 3 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp" 2
35 !----------------------------------------------------------------------
36 ! (C) Copyright 2019-2020 UCAR
37 !
38 ! This software is licensed under the terms of the Apache Licence Version 2.0
39 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
40 !----------------------------------------------------------------------
41 ! Module: bump_interpolation_mod
42 !> BUMP interpolation module
43 !!
44 !! \date Jan, 2020: Created by M. Miesch (JCSDA/UCAR) based on previously exising type_obsop.F90
45 !! written by Benjamin Menetrier (JCSDA/UCAR, CERFACS, METEO-FRANCE, IRIT)
46 !! \date Dec, 2020: Updated by B. Menetrier (JCSDA/IRIT) to use FYPP preprocessing directives
47 !----------------------------------------------------------------------
49 
50 use atlas_module, only: atlas_functionspace,atlas_fieldset,atlas_field,atlas_real
51 use fckit_configuration_module, only: fckit_configuration
52 use fckit_log_module, only: fckit_log
53 use fckit_mpi_module, only: fckit_mpi_comm,fckit_mpi_sum,fckit_mpi_min,fckit_mpi_max,fckit_mpi_status
54 use iso_c_binding, only: c_char
59 use tools_repro, only: rth
60 use type_bump, only: bump_type
61 use type_com, only: com_type
63 use type_geom, only: geom_type
64 use type_linop, only: linop_type
65 use type_mesh, only: mesh_type
66 use type_mpl, only: mpl_type
67 use type_nam, only: nam_type
68 
69 use type_rng, only: rng_type
70 
71 implicit none
72 
73 private
74 public :: bump_interpolator
75 
76 integer,parameter :: max_string = 1024 !< Maximum string size
77 
78 ! BUMP interpolator type
80  private
81 
82  ! BUMP object
83  type(bump_type),public :: bump !< BUMP
84 
85  ! Grid information
86  type(geom_type) :: geom_out !< Output grid geometry
87  type(atlas_functionspace) :: afunctionspace_in !< ATLAS functionspace for input grid
88  type(atlas_functionspace) :: afunctionspace_out !< ATLAS functionspace for output grid
89 
90  ! Number of points
91  integer :: nc0b !< Halo B size
92  integer :: nout !< Global number of output grid points
93  integer :: nouta !< Local number of output grid points
94 
95  ! Interpolation data (operator)
96  type(linop_type) :: h !< Interpolation operator
97 
98  ! Communication data
99  type(com_type) :: com !< Communication data
100 
101  ! Nearest neighbor (for discrete interpolation)
102  integer,allocatable :: nn_index(:) !< Nearest neighbor index
103 
104  ! Dummy variable
105  logical :: dummy_logical !< Dummy variable
106 contains
107  private
108 
109  procedure,private :: driver => bint_driver
110  procedure,public :: init => bint_init
111  procedure,public :: bint_apply
112 # 81 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
113 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
114 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
115  procedure,public :: bint_apply_int_r1_r1
116 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
117  procedure,public :: bint_apply_int_r1_r2
118 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
119  procedure,public :: bint_apply_int_r1_r3
120 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
121 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
122 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
123  procedure,public :: bint_apply_int_r2_r1
124 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
125  procedure,public :: bint_apply_int_r2_r2
126 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
127  procedure,public :: bint_apply_int_r2_r3
128 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
129 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
130 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
131  procedure,public :: bint_apply_int_r3_r1
132 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
133  procedure,public :: bint_apply_int_r3_r2
134 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
135  procedure,public :: bint_apply_int_r3_r3
136 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
137 # 86 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
138 # 81 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
139 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
140 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
141  procedure,public :: bint_apply_real_r1_r1
142 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
143  procedure,public :: bint_apply_real_r1_r2
144 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
145  procedure,public :: bint_apply_real_r1_r3
146 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
147 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
148 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
149  procedure,public :: bint_apply_real_r2_r1
150 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
151  procedure,public :: bint_apply_real_r2_r2
152 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
153  procedure,public :: bint_apply_real_r2_r3
154 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
155 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
156 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
157  procedure,public :: bint_apply_real_r3_r1
158 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
159  procedure,public :: bint_apply_real_r3_r2
160 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
161  procedure,public :: bint_apply_real_r3_r3
162 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
163 # 86 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
164 # 81 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
165 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
166 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
167  procedure,public :: bint_apply_logical_r1_r1
168 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
169  procedure,public :: bint_apply_logical_r1_r2
170 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
171  procedure,public :: bint_apply_logical_r1_r3
172 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
173 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
174 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
175  procedure,public :: bint_apply_logical_r2_r1
176 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
177  procedure,public :: bint_apply_logical_r2_r2
178 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
179  procedure,public :: bint_apply_logical_r2_r3
180 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
181 # 82 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
182 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
183  procedure,public :: bint_apply_logical_r3_r1
184 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
185  procedure,public :: bint_apply_logical_r3_r2
186 # 83 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
187  procedure,public :: bint_apply_logical_r3_r3
188 # 85 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
189 # 86 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
190 # 87 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
191 
192  generic,public :: apply => bint_apply, &
193 # 90 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
194 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
195 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
197 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
199 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
201 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
202 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
203 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
205 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
207 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
209 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
210 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
211 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
213 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
215 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
217 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
218 # 95 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
219 # 90 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
220 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
221 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
223 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
225 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
227 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
228 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
229 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
231 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
233 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
235 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
236 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
237 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
239 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
241 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
243 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
244 # 95 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
245 # 90 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
246 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
247 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
249 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
251 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
253 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
254 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
255 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
257 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
259 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
261 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
262 # 91 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
263 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
265 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
267 # 92 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
269 # 94 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
270 # 95 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
271 # 96 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
272 # 97 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
273  procedure,private :: bint_apply_interp_int
274 # 97 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
275  procedure,private :: bint_apply_interp_real
276 # 97 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
277  procedure,private :: bint_apply_interp_logical
278 # 99 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
279 
280  generic,public :: apply_interp => &
281 # 102 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
283 # 102 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
285 # 102 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
287 # 104 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
288  procedure,public :: bint_apply_ad
289 # 106 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
290 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
291  procedure,public :: bint_apply_ad_r1_r1
292 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
293  procedure,public :: bint_apply_ad_r2_r1
294 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
295  procedure,public :: bint_apply_ad_r3_r1
296 # 109 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
297 # 106 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
298 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
299  procedure,public :: bint_apply_ad_r1_r2
300 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
301  procedure,public :: bint_apply_ad_r2_r2
302 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
303  procedure,public :: bint_apply_ad_r3_r2
304 # 109 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
305 # 106 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
306 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
307  procedure,public :: bint_apply_ad_r1_r3
308 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
309  procedure,public :: bint_apply_ad_r2_r3
310 # 107 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
311  procedure,public :: bint_apply_ad_r3_r3
312 # 109 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
313 # 110 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
314 
315  generic,public :: apply_ad => bint_apply_ad, &
316 # 113 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
317 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
319 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
321 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
323 # 116 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
324 # 113 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
325 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
327 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
329 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
331 # 116 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
332 # 113 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
333 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
335 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
337 # 114 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
339 # 116 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
340 # 117 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
341  procedure,private :: apply_interp_ad => bint_apply_interp_ad
342  procedure :: deallocate_outgrid => bint_deallocate_outgrid
343  procedure,public :: delete => bint_delete
345 end type bump_interpolator
346 
347 contains
348 
349 !----------------------------------------------------------------------
350 ! Subroutine: bint_init
351 !> Initialize interpolation object
352 !! The input and output fields are ATLAS_FieldSet objects that are assumed
353 !! to be created from ATLAS functionspaces. So, they have the grid and
354 !! mesh information built in.
355 !----------------------------------------------------------------------
356 subroutine bint_init(bint,comm, &
357  & lon1d_in,lat1d_in, &
358  & lon_in,lat_in, &
359  & afunctionspace_in, &
360  & lon1d_out,lat1d_out, &
361  & lon_out,lat_out, &
362  & afunctionspace_out, &
363  & nl,masks,config)
364 
365 implicit none
366 
367 ! Passed variables
368 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
369 type(fckit_mpi_comm),intent(in) :: comm !< Communicator
370 real(kind_real),intent(in),optional :: lon1d_in(:) !< Input longitudes (regular grid) [in degrees]
371 real(kind_real),intent(in),optional :: lat1d_in(:) !< Input latitudes (regular grid) [in degrees]
372 real(kind_real),intent(in),optional :: lon_in(:) !< Input longitudes [in degrees]
373 real(kind_real),intent(in),optional :: lat_in(:) !< Input latitudes [in degrees]
374 type(atlas_functionspace),intent(in),optional :: afunctionspace_in !< Input ATLAS functionspace
375 real(kind_real),intent(in),optional :: lon1d_out(:) !< Output longitudes (regular grid) [in degrees]
376 real(kind_real),intent(in),optional :: lat1d_out(:) !< Output latitudes (regular grid) [in degrees]
377 real(kind_real),intent(in),optional :: lon_out(:) !< Output longitudes [in degrees]
378 real(kind_real),intent(in),optional :: lat_out(:) !< Output latitudes [in degrees]
379 type(atlas_functionspace),intent(in),optional :: afunctionspace_out !< Output ATLAS functionspace
380 integer,intent(in),optional :: nl !< Number of levels
381 type(fieldset_type),intent(in),optional :: masks !< Metadata needed for the interpolation, rendered as an ATLAS FieldSet with the following named fields: area (cell area), vunit (vertical unit), gmask (geometry mask) and smask (sampling mask). Each of these named fields is optional, if omitted default values will be provided
382 type(fckit_configuration),intent(in),optional :: config !< Configuration
383 
384 ! Local variables
385 integer :: msvali,inode,ilon,ilat
386 real(kind_real) :: msvalr
387 real(kind_real),allocatable :: lon(:),lat(:)
388 type(fckit_configuration) :: bump_config
389 type(fieldset_type) :: lmasks
390 
391 ! Set name
392 
393 
394 ! Get instance
395 
396 
397 ! Probe in
398 
399 
400 ! BUMP defaults
401 call bint%bump%nam%init(comm%size())
402 
403 ! Modified defaults for BUMP interpolator
404 bint%bump%nam%prefix = 'bump_interpolator'
405 bint%bump%nam%datadir = 'testdata'
406 bint%bump%nam%verbosity = 'none'
407 if (present(nl)) then
408  bint%bump%nam%nl = nl
409 else
410  bint%bump%nam%nl = 1
411 end if
412 bint%bump%nam%nv = 1
413 bint%bump%nam%variables(1) = 'var'
414 bint%bump%nam%interp_type = 'mesh_based'
415 
416 ! Default missing values for integers and reals
417 msvali = -999
418 msvalr = -999.0_kind_real
419 
420 if (present(config)) then
421  ! Optionally override defaults with BUMP config
422  if (config%has('bump')) then
423  call config%get_or_die('bump',bump_config)
424  call bint%bump%nam%from_conf(comm,bump_config)
425  end if
426 
427  ! Optionally set levels
428  if (config%has('nlevels')) call config%get_or_die('nlevels',bint%bump%nam%nl)
429 
430  ! Optionally set missing values for integers and reals
431  if (config%has('missingvalue_int')) call config%get_or_die('missingvalue_int',msvali)
432  if (config%has('missingvalue_real')) call config%get_or_die('missingvalue_real',msvalr)
433 end if
434 
435 ! Input ATLAS functionspace
436 if (present(lon1d_in).and.present(lat1d_in)) then
437  allocate(lon(size(lon1d_in)*size(lat1d_in)))
438  allocate(lat(size(lon1d_in)*size(lat1d_in)))
439  inode = 0
440  do ilat=1,size(lat1d_in)
441  do ilon=1,size(lon1d_in)
442  inode = inode+1
443  lon(inode) = lon1d_in(ilon)
444  lat(inode) = lat1d_in(ilat)
445  end do
446  end do
447  call create_atlas_function_space(size(lon1d_in)*size(lat1d_in), lon, lat, bint%afunctionspace_in)
448  deallocate(lon)
449  deallocate(lat)
450 elseif (present(lon_in).and.present(lat_in)) then
451  if (size(lon_in)/=size(lat_in)) then
452  call fckit_log%info('input longitudes and latitudes have different sizes')
453  call comm%abort(1)
454  end if
455  call create_atlas_function_space(size(lon_in), lon_in, lat_in, bint%afunctionspace_in)
456 elseif (present(afunctionspace_in)) then
457  bint%afunctionspace_in = afunctionspace_in
458 else
459  call fckit_log%info('output ATLAS function space or lon/lat vector should be provided')
460  call comm%abort(1)
461 end if
462 
463 ! Output ATLAS functionspace
464 if (present(lon1d_out).and.present(lat1d_out)) then
465  allocate(lon(size(lon1d_out)*size(lat1d_out)))
466  allocate(lat(size(lon1d_out)*size(lat1d_out)))
467  inode = 0
468  do ilat=1,size(lat1d_out)
469  do ilon=1,size(lon1d_out)
470  inode = inode+1
471  lon(inode) = lon1d_out(ilon)
472  lat(inode) = lat1d_out(ilat)
473  end do
474  end do
475  call create_atlas_function_space(size(lon1d_out)*size(lat1d_out), lon, lat, bint%afunctionspace_out)
476  deallocate(lon)
477  deallocate(lat)
478 elseif (present(lon_out).and.present(lat_out)) then
479  if (size(lon_out)/=size(lat_out)) then
480  call fckit_log%info('output longitudes and latitudes have different sizes')
481  call comm%abort(1)
482  end if
483  call create_atlas_function_space(size(lon_out), lon_out, lat_out, bint%afunctionspace_out)
484 elseif (present(afunctionspace_out)) then
485  bint%afunctionspace_out = afunctionspace_out
486 else
487  call fckit_log%info('output ATLAS function space or lon/lat vector should be provided')
488  call comm%abort(1)
489 end if
490 
491 ! Initialize BUMP
492 
493 ! Clear any pre-existing data
494 call bint%delete
495 
496 ! Basic BUMP setup
497 if (present(masks)) then
498  lmasks = masks
499 else
500  lmasks = atlas_fieldset()
501 end if
502 call bint%bump%setup(comm,bint%afunctionspace_in,lmasks,msvali=msvali,msvalr=msvalr)
503 
504 ! Initialize output grid
505 call fckit_log%info('-------------------------------------------------------------------')
506 call fckit_log%info('--- Initialize output grid')
507 
508 ! Unpack output grid from output functionspace
509 bint%geom_out%nl0 = bint%bump%nam%nl
510 call bint%geom_out%from_atlas(bint%bump%mpl,bint%afunctionspace_out)
511 bint%nouta = size(bint%geom_out%lon_mga)
512 
513 ! Run basic BUMP drivers
514 call bint%bump%run_drivers
515 
516 ! Run interpolation driver
517 call fckit_log%info('-------------------------------------------------------------------')
518 call fckit_log%info('--- Run bump_interpolation driver')
519 call bint%driver(bint%bump%mpl,bint%bump%rng,bint%bump%nam,bint%bump%geom)
520 if (bint%bump%nam%default_seed) call bint%bump%rng%reseed(bint%bump%mpl)
521 
522 ! Release memory (partial)
523 call fckit_log%info('-------------------------------------------------------------------')
524 call fckit_log%info('--- Release memory (partial)')
525 call bint%bump%partial_dealloc
526 
527 ! Probe out
528 
529 
530 end subroutine bint_init
531 
532 !----------------------------------------------------------------------
533 ! Subroutine: bint_driver
534 !> Initialize BUMP to perform interpolation
535 !----------------------------------------------------------------------
536 subroutine bint_driver(bint,mpl,rng,nam,geom)
537 
538 implicit none
539 
540 ! Passed variables
541 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
542 type(mpl_type),intent(inout) :: mpl !< MPI data
543 type(rng_type),intent(inout) :: rng !< Random number generator
544 type(nam_type),intent(in) :: nam !< Namelist
545 type(geom_type),intent(in) :: geom !< Geometry
546 
547 ! Local variables
548 integer :: iouta,iproc,i_s,ic0,ic0u,jc0u,ic0b,ic0a,nouta_eff
549 integer :: nout_eff,nn_index(1),proc_to_nouta(mpl%nproc),proc_to_nouta_eff(mpl%nproc)
550 integer :: c0u_to_c0b(geom%nc0u)
551 integer,allocatable :: c0b_to_c0(:)
552 real(kind_real) :: nn_dist(1),N_max,C_max
553 real(kind_real),allocatable :: maxweight(:)
554 logical :: maskouta(bint%nouta),lcheck_nc0b(geom%nc0)
555 
556 ! Set name
557 
558 
559 ! Get instance
560 
561 
562 ! Probe in
563 
564 
565 ! Check that universe is global
566 if (any(.not.geom%myuniverse)) call mpl%abort('bint_driver','universe should be global for interpolation')
567 
568 ! Check whether output grid points are inside the mesh
569 if (bint%nouta > 0) then
570  do iouta=1,bint%nouta
571  if (trim(bint%bump%nam%interp_type)=='mesh_based') then
572  call geom%mesh_c0u%inside(mpl,bint%geom_out%lon_mga(iouta),bint%geom_out%lat_mga(iouta),maskouta(iouta))
573  elseif (trim(bint%bump%nam%interp_type)=='tree_based') then
574  call geom%tree_c0u%inside(bint%geom_out%lon_mga(iouta),bint%geom_out%lat_mga(iouta),maskouta(iouta))
575  end if
576  if (.not.maskouta(iouta)) then
577  ! Check for very close points
578  call geom%tree_c0u%find_nearest_neighbors(bint%geom_out%lon_mga(iouta),bint%geom_out%lat_mga(iouta), &
579  & 1,nn_index,nn_dist)
580  if (nn_dist(1)<rth) maskouta(iouta) = .true.
581  end if
582  end do
583  nouta_eff = count(maskouta)
584 else
585  nouta_eff = 0
586 end if
587 
588 ! Get global number of output grid points
589 call mpl%f_comm%allgather(bint%nouta,proc_to_nouta)
590 call mpl%f_comm%allgather(nouta_eff,proc_to_nouta_eff)
591 bint%nout = sum(proc_to_nouta)
592 nout_eff = sum(proc_to_nouta_eff)
593 
594 ! Print input
595 write(mpl%info,'(a7,a)') '','Number of points in output grid / valid points per MPI task:'
596 call mpl%flush
597 do iproc=1,mpl%nproc
598  write(mpl%info,'(a10,a,i3,a,i8,a,i8)') '','Task ',iproc,': ',proc_to_nouta(iproc),' / ',proc_to_nouta_eff(iproc)
599  call mpl%flush
600 end do
601 write(mpl%info,'(a10,a,i8,a,i8)') '','Total : ',bint%nout,' / ',nout_eff
602 call mpl%flush
603 
604 ! Compute interpolation
605 bint%h%prefix = 'o'
606 write(mpl%info,'(a7,a)') '','Single level:'
607 call mpl%flush
608 call bint%h%interp(mpl,rng,nam,geom,0,geom%nc0u,geom%lon_c0u,geom%lat_c0u,geom%gmask_hor_c0u,geom%area_max_c0u,bint%nouta, &
609  & bint%geom_out%lon_mga,bint%geom_out%lat_mga,maskouta,10)
610 
611 ! Define halo B
612 lcheck_nc0b = .false.
613 do ic0a=1,geom%nc0a
614  ic0u = geom%c0a_to_c0u(ic0a)
615  lcheck_nc0b(ic0u) = .true.
616 end do
617 do iouta=1,bint%nouta
618  do i_s=1,bint%h%n_s
619  jc0u = bint%h%col(i_s)
620  lcheck_nc0b(jc0u) = .true.
621  end do
622 end do
623 bint%nc0b = count(lcheck_nc0b)
624 
625 ! Allocation
626 allocate(c0b_to_c0(bint%nc0b))
627 
628 ! Global-local conversion for halo B
629 c0u_to_c0b = mpl%msv%vali
630 ic0b = 0
631 do ic0u=1,geom%nc0u
632  if (lcheck_nc0b(ic0u)) then
633  ic0b = ic0b+1
634  ic0 = geom%c0u_to_c0(ic0u)
635  c0b_to_c0(ic0b) = ic0
636  c0u_to_c0b(ic0u) = ic0b
637  end if
638 end do
639 
640 ! Local interpolation source
641 bint%h%n_src = bint%nc0b
642 do i_s=1,bint%h%n_s
643  ic0u = bint%h%col(i_s)
644  ic0b = c0u_to_c0b(ic0u)
645  if (mpl%msv%isnot(ic0b)) then
646  bint%h%col(i_s) = ic0b
647  else
648  call mpl%abort('bint_driver','wrong local source for h')
649  end if
650 end do
651 
652 ! Setup communications
653 call bint%com%setup(mpl,'com',geom%nc0a,bint%nc0b,geom%nc0,geom%c0a_to_c0,c0b_to_c0)
654 
655 ! Release memory
656 deallocate(c0b_to_c0)
657 
658 ! Allocation
659 allocate(bint%nn_index(bint%nouta))
660 
661 ! Get nearest neighbor index for integer interpolation
662 if (bint%nouta > 0) then
663  ! Allocation
664  allocate(maxweight(bint%nouta))
665 
666  ! Initialization
667  bint%nn_index = bint%bump%mpl%msv%vali
668  maxweight = zero
669 
670  ! Get nearest neighbor index from the maximum interpolation coefficient
671  do i_s=1,bint%h%n_s
672  iouta = bint%h%row(i_s)
673  if (bint%h%S(i_s)>maxweight(iouta)) then
674  maxweight(iouta) = bint%h%S(i_s)
675  bint%nn_index(iouta) = bint%h%col(i_s)
676  end if
677  end do
678  if (bint%bump%mpl%msv%isany(bint%nn_index)) call bint%bump%mpl%abort('bint_driver','missing nearest neighbor')
679 
680  ! Release memory
681  deallocate(maxweight)
682 end if
683 
684 ! Compute scores
685 if (nout_eff > 0) then
686  call mpl%f_comm%allreduce(real(bint%com%nhalo,kind_real),c_max,fckit_mpi_max())
687  c_max = c_max/(three*real(nout_eff,kind_real)/real(mpl%nproc,kind_real))
688  n_max = real(maxval(proc_to_nouta_eff),kind_real)/(real(nout_eff,kind_real)/real(mpl%nproc,kind_real))
689 
690  ! Print results
691  write(mpl%info,'(a7,a,f5.1,a)') '','Output grid repartition imbalance: ',hundred*real(maxval(proc_to_nouta_eff) &
692  & -minval(proc_to_nouta_eff),kind_real)/(real(sum(proc_to_nouta_eff),kind_real)/real(mpl%nproc,kind_real)),' %'
693  call mpl%flush
694  write(mpl%info,'(a7,a,i8,a,i8,a,i8)') '','Number of grid points / halo size / number of received values: ', &
695  & bint%com%nred,' / ',bint%com%next,' / ',bint%com%nhalo
696  call mpl%flush
697  write(mpl%info,'(a7,a,f10.2,a,f10.2)') '','Scores (N_max / C_max):',n_max,' / ',c_max
698  call mpl%flush
699 end if
700 
701 ! Probe out
702 
703 
704 end subroutine bint_driver
705 
706 !----------------------------------------------------------------------
707 ! Subroutine bint_apply
708 !> Apply interpolation
709 !! If the fields that constitute the fieldset are not already allocated by
710 !! the caller, then they will be created and allocated by this method.
711 !! So, the user can optionally pass this routine an empty output fieldset.
712 !----------------------------------------------------------------------
713 subroutine bint_apply(bint,fieldset_in,fieldset_out)
714 
715 implicit none
716 
717 ! Passed variables
718 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
719 type(fieldset_type),intent(in) :: fieldset_in !< Input fields represented as an ATLAS fieldset, created from a functionspace
720 type(fieldset_type),intent(inout) :: fieldset_out !< Output fields represented as an ATLAS fieldset
721 
722 ! Local variables
723 integer :: ifield
724 real(kind_real),allocatable :: array_in_mga(:,:),array_in_c0a(:,:),array_out(:,:)
725 character(len=max_string) :: fieldname
726 type(atlas_field) :: afield_in,afield_out
727 
728 ! Set name
729 
730 
731 ! Get instance
732 
733 
734 ! Probe in
735 
736 
737 ! Allocation
738 allocate(array_in_mga(bint%bump%geom%nmga,bint%bump%geom%nl0))
739 if (.not.bint%bump%geom%same_grid) allocate(array_in_c0a(bint%bump%geom%nc0a,bint%bump%geom%nl0))
740 allocate(array_out(bint%nouta,bint%bump%geom%nl0))
741 
742 do ifield=1,fieldset_in%size()
743  ! Copy field and field name
744  afield_in = fieldset_in%field(ifield)
745  fieldname = afield_in%name()
746 
747  ! Allocation
748  if (fieldset_out%has_field(fieldname)) then
749  afield_out = fieldset_out%field(name=fieldname)
750  else
751  afield_out = bint%afunctionspace_out%create_field(name=fieldname,kind=atlas_real(kind_real),levels=bint%bump%geom%nl0)
752  call fieldset_out%add(afield_out)
753  end if
754 
755  ! ATLAS field to BUMP array
756  call field_to_array(afield_in,bint%bump%mpl,array_in_mga)
757 
758  if (bint%bump%geom%same_grid) then
759  ! Apply interpolation
760  call bint%apply_interp(array_in_mga,array_out)
761  else
762  ! Model grid to subset Sc0
763  array_in_c0a = zero
764  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,array_in_mga,array_in_c0a)
765 
766  ! Apply interpolation
767  call bint%apply_interp(array_in_c0a,array_out)
768  end if
769 
770  ! BUMP array to ATLAS field
771  call field_from_array(afield_out,bint%bump%mpl,array_out)
772 
773  ! Release pointers
774  call afield_in%final()
775  call afield_out%final()
776 end do
777 
778 ! Release memory
779 deallocate(array_in_mga)
780 if (.not.bint%bump%geom%same_grid) deallocate(array_in_c0a)
781 deallocate(array_out)
782 
783 ! Probe out
784 
785 
786 end subroutine bint_apply
787 
788 # 565 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
789 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
790 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
791 !----------------------------------------------------------------------
792 ! Subroutine: bint_apply_int_r1_r1
793 !> Apply interpolation
794 !----------------------------------------------------------------------
795 subroutine bint_apply_int_r1_r1(bint,array_in,array_out,trans_in,trans_out,nn)
796 
797 implicit none
798 
799 ! Passed variables
800 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
801 integer(kind_int),intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
802 integer(kind_int),intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
803 logical,intent(in),optional :: trans_in !< Input array should be transposed
804 logical,intent(in),optional :: trans_out !< Output array should be transposed
805 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
806 
807 ! Local variables
808 integer :: nl_in,nl_out
809 integer :: shp_out(1)
810 
811 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
812 logical :: ltrans_in,ltrans_out,lnn
813 
814 ! Set name
815 
816 
817 ! Get instance
818 
819 
820 ! Probe in
821 
822 
823 ! Local flags
824 ltrans_in = .false.
825 if (present(trans_in)) ltrans_in = trans_in
826 ltrans_out = .false.
827 if (present(trans_out)) ltrans_out = trans_out
828 lnn = .false.
829 if (present(nn)) lnn = nn
830 
831 ! Get number of levels
832 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
833  nl_in = 1
834 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
835 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
836  nl_out = 1
837 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
838 bint%bump%geom%nl0 = nl_in
839 
840 ! Allocation
841 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
842 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
843 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
844 
845 ! Pack input data
846  vec_in(:,1) = array_in
847 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
848 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
849 
850 ! Interpolate
851 if (bint%bump%geom%same_grid) then
852  call bint%apply_interp(vec_in,vec_out,lnn)
853 else
854  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
855  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
856 end if
857 
858 ! Unpack output data
859 shp_out = shape(array_out)
860  array_out = vec_out(:,1)
861 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
862 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
863 
864 ! Probe out
865 
866 
867 end subroutine bint_apply_int_r1_r1
868 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
869 !----------------------------------------------------------------------
870 ! Subroutine: bint_apply_int_r1_r2
871 !> Apply interpolation
872 !----------------------------------------------------------------------
873 subroutine bint_apply_int_r1_r2(bint,array_in,array_out,trans_in,trans_out,nn)
874 
875 implicit none
876 
877 ! Passed variables
878 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
879 integer(kind_int),intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
880 integer(kind_int),intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
881 logical,intent(in),optional :: trans_in !< Input array should be transposed
882 logical,intent(in),optional :: trans_out !< Output array should be transposed
883 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
884 
885 ! Local variables
886 integer :: nl_in,nl_out
887 integer :: shp_out(2)
888 
889 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
890 logical :: ltrans_in,ltrans_out,lnn
891 
892 ! Set name
893 
894 
895 ! Get instance
896 
897 
898 ! Probe in
899 
900 
901 ! Local flags
902 ltrans_in = .false.
903 if (present(trans_in)) ltrans_in = trans_in
904 ltrans_out = .false.
905 if (present(trans_out)) ltrans_out = trans_out
906 lnn = .false.
907 if (present(nn)) lnn = nn
908 
909 ! Get number of levels
910 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
911  nl_in = 1
912 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
913 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
914  if (ltrans_out) then
915  nl_out = size(array_out,1)
916  else
917  nl_out = size(array_out,2)
918  end if
919 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
920 bint%bump%geom%nl0 = nl_in
921 
922 ! Allocation
923 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
924 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
925 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
926 
927 ! Pack input data
928  vec_in(:,1) = array_in
929 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
930 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
931 
932 ! Interpolate
933 if (bint%bump%geom%same_grid) then
934  call bint%apply_interp(vec_in,vec_out,lnn)
935 else
936  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
937  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
938 end if
939 
940 ! Unpack output data
941 shp_out = shape(array_out)
942 
943 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
944  if (ltrans_out) then
945  array_out = transpose(vec_out)
946  else
947  array_out = vec_out
948  end if
949 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
950 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
951 
952 ! Probe out
953 
954 
955 end subroutine bint_apply_int_r1_r2
956 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
957 !----------------------------------------------------------------------
958 ! Subroutine: bint_apply_int_r1_r3
959 !> Apply interpolation
960 !----------------------------------------------------------------------
961 subroutine bint_apply_int_r1_r3(bint,array_in,array_out,trans_in,trans_out,nn)
962 
963 implicit none
964 
965 ! Passed variables
966 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
967 integer(kind_int),intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
968 integer(kind_int),intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
969 logical,intent(in),optional :: trans_in !< Input array should be transposed
970 logical,intent(in),optional :: trans_out !< Output array should be transposed
971 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
972 
973 ! Local variables
974 integer :: nl_in,nl_out
975 integer :: shp_out(3)
976  integer :: il
977 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
978 logical :: ltrans_in,ltrans_out,lnn
979 
980 ! Set name
981 
982 
983 ! Get instance
984 
985 
986 ! Probe in
987 
988 
989 ! Local flags
990 ltrans_in = .false.
991 if (present(trans_in)) ltrans_in = trans_in
992 ltrans_out = .false.
993 if (present(trans_out)) ltrans_out = trans_out
994 lnn = .false.
995 if (present(nn)) lnn = nn
996 
997 ! Get number of levels
998 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
999  nl_in = 1
1000 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1001 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1002  if (ltrans_out) then
1003  nl_out = size(array_out,1)
1004  else
1005  nl_out = size(array_out,3)
1006  end if
1007 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1008 bint%bump%geom%nl0 = nl_in
1009 
1010 ! Allocation
1011 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1012 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1013 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1014 
1015 ! Pack input data
1016  vec_in(:,1) = array_in
1017 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1018 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1019 
1020 ! Interpolate
1021 if (bint%bump%geom%same_grid) then
1022  call bint%apply_interp(vec_in,vec_out,lnn)
1023 else
1024  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1025  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1026 end if
1027 
1028 ! Unpack output data
1029 shp_out = shape(array_out)
1030 
1031 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1032 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1033  do il=1,nl_out
1034  if (ltrans_out) then
1035  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
1036  else
1037  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
1038  end if
1039  end do
1040 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1041 
1042 ! Probe out
1043 
1044 
1045 end subroutine bint_apply_int_r1_r3
1046 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1047 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1048 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1049 !----------------------------------------------------------------------
1050 ! Subroutine: bint_apply_int_r2_r1
1051 !> Apply interpolation
1052 !----------------------------------------------------------------------
1053 subroutine bint_apply_int_r2_r1(bint,array_in,array_out,trans_in,trans_out,nn)
1054 
1055 implicit none
1056 
1057 ! Passed variables
1058 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1059 integer(kind_int),intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
1060 integer(kind_int),intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
1061 logical,intent(in),optional :: trans_in !< Input array should be transposed
1062 logical,intent(in),optional :: trans_out !< Output array should be transposed
1063 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1064 
1065 ! Local variables
1066 integer :: nl_in,nl_out
1067 integer :: shp_out(1)
1068 
1069 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1070 logical :: ltrans_in,ltrans_out,lnn
1071 
1072 ! Set name
1073 
1074 
1075 ! Get instance
1076 
1077 
1078 ! Probe in
1079 
1080 
1081 ! Local flags
1082 ltrans_in = .false.
1083 if (present(trans_in)) ltrans_in = trans_in
1084 ltrans_out = .false.
1085 if (present(trans_out)) ltrans_out = trans_out
1086 lnn = .false.
1087 if (present(nn)) lnn = nn
1088 
1089 ! Get number of levels
1090 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1091  if (ltrans_in) then
1092  nl_in = size(array_in,1)
1093  else
1094  nl_in = size(array_in,2)
1095  end if
1096 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1097 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1098  nl_out = 1
1099 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1100 bint%bump%geom%nl0 = nl_in
1101 
1102 ! Allocation
1103 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1104 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1105 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1106 
1107 ! Pack input data
1108 
1109 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1110  if (ltrans_in) then
1111  vec_in = transpose(array_in)
1112  else
1113  vec_in = array_in
1114  end if
1115 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1116 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1117 
1118 ! Interpolate
1119 if (bint%bump%geom%same_grid) then
1120  call bint%apply_interp(vec_in,vec_out,lnn)
1121 else
1122  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1123  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1124 end if
1125 
1126 ! Unpack output data
1127 shp_out = shape(array_out)
1128  array_out = vec_out(:,1)
1129 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1130 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1131 
1132 ! Probe out
1133 
1134 
1135 end subroutine bint_apply_int_r2_r1
1136 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1137 !----------------------------------------------------------------------
1138 ! Subroutine: bint_apply_int_r2_r2
1139 !> Apply interpolation
1140 !----------------------------------------------------------------------
1141 subroutine bint_apply_int_r2_r2(bint,array_in,array_out,trans_in,trans_out,nn)
1142 
1143 implicit none
1144 
1145 ! Passed variables
1146 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1147 integer(kind_int),intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
1148 integer(kind_int),intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
1149 logical,intent(in),optional :: trans_in !< Input array should be transposed
1150 logical,intent(in),optional :: trans_out !< Output array should be transposed
1151 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1152 
1153 ! Local variables
1154 integer :: nl_in,nl_out
1155 integer :: shp_out(2)
1156 
1157 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1158 logical :: ltrans_in,ltrans_out,lnn
1159 
1160 ! Set name
1161 
1162 
1163 ! Get instance
1164 
1165 
1166 ! Probe in
1167 
1168 
1169 ! Local flags
1170 ltrans_in = .false.
1171 if (present(trans_in)) ltrans_in = trans_in
1172 ltrans_out = .false.
1173 if (present(trans_out)) ltrans_out = trans_out
1174 lnn = .false.
1175 if (present(nn)) lnn = nn
1176 
1177 ! Get number of levels
1178 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1179  if (ltrans_in) then
1180  nl_in = size(array_in,1)
1181  else
1182  nl_in = size(array_in,2)
1183  end if
1184 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1185 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1186  if (ltrans_out) then
1187  nl_out = size(array_out,1)
1188  else
1189  nl_out = size(array_out,2)
1190  end if
1191 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1192 bint%bump%geom%nl0 = nl_in
1193 
1194 ! Allocation
1195 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1196 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1197 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1198 
1199 ! Pack input data
1200 
1201 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1202  if (ltrans_in) then
1203  vec_in = transpose(array_in)
1204  else
1205  vec_in = array_in
1206  end if
1207 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1208 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1209 
1210 ! Interpolate
1211 if (bint%bump%geom%same_grid) then
1212  call bint%apply_interp(vec_in,vec_out,lnn)
1213 else
1214  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1215  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1216 end if
1217 
1218 ! Unpack output data
1219 shp_out = shape(array_out)
1220 
1221 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1222  if (ltrans_out) then
1223  array_out = transpose(vec_out)
1224  else
1225  array_out = vec_out
1226  end if
1227 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1228 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1229 
1230 ! Probe out
1231 
1232 
1233 end subroutine bint_apply_int_r2_r2
1234 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1235 !----------------------------------------------------------------------
1236 ! Subroutine: bint_apply_int_r2_r3
1237 !> Apply interpolation
1238 !----------------------------------------------------------------------
1239 subroutine bint_apply_int_r2_r3(bint,array_in,array_out,trans_in,trans_out,nn)
1240 
1241 implicit none
1242 
1243 ! Passed variables
1244 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1245 integer(kind_int),intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
1246 integer(kind_int),intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
1247 logical,intent(in),optional :: trans_in !< Input array should be transposed
1248 logical,intent(in),optional :: trans_out !< Output array should be transposed
1249 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1250 
1251 ! Local variables
1252 integer :: nl_in,nl_out
1253 integer :: shp_out(3)
1254  integer :: il
1255 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1256 logical :: ltrans_in,ltrans_out,lnn
1257 
1258 ! Set name
1259 
1260 
1261 ! Get instance
1262 
1263 
1264 ! Probe in
1265 
1266 
1267 ! Local flags
1268 ltrans_in = .false.
1269 if (present(trans_in)) ltrans_in = trans_in
1270 ltrans_out = .false.
1271 if (present(trans_out)) ltrans_out = trans_out
1272 lnn = .false.
1273 if (present(nn)) lnn = nn
1274 
1275 ! Get number of levels
1276 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1277  if (ltrans_in) then
1278  nl_in = size(array_in,1)
1279  else
1280  nl_in = size(array_in,2)
1281  end if
1282 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1283 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1284  if (ltrans_out) then
1285  nl_out = size(array_out,1)
1286  else
1287  nl_out = size(array_out,3)
1288  end if
1289 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1290 bint%bump%geom%nl0 = nl_in
1291 
1292 ! Allocation
1293 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1294 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1295 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1296 
1297 ! Pack input data
1298 
1299 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1300  if (ltrans_in) then
1301  vec_in = transpose(array_in)
1302  else
1303  vec_in = array_in
1304  end if
1305 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1306 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1307 
1308 ! Interpolate
1309 if (bint%bump%geom%same_grid) then
1310  call bint%apply_interp(vec_in,vec_out,lnn)
1311 else
1312  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1313  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1314 end if
1315 
1316 ! Unpack output data
1317 shp_out = shape(array_out)
1318 
1319 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1320 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1321  do il=1,nl_out
1322  if (ltrans_out) then
1323  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
1324  else
1325  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
1326  end if
1327  end do
1328 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1329 
1330 ! Probe out
1331 
1332 
1333 end subroutine bint_apply_int_r2_r3
1334 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1335 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1336 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1337 !----------------------------------------------------------------------
1338 ! Subroutine: bint_apply_int_r3_r1
1339 !> Apply interpolation
1340 !----------------------------------------------------------------------
1341 subroutine bint_apply_int_r3_r1(bint,array_in,array_out,trans_in,trans_out,nn)
1342 
1343 implicit none
1344 
1345 ! Passed variables
1346 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1347 integer(kind_int),intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
1348 integer(kind_int),intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
1349 logical,intent(in),optional :: trans_in !< Input array should be transposed
1350 logical,intent(in),optional :: trans_out !< Output array should be transposed
1351 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1352 
1353 ! Local variables
1354 integer :: nl_in,nl_out
1355 integer :: shp_out(1)
1356  integer :: il
1357 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1358 logical :: ltrans_in,ltrans_out,lnn
1359 
1360 ! Set name
1361 
1362 
1363 ! Get instance
1364 
1365 
1366 ! Probe in
1367 
1368 
1369 ! Local flags
1370 ltrans_in = .false.
1371 if (present(trans_in)) ltrans_in = trans_in
1372 ltrans_out = .false.
1373 if (present(trans_out)) ltrans_out = trans_out
1374 lnn = .false.
1375 if (present(nn)) lnn = nn
1376 
1377 ! Get number of levels
1378 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1379  if (ltrans_in) then
1380  nl_in = size(array_in,1)
1381  else
1382  nl_in = size(array_in,3)
1383  end if
1384 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1385 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1386  nl_out = 1
1387 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1388 bint%bump%geom%nl0 = nl_in
1389 
1390 ! Allocation
1391 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1392 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1393 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1394 
1395 ! Pack input data
1396 
1397 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1398 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1399  do il=1,nl_in
1400  if (ltrans_in) then
1401  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
1402  else
1403  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
1404  end if
1405  end do
1406 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1407 
1408 ! Interpolate
1409 if (bint%bump%geom%same_grid) then
1410  call bint%apply_interp(vec_in,vec_out,lnn)
1411 else
1412  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1413  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1414 end if
1415 
1416 ! Unpack output data
1417 shp_out = shape(array_out)
1418  array_out = vec_out(:,1)
1419 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1420 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1421 
1422 ! Probe out
1423 
1424 
1425 end subroutine bint_apply_int_r3_r1
1426 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1427 !----------------------------------------------------------------------
1428 ! Subroutine: bint_apply_int_r3_r2
1429 !> Apply interpolation
1430 !----------------------------------------------------------------------
1431 subroutine bint_apply_int_r3_r2(bint,array_in,array_out,trans_in,trans_out,nn)
1432 
1433 implicit none
1434 
1435 ! Passed variables
1436 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1437 integer(kind_int),intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
1438 integer(kind_int),intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
1439 logical,intent(in),optional :: trans_in !< Input array should be transposed
1440 logical,intent(in),optional :: trans_out !< Output array should be transposed
1441 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1442 
1443 ! Local variables
1444 integer :: nl_in,nl_out
1445 integer :: shp_out(2)
1446  integer :: il
1447 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1448 logical :: ltrans_in,ltrans_out,lnn
1449 
1450 ! Set name
1451 
1452 
1453 ! Get instance
1454 
1455 
1456 ! Probe in
1457 
1458 
1459 ! Local flags
1460 ltrans_in = .false.
1461 if (present(trans_in)) ltrans_in = trans_in
1462 ltrans_out = .false.
1463 if (present(trans_out)) ltrans_out = trans_out
1464 lnn = .false.
1465 if (present(nn)) lnn = nn
1466 
1467 ! Get number of levels
1468 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1469  if (ltrans_in) then
1470  nl_in = size(array_in,1)
1471  else
1472  nl_in = size(array_in,3)
1473  end if
1474 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1475 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1476  if (ltrans_out) then
1477  nl_out = size(array_out,1)
1478  else
1479  nl_out = size(array_out,2)
1480  end if
1481 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1482 bint%bump%geom%nl0 = nl_in
1483 
1484 ! Allocation
1485 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1486 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1487 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1488 
1489 ! Pack input data
1490 
1491 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1492 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1493  do il=1,nl_in
1494  if (ltrans_in) then
1495  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
1496  else
1497  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
1498  end if
1499  end do
1500 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1501 
1502 ! Interpolate
1503 if (bint%bump%geom%same_grid) then
1504  call bint%apply_interp(vec_in,vec_out,lnn)
1505 else
1506  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1507  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1508 end if
1509 
1510 ! Unpack output data
1511 shp_out = shape(array_out)
1512 
1513 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1514  if (ltrans_out) then
1515  array_out = transpose(vec_out)
1516  else
1517  array_out = vec_out
1518  end if
1519 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1520 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1521 
1522 ! Probe out
1523 
1524 
1525 end subroutine bint_apply_int_r3_r2
1526 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1527 !----------------------------------------------------------------------
1528 ! Subroutine: bint_apply_int_r3_r3
1529 !> Apply interpolation
1530 !----------------------------------------------------------------------
1531 subroutine bint_apply_int_r3_r3(bint,array_in,array_out,trans_in,trans_out,nn)
1532 
1533 implicit none
1534 
1535 ! Passed variables
1536 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1537 integer(kind_int),intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
1538 integer(kind_int),intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
1539 logical,intent(in),optional :: trans_in !< Input array should be transposed
1540 logical,intent(in),optional :: trans_out !< Output array should be transposed
1541 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1542 
1543 ! Local variables
1544 integer :: nl_in,nl_out
1545 integer :: shp_out(3)
1546  integer :: il
1547 integer(kind_int),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1548 logical :: ltrans_in,ltrans_out,lnn
1549 
1550 ! Set name
1551 
1552 
1553 ! Get instance
1554 
1555 
1556 ! Probe in
1557 
1558 
1559 ! Local flags
1560 ltrans_in = .false.
1561 if (present(trans_in)) ltrans_in = trans_in
1562 ltrans_out = .false.
1563 if (present(trans_out)) ltrans_out = trans_out
1564 lnn = .false.
1565 if (present(nn)) lnn = nn
1566 
1567 ! Get number of levels
1568 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1569  if (ltrans_in) then
1570  nl_in = size(array_in,1)
1571  else
1572  nl_in = size(array_in,3)
1573  end if
1574 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1575 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1576  if (ltrans_out) then
1577  nl_out = size(array_out,1)
1578  else
1579  nl_out = size(array_out,3)
1580  end if
1581 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1582 bint%bump%geom%nl0 = nl_in
1583 
1584 ! Allocation
1585 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1586 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1587 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1588 
1589 ! Pack input data
1590 
1591 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1592 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1593  do il=1,nl_in
1594  if (ltrans_in) then
1595  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
1596  else
1597  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
1598  end if
1599  end do
1600 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1601 
1602 ! Interpolate
1603 if (bint%bump%geom%same_grid) then
1604  call bint%apply_interp(vec_in,vec_out,lnn)
1605 else
1606  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1607  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1608 end if
1609 
1610 ! Unpack output data
1611 shp_out = shape(array_out)
1612 
1613 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1614 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1615  do il=1,nl_out
1616  if (ltrans_out) then
1617  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
1618  else
1619  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
1620  end if
1621  end do
1622 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1623 
1624 ! Probe out
1625 
1626 
1627 end subroutine bint_apply_int_r3_r3
1628 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1629 # 686 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1630 # 565 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1631 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1632 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1633 !----------------------------------------------------------------------
1634 ! Subroutine: bint_apply_real_r1_r1
1635 !> Apply interpolation
1636 !----------------------------------------------------------------------
1637 subroutine bint_apply_real_r1_r1(bint,array_in,array_out,trans_in,trans_out,nn)
1638 
1639 implicit none
1640 
1641 ! Passed variables
1642 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1643 real(kind_real),intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
1644 real(kind_real),intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
1645 logical,intent(in),optional :: trans_in !< Input array should be transposed
1646 logical,intent(in),optional :: trans_out !< Output array should be transposed
1647 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1648 
1649 ! Local variables
1650 integer :: nl_in,nl_out
1651 integer :: shp_out(1)
1652 
1653 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1654 logical :: ltrans_in,ltrans_out,lnn
1655 
1656 ! Set name
1657 
1658 
1659 ! Get instance
1660 
1661 
1662 ! Probe in
1663 
1664 
1665 ! Local flags
1666 ltrans_in = .false.
1667 if (present(trans_in)) ltrans_in = trans_in
1668 ltrans_out = .false.
1669 if (present(trans_out)) ltrans_out = trans_out
1670 lnn = .false.
1671 if (present(nn)) lnn = nn
1672 
1673 ! Get number of levels
1674 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1675  nl_in = 1
1676 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1677 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1678  nl_out = 1
1679 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1680 bint%bump%geom%nl0 = nl_in
1681 
1682 ! Allocation
1683 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1684 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1685 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1686 
1687 ! Pack input data
1688  vec_in(:,1) = array_in
1689 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1690 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1691 
1692 ! Interpolate
1693 if (bint%bump%geom%same_grid) then
1694  call bint%apply_interp(vec_in,vec_out,lnn)
1695 else
1696  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1697  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1698 end if
1699 
1700 ! Unpack output data
1701 shp_out = shape(array_out)
1702  array_out = vec_out(:,1)
1703 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1704 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1705 
1706 ! Probe out
1707 
1708 
1709 end subroutine bint_apply_real_r1_r1
1710 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1711 !----------------------------------------------------------------------
1712 ! Subroutine: bint_apply_real_r1_r2
1713 !> Apply interpolation
1714 !----------------------------------------------------------------------
1715 subroutine bint_apply_real_r1_r2(bint,array_in,array_out,trans_in,trans_out,nn)
1716 
1717 implicit none
1718 
1719 ! Passed variables
1720 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1721 real(kind_real),intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
1722 real(kind_real),intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
1723 logical,intent(in),optional :: trans_in !< Input array should be transposed
1724 logical,intent(in),optional :: trans_out !< Output array should be transposed
1725 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1726 
1727 ! Local variables
1728 integer :: nl_in,nl_out
1729 integer :: shp_out(2)
1730 
1731 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1732 logical :: ltrans_in,ltrans_out,lnn
1733 
1734 ! Set name
1735 
1736 
1737 ! Get instance
1738 
1739 
1740 ! Probe in
1741 
1742 
1743 ! Local flags
1744 ltrans_in = .false.
1745 if (present(trans_in)) ltrans_in = trans_in
1746 ltrans_out = .false.
1747 if (present(trans_out)) ltrans_out = trans_out
1748 lnn = .false.
1749 if (present(nn)) lnn = nn
1750 
1751 ! Get number of levels
1752 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1753  nl_in = 1
1754 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1755 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1756  if (ltrans_out) then
1757  nl_out = size(array_out,1)
1758  else
1759  nl_out = size(array_out,2)
1760  end if
1761 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1762 bint%bump%geom%nl0 = nl_in
1763 
1764 ! Allocation
1765 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1766 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1767 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1768 
1769 ! Pack input data
1770  vec_in(:,1) = array_in
1771 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1772 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1773 
1774 ! Interpolate
1775 if (bint%bump%geom%same_grid) then
1776  call bint%apply_interp(vec_in,vec_out,lnn)
1777 else
1778  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1779  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1780 end if
1781 
1782 ! Unpack output data
1783 shp_out = shape(array_out)
1784 
1785 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1786  if (ltrans_out) then
1787  array_out = transpose(vec_out)
1788  else
1789  array_out = vec_out
1790  end if
1791 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1792 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1793 
1794 ! Probe out
1795 
1796 
1797 end subroutine bint_apply_real_r1_r2
1798 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1799 !----------------------------------------------------------------------
1800 ! Subroutine: bint_apply_real_r1_r3
1801 !> Apply interpolation
1802 !----------------------------------------------------------------------
1803 subroutine bint_apply_real_r1_r3(bint,array_in,array_out,trans_in,trans_out,nn)
1804 
1805 implicit none
1806 
1807 ! Passed variables
1808 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1809 real(kind_real),intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
1810 real(kind_real),intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
1811 logical,intent(in),optional :: trans_in !< Input array should be transposed
1812 logical,intent(in),optional :: trans_out !< Output array should be transposed
1813 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1814 
1815 ! Local variables
1816 integer :: nl_in,nl_out
1817 integer :: shp_out(3)
1818  integer :: il
1819 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1820 logical :: ltrans_in,ltrans_out,lnn
1821 
1822 ! Set name
1823 
1824 
1825 ! Get instance
1826 
1827 
1828 ! Probe in
1829 
1830 
1831 ! Local flags
1832 ltrans_in = .false.
1833 if (present(trans_in)) ltrans_in = trans_in
1834 ltrans_out = .false.
1835 if (present(trans_out)) ltrans_out = trans_out
1836 lnn = .false.
1837 if (present(nn)) lnn = nn
1838 
1839 ! Get number of levels
1840 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1841  nl_in = 1
1842 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1843 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1844  if (ltrans_out) then
1845  nl_out = size(array_out,1)
1846  else
1847  nl_out = size(array_out,3)
1848  end if
1849 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1850 bint%bump%geom%nl0 = nl_in
1851 
1852 ! Allocation
1853 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1854 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1855 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1856 
1857 ! Pack input data
1858  vec_in(:,1) = array_in
1859 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1860 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1861 
1862 ! Interpolate
1863 if (bint%bump%geom%same_grid) then
1864  call bint%apply_interp(vec_in,vec_out,lnn)
1865 else
1866  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1867  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1868 end if
1869 
1870 ! Unpack output data
1871 shp_out = shape(array_out)
1872 
1873 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1874 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1875  do il=1,nl_out
1876  if (ltrans_out) then
1877  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
1878  else
1879  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
1880  end if
1881  end do
1882 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1883 
1884 ! Probe out
1885 
1886 
1887 end subroutine bint_apply_real_r1_r3
1888 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1889 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1890 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1891 !----------------------------------------------------------------------
1892 ! Subroutine: bint_apply_real_r2_r1
1893 !> Apply interpolation
1894 !----------------------------------------------------------------------
1895 subroutine bint_apply_real_r2_r1(bint,array_in,array_out,trans_in,trans_out,nn)
1896 
1897 implicit none
1898 
1899 ! Passed variables
1900 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1901 real(kind_real),intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
1902 real(kind_real),intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
1903 logical,intent(in),optional :: trans_in !< Input array should be transposed
1904 logical,intent(in),optional :: trans_out !< Output array should be transposed
1905 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1906 
1907 ! Local variables
1908 integer :: nl_in,nl_out
1909 integer :: shp_out(1)
1910 
1911 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
1912 logical :: ltrans_in,ltrans_out,lnn
1913 
1914 ! Set name
1915 
1916 
1917 ! Get instance
1918 
1919 
1920 ! Probe in
1921 
1922 
1923 ! Local flags
1924 ltrans_in = .false.
1925 if (present(trans_in)) ltrans_in = trans_in
1926 ltrans_out = .false.
1927 if (present(trans_out)) ltrans_out = trans_out
1928 lnn = .false.
1929 if (present(nn)) lnn = nn
1930 
1931 ! Get number of levels
1932 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1933  if (ltrans_in) then
1934  nl_in = size(array_in,1)
1935  else
1936  nl_in = size(array_in,2)
1937  end if
1938 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1939 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1940  nl_out = 1
1941 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1942 bint%bump%geom%nl0 = nl_in
1943 
1944 ! Allocation
1945 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
1946 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
1947 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
1948 
1949 ! Pack input data
1950 
1951 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1952  if (ltrans_in) then
1953  vec_in = transpose(array_in)
1954  else
1955  vec_in = array_in
1956  end if
1957 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1958 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1959 
1960 ! Interpolate
1961 if (bint%bump%geom%same_grid) then
1962  call bint%apply_interp(vec_in,vec_out,lnn)
1963 else
1964  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
1965  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
1966 end if
1967 
1968 ! Unpack output data
1969 shp_out = shape(array_out)
1970  array_out = vec_out(:,1)
1971 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1972 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1973 
1974 ! Probe out
1975 
1976 
1977 end subroutine bint_apply_real_r2_r1
1978 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
1979 !----------------------------------------------------------------------
1980 ! Subroutine: bint_apply_real_r2_r2
1981 !> Apply interpolation
1982 !----------------------------------------------------------------------
1983 subroutine bint_apply_real_r2_r2(bint,array_in,array_out,trans_in,trans_out,nn)
1984 
1985 implicit none
1986 
1987 ! Passed variables
1988 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
1989 real(kind_real),intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
1990 real(kind_real),intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
1991 logical,intent(in),optional :: trans_in !< Input array should be transposed
1992 logical,intent(in),optional :: trans_out !< Output array should be transposed
1993 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
1994 
1995 ! Local variables
1996 integer :: nl_in,nl_out
1997 integer :: shp_out(2)
1998 
1999 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2000 logical :: ltrans_in,ltrans_out,lnn
2001 
2002 ! Set name
2003 
2004 
2005 ! Get instance
2006 
2007 
2008 ! Probe in
2009 
2010 
2011 ! Local flags
2012 ltrans_in = .false.
2013 if (present(trans_in)) ltrans_in = trans_in
2014 ltrans_out = .false.
2015 if (present(trans_out)) ltrans_out = trans_out
2016 lnn = .false.
2017 if (present(nn)) lnn = nn
2018 
2019 ! Get number of levels
2020 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2021  if (ltrans_in) then
2022  nl_in = size(array_in,1)
2023  else
2024  nl_in = size(array_in,2)
2025  end if
2026 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2027 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2028  if (ltrans_out) then
2029  nl_out = size(array_out,1)
2030  else
2031  nl_out = size(array_out,2)
2032  end if
2033 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2034 bint%bump%geom%nl0 = nl_in
2035 
2036 ! Allocation
2037 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2038 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2039 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2040 
2041 ! Pack input data
2042 
2043 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2044  if (ltrans_in) then
2045  vec_in = transpose(array_in)
2046  else
2047  vec_in = array_in
2048  end if
2049 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2050 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2051 
2052 ! Interpolate
2053 if (bint%bump%geom%same_grid) then
2054  call bint%apply_interp(vec_in,vec_out,lnn)
2055 else
2056  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2057  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2058 end if
2059 
2060 ! Unpack output data
2061 shp_out = shape(array_out)
2062 
2063 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2064  if (ltrans_out) then
2065  array_out = transpose(vec_out)
2066  else
2067  array_out = vec_out
2068  end if
2069 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2070 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2071 
2072 ! Probe out
2073 
2074 
2075 end subroutine bint_apply_real_r2_r2
2076 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2077 !----------------------------------------------------------------------
2078 ! Subroutine: bint_apply_real_r2_r3
2079 !> Apply interpolation
2080 !----------------------------------------------------------------------
2081 subroutine bint_apply_real_r2_r3(bint,array_in,array_out,trans_in,trans_out,nn)
2082 
2083 implicit none
2084 
2085 ! Passed variables
2086 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2087 real(kind_real),intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
2088 real(kind_real),intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
2089 logical,intent(in),optional :: trans_in !< Input array should be transposed
2090 logical,intent(in),optional :: trans_out !< Output array should be transposed
2091 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2092 
2093 ! Local variables
2094 integer :: nl_in,nl_out
2095 integer :: shp_out(3)
2096  integer :: il
2097 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2098 logical :: ltrans_in,ltrans_out,lnn
2099 
2100 ! Set name
2101 
2102 
2103 ! Get instance
2104 
2105 
2106 ! Probe in
2107 
2108 
2109 ! Local flags
2110 ltrans_in = .false.
2111 if (present(trans_in)) ltrans_in = trans_in
2112 ltrans_out = .false.
2113 if (present(trans_out)) ltrans_out = trans_out
2114 lnn = .false.
2115 if (present(nn)) lnn = nn
2116 
2117 ! Get number of levels
2118 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2119  if (ltrans_in) then
2120  nl_in = size(array_in,1)
2121  else
2122  nl_in = size(array_in,2)
2123  end if
2124 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2125 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2126  if (ltrans_out) then
2127  nl_out = size(array_out,1)
2128  else
2129  nl_out = size(array_out,3)
2130  end if
2131 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2132 bint%bump%geom%nl0 = nl_in
2133 
2134 ! Allocation
2135 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2136 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2137 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2138 
2139 ! Pack input data
2140 
2141 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2142  if (ltrans_in) then
2143  vec_in = transpose(array_in)
2144  else
2145  vec_in = array_in
2146  end if
2147 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2148 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2149 
2150 ! Interpolate
2151 if (bint%bump%geom%same_grid) then
2152  call bint%apply_interp(vec_in,vec_out,lnn)
2153 else
2154  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2155  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2156 end if
2157 
2158 ! Unpack output data
2159 shp_out = shape(array_out)
2160 
2161 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2162 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2163  do il=1,nl_out
2164  if (ltrans_out) then
2165  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
2166  else
2167  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
2168  end if
2169  end do
2170 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2171 
2172 ! Probe out
2173 
2174 
2175 end subroutine bint_apply_real_r2_r3
2176 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2177 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2178 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2179 !----------------------------------------------------------------------
2180 ! Subroutine: bint_apply_real_r3_r1
2181 !> Apply interpolation
2182 !----------------------------------------------------------------------
2183 subroutine bint_apply_real_r3_r1(bint,array_in,array_out,trans_in,trans_out,nn)
2184 
2185 implicit none
2186 
2187 ! Passed variables
2188 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2189 real(kind_real),intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
2190 real(kind_real),intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
2191 logical,intent(in),optional :: trans_in !< Input array should be transposed
2192 logical,intent(in),optional :: trans_out !< Output array should be transposed
2193 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2194 
2195 ! Local variables
2196 integer :: nl_in,nl_out
2197 integer :: shp_out(1)
2198  integer :: il
2199 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2200 logical :: ltrans_in,ltrans_out,lnn
2201 
2202 ! Set name
2203 
2204 
2205 ! Get instance
2206 
2207 
2208 ! Probe in
2209 
2210 
2211 ! Local flags
2212 ltrans_in = .false.
2213 if (present(trans_in)) ltrans_in = trans_in
2214 ltrans_out = .false.
2215 if (present(trans_out)) ltrans_out = trans_out
2216 lnn = .false.
2217 if (present(nn)) lnn = nn
2218 
2219 ! Get number of levels
2220 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2221  if (ltrans_in) then
2222  nl_in = size(array_in,1)
2223  else
2224  nl_in = size(array_in,3)
2225  end if
2226 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2227 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2228  nl_out = 1
2229 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2230 bint%bump%geom%nl0 = nl_in
2231 
2232 ! Allocation
2233 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2234 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2235 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2236 
2237 ! Pack input data
2238 
2239 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2240 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2241  do il=1,nl_in
2242  if (ltrans_in) then
2243  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
2244  else
2245  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
2246  end if
2247  end do
2248 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2249 
2250 ! Interpolate
2251 if (bint%bump%geom%same_grid) then
2252  call bint%apply_interp(vec_in,vec_out,lnn)
2253 else
2254  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2255  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2256 end if
2257 
2258 ! Unpack output data
2259 shp_out = shape(array_out)
2260  array_out = vec_out(:,1)
2261 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2262 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2263 
2264 ! Probe out
2265 
2266 
2267 end subroutine bint_apply_real_r3_r1
2268 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2269 !----------------------------------------------------------------------
2270 ! Subroutine: bint_apply_real_r3_r2
2271 !> Apply interpolation
2272 !----------------------------------------------------------------------
2273 subroutine bint_apply_real_r3_r2(bint,array_in,array_out,trans_in,trans_out,nn)
2274 
2275 implicit none
2276 
2277 ! Passed variables
2278 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2279 real(kind_real),intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
2280 real(kind_real),intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
2281 logical,intent(in),optional :: trans_in !< Input array should be transposed
2282 logical,intent(in),optional :: trans_out !< Output array should be transposed
2283 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2284 
2285 ! Local variables
2286 integer :: nl_in,nl_out
2287 integer :: shp_out(2)
2288  integer :: il
2289 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2290 logical :: ltrans_in,ltrans_out,lnn
2291 
2292 ! Set name
2293 
2294 
2295 ! Get instance
2296 
2297 
2298 ! Probe in
2299 
2300 
2301 ! Local flags
2302 ltrans_in = .false.
2303 if (present(trans_in)) ltrans_in = trans_in
2304 ltrans_out = .false.
2305 if (present(trans_out)) ltrans_out = trans_out
2306 lnn = .false.
2307 if (present(nn)) lnn = nn
2308 
2309 ! Get number of levels
2310 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2311  if (ltrans_in) then
2312  nl_in = size(array_in,1)
2313  else
2314  nl_in = size(array_in,3)
2315  end if
2316 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2317 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2318  if (ltrans_out) then
2319  nl_out = size(array_out,1)
2320  else
2321  nl_out = size(array_out,2)
2322  end if
2323 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2324 bint%bump%geom%nl0 = nl_in
2325 
2326 ! Allocation
2327 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2328 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2329 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2330 
2331 ! Pack input data
2332 
2333 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2334 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2335  do il=1,nl_in
2336  if (ltrans_in) then
2337  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
2338  else
2339  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
2340  end if
2341  end do
2342 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2343 
2344 ! Interpolate
2345 if (bint%bump%geom%same_grid) then
2346  call bint%apply_interp(vec_in,vec_out,lnn)
2347 else
2348  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2349  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2350 end if
2351 
2352 ! Unpack output data
2353 shp_out = shape(array_out)
2354 
2355 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2356  if (ltrans_out) then
2357  array_out = transpose(vec_out)
2358  else
2359  array_out = vec_out
2360  end if
2361 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2362 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2363 
2364 ! Probe out
2365 
2366 
2367 end subroutine bint_apply_real_r3_r2
2368 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2369 !----------------------------------------------------------------------
2370 ! Subroutine: bint_apply_real_r3_r3
2371 !> Apply interpolation
2372 !----------------------------------------------------------------------
2373 subroutine bint_apply_real_r3_r3(bint,array_in,array_out,trans_in,trans_out,nn)
2374 
2375 implicit none
2376 
2377 ! Passed variables
2378 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2379 real(kind_real),intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
2380 real(kind_real),intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
2381 logical,intent(in),optional :: trans_in !< Input array should be transposed
2382 logical,intent(in),optional :: trans_out !< Output array should be transposed
2383 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2384 
2385 ! Local variables
2386 integer :: nl_in,nl_out
2387 integer :: shp_out(3)
2388  integer :: il
2389 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2390 logical :: ltrans_in,ltrans_out,lnn
2391 
2392 ! Set name
2393 
2394 
2395 ! Get instance
2396 
2397 
2398 ! Probe in
2399 
2400 
2401 ! Local flags
2402 ltrans_in = .false.
2403 if (present(trans_in)) ltrans_in = trans_in
2404 ltrans_out = .false.
2405 if (present(trans_out)) ltrans_out = trans_out
2406 lnn = .false.
2407 if (present(nn)) lnn = nn
2408 
2409 ! Get number of levels
2410 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2411  if (ltrans_in) then
2412  nl_in = size(array_in,1)
2413  else
2414  nl_in = size(array_in,3)
2415  end if
2416 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2417 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2418  if (ltrans_out) then
2419  nl_out = size(array_out,1)
2420  else
2421  nl_out = size(array_out,3)
2422  end if
2423 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2424 bint%bump%geom%nl0 = nl_in
2425 
2426 ! Allocation
2427 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2428 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2429 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2430 
2431 ! Pack input data
2432 
2433 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2434 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2435  do il=1,nl_in
2436  if (ltrans_in) then
2437  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
2438  else
2439  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
2440  end if
2441  end do
2442 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2443 
2444 ! Interpolate
2445 if (bint%bump%geom%same_grid) then
2446  call bint%apply_interp(vec_in,vec_out,lnn)
2447 else
2448  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2449  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2450 end if
2451 
2452 ! Unpack output data
2453 shp_out = shape(array_out)
2454 
2455 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2456 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2457  do il=1,nl_out
2458  if (ltrans_out) then
2459  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
2460  else
2461  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
2462  end if
2463  end do
2464 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2465 
2466 ! Probe out
2467 
2468 
2469 end subroutine bint_apply_real_r3_r3
2470 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2471 # 686 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2472 # 565 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2473 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2474 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2475 !----------------------------------------------------------------------
2476 ! Subroutine: bint_apply_logical_r1_r1
2477 !> Apply interpolation
2478 !----------------------------------------------------------------------
2479 subroutine bint_apply_logical_r1_r1(bint,array_in,array_out,trans_in,trans_out,nn)
2480 
2481 implicit none
2482 
2483 ! Passed variables
2484 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2485 logical,intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
2486 logical,intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
2487 logical,intent(in),optional :: trans_in !< Input array should be transposed
2488 logical,intent(in),optional :: trans_out !< Output array should be transposed
2489 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2490 
2491 ! Local variables
2492 integer :: nl_in,nl_out
2493 integer :: shp_out(1)
2494 
2495 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2496 logical :: ltrans_in,ltrans_out,lnn
2497 
2498 ! Set name
2499 
2500 
2501 ! Get instance
2502 
2503 
2504 ! Probe in
2505 
2506 
2507 ! Local flags
2508 ltrans_in = .false.
2509 if (present(trans_in)) ltrans_in = trans_in
2510 ltrans_out = .false.
2511 if (present(trans_out)) ltrans_out = trans_out
2512 lnn = .false.
2513 if (present(nn)) lnn = nn
2514 
2515 ! Get number of levels
2516 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2517  nl_in = 1
2518 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2519 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2520  nl_out = 1
2521 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2522 bint%bump%geom%nl0 = nl_in
2523 
2524 ! Allocation
2525 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2526 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2527 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2528 
2529 ! Pack input data
2530  vec_in(:,1) = array_in
2531 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2532 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2533 
2534 ! Interpolate
2535 if (bint%bump%geom%same_grid) then
2536  call bint%apply_interp(vec_in,vec_out,lnn)
2537 else
2538  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2539  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2540 end if
2541 
2542 ! Unpack output data
2543 shp_out = shape(array_out)
2544  array_out = vec_out(:,1)
2545 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2546 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2547 
2548 ! Probe out
2549 
2550 
2551 end subroutine bint_apply_logical_r1_r1
2552 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2553 !----------------------------------------------------------------------
2554 ! Subroutine: bint_apply_logical_r1_r2
2555 !> Apply interpolation
2556 !----------------------------------------------------------------------
2557 subroutine bint_apply_logical_r1_r2(bint,array_in,array_out,trans_in,trans_out,nn)
2558 
2559 implicit none
2560 
2561 ! Passed variables
2562 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2563 logical,intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
2564 logical,intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
2565 logical,intent(in),optional :: trans_in !< Input array should be transposed
2566 logical,intent(in),optional :: trans_out !< Output array should be transposed
2567 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2568 
2569 ! Local variables
2570 integer :: nl_in,nl_out
2571 integer :: shp_out(2)
2572 
2573 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2574 logical :: ltrans_in,ltrans_out,lnn
2575 
2576 ! Set name
2577 
2578 
2579 ! Get instance
2580 
2581 
2582 ! Probe in
2583 
2584 
2585 ! Local flags
2586 ltrans_in = .false.
2587 if (present(trans_in)) ltrans_in = trans_in
2588 ltrans_out = .false.
2589 if (present(trans_out)) ltrans_out = trans_out
2590 lnn = .false.
2591 if (present(nn)) lnn = nn
2592 
2593 ! Get number of levels
2594 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2595  nl_in = 1
2596 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2597 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2598  if (ltrans_out) then
2599  nl_out = size(array_out,1)
2600  else
2601  nl_out = size(array_out,2)
2602  end if
2603 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2604 bint%bump%geom%nl0 = nl_in
2605 
2606 ! Allocation
2607 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2608 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2609 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2610 
2611 ! Pack input data
2612  vec_in(:,1) = array_in
2613 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2614 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2615 
2616 ! Interpolate
2617 if (bint%bump%geom%same_grid) then
2618  call bint%apply_interp(vec_in,vec_out,lnn)
2619 else
2620  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2621  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2622 end if
2623 
2624 ! Unpack output data
2625 shp_out = shape(array_out)
2626 
2627 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2628  if (ltrans_out) then
2629  array_out = transpose(vec_out)
2630  else
2631  array_out = vec_out
2632  end if
2633 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2634 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2635 
2636 ! Probe out
2637 
2638 
2639 end subroutine bint_apply_logical_r1_r2
2640 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2641 !----------------------------------------------------------------------
2642 ! Subroutine: bint_apply_logical_r1_r3
2643 !> Apply interpolation
2644 !----------------------------------------------------------------------
2645 subroutine bint_apply_logical_r1_r3(bint,array_in,array_out,trans_in,trans_out,nn)
2646 
2647 implicit none
2648 
2649 ! Passed variables
2650 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2651 logical,intent(in) :: array_in(:) !< Input array, the rightmost dimension being the vertical
2652 logical,intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
2653 logical,intent(in),optional :: trans_in !< Input array should be transposed
2654 logical,intent(in),optional :: trans_out !< Output array should be transposed
2655 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2656 
2657 ! Local variables
2658 integer :: nl_in,nl_out
2659 integer :: shp_out(3)
2660  integer :: il
2661 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2662 logical :: ltrans_in,ltrans_out,lnn
2663 
2664 ! Set name
2665 
2666 
2667 ! Get instance
2668 
2669 
2670 ! Probe in
2671 
2672 
2673 ! Local flags
2674 ltrans_in = .false.
2675 if (present(trans_in)) ltrans_in = trans_in
2676 ltrans_out = .false.
2677 if (present(trans_out)) ltrans_out = trans_out
2678 lnn = .false.
2679 if (present(nn)) lnn = nn
2680 
2681 ! Get number of levels
2682 # 609 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2683  nl_in = 1
2684 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2685 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2686  if (ltrans_out) then
2687  nl_out = size(array_out,1)
2688  else
2689  nl_out = size(array_out,3)
2690  end if
2691 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2692 bint%bump%geom%nl0 = nl_in
2693 
2694 ! Allocation
2695 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2696 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2697 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2698 
2699 ! Pack input data
2700  vec_in(:,1) = array_in
2701 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2702 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2703 
2704 ! Interpolate
2705 if (bint%bump%geom%same_grid) then
2706  call bint%apply_interp(vec_in,vec_out,lnn)
2707 else
2708  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2709  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2710 end if
2711 
2712 ! Unpack output data
2713 shp_out = shape(array_out)
2714 
2715 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2716 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2717  do il=1,nl_out
2718  if (ltrans_out) then
2719  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
2720  else
2721  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
2722  end if
2723  end do
2724 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2725 
2726 ! Probe out
2727 
2728 
2729 end subroutine bint_apply_logical_r1_r3
2730 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2731 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2732 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2733 !----------------------------------------------------------------------
2734 ! Subroutine: bint_apply_logical_r2_r1
2735 !> Apply interpolation
2736 !----------------------------------------------------------------------
2737 subroutine bint_apply_logical_r2_r1(bint,array_in,array_out,trans_in,trans_out,nn)
2738 
2739 implicit none
2740 
2741 ! Passed variables
2742 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2743 logical,intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
2744 logical,intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
2745 logical,intent(in),optional :: trans_in !< Input array should be transposed
2746 logical,intent(in),optional :: trans_out !< Output array should be transposed
2747 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2748 
2749 ! Local variables
2750 integer :: nl_in,nl_out
2751 integer :: shp_out(1)
2752 
2753 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2754 logical :: ltrans_in,ltrans_out,lnn
2755 
2756 ! Set name
2757 
2758 
2759 ! Get instance
2760 
2761 
2762 ! Probe in
2763 
2764 
2765 ! Local flags
2766 ltrans_in = .false.
2767 if (present(trans_in)) ltrans_in = trans_in
2768 ltrans_out = .false.
2769 if (present(trans_out)) ltrans_out = trans_out
2770 lnn = .false.
2771 if (present(nn)) lnn = nn
2772 
2773 ! Get number of levels
2774 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2775  if (ltrans_in) then
2776  nl_in = size(array_in,1)
2777  else
2778  nl_in = size(array_in,2)
2779  end if
2780 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2781 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2782  nl_out = 1
2783 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2784 bint%bump%geom%nl0 = nl_in
2785 
2786 ! Allocation
2787 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2788 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2789 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2790 
2791 ! Pack input data
2792 
2793 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2794  if (ltrans_in) then
2795  vec_in = transpose(array_in)
2796  else
2797  vec_in = array_in
2798  end if
2799 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2800 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2801 
2802 ! Interpolate
2803 if (bint%bump%geom%same_grid) then
2804  call bint%apply_interp(vec_in,vec_out,lnn)
2805 else
2806  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2807  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2808 end if
2809 
2810 ! Unpack output data
2811 shp_out = shape(array_out)
2812  array_out = vec_out(:,1)
2813 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2814 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2815 
2816 ! Probe out
2817 
2818 
2819 end subroutine bint_apply_logical_r2_r1
2820 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2821 !----------------------------------------------------------------------
2822 ! Subroutine: bint_apply_logical_r2_r2
2823 !> Apply interpolation
2824 !----------------------------------------------------------------------
2825 subroutine bint_apply_logical_r2_r2(bint,array_in,array_out,trans_in,trans_out,nn)
2826 
2827 implicit none
2828 
2829 ! Passed variables
2830 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2831 logical,intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
2832 logical,intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
2833 logical,intent(in),optional :: trans_in !< Input array should be transposed
2834 logical,intent(in),optional :: trans_out !< Output array should be transposed
2835 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2836 
2837 ! Local variables
2838 integer :: nl_in,nl_out
2839 integer :: shp_out(2)
2840 
2841 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2842 logical :: ltrans_in,ltrans_out,lnn
2843 
2844 ! Set name
2845 
2846 
2847 ! Get instance
2848 
2849 
2850 ! Probe in
2851 
2852 
2853 ! Local flags
2854 ltrans_in = .false.
2855 if (present(trans_in)) ltrans_in = trans_in
2856 ltrans_out = .false.
2857 if (present(trans_out)) ltrans_out = trans_out
2858 lnn = .false.
2859 if (present(nn)) lnn = nn
2860 
2861 ! Get number of levels
2862 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2863  if (ltrans_in) then
2864  nl_in = size(array_in,1)
2865  else
2866  nl_in = size(array_in,2)
2867  end if
2868 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2869 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2870  if (ltrans_out) then
2871  nl_out = size(array_out,1)
2872  else
2873  nl_out = size(array_out,2)
2874  end if
2875 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2876 bint%bump%geom%nl0 = nl_in
2877 
2878 ! Allocation
2879 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2880 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2881 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2882 
2883 ! Pack input data
2884 
2885 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2886  if (ltrans_in) then
2887  vec_in = transpose(array_in)
2888  else
2889  vec_in = array_in
2890  end if
2891 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2892 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2893 
2894 ! Interpolate
2895 if (bint%bump%geom%same_grid) then
2896  call bint%apply_interp(vec_in,vec_out,lnn)
2897 else
2898  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2899  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2900 end if
2901 
2902 ! Unpack output data
2903 shp_out = shape(array_out)
2904 
2905 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2906  if (ltrans_out) then
2907  array_out = transpose(vec_out)
2908  else
2909  array_out = vec_out
2910  end if
2911 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2912 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2913 
2914 ! Probe out
2915 
2916 
2917 end subroutine bint_apply_logical_r2_r2
2918 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2919 !----------------------------------------------------------------------
2920 ! Subroutine: bint_apply_logical_r2_r3
2921 !> Apply interpolation
2922 !----------------------------------------------------------------------
2923 subroutine bint_apply_logical_r2_r3(bint,array_in,array_out,trans_in,trans_out,nn)
2924 
2925 implicit none
2926 
2927 ! Passed variables
2928 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
2929 logical,intent(in) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
2930 logical,intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
2931 logical,intent(in),optional :: trans_in !< Input array should be transposed
2932 logical,intent(in),optional :: trans_out !< Output array should be transposed
2933 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
2934 
2935 ! Local variables
2936 integer :: nl_in,nl_out
2937 integer :: shp_out(3)
2938  integer :: il
2939 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
2940 logical :: ltrans_in,ltrans_out,lnn
2941 
2942 ! Set name
2943 
2944 
2945 ! Get instance
2946 
2947 
2948 ! Probe in
2949 
2950 
2951 ! Local flags
2952 ltrans_in = .false.
2953 if (present(trans_in)) ltrans_in = trans_in
2954 ltrans_out = .false.
2955 if (present(trans_out)) ltrans_out = trans_out
2956 lnn = .false.
2957 if (present(nn)) lnn = nn
2958 
2959 ! Get number of levels
2960 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2961  if (ltrans_in) then
2962  nl_in = size(array_in,1)
2963  else
2964  nl_in = size(array_in,2)
2965  end if
2966 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2967 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2968  if (ltrans_out) then
2969  nl_out = size(array_out,1)
2970  else
2971  nl_out = size(array_out,3)
2972  end if
2973 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2974 bint%bump%geom%nl0 = nl_in
2975 
2976 ! Allocation
2977 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
2978 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
2979 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
2980 
2981 ! Pack input data
2982 
2983 # 636 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2984  if (ltrans_in) then
2985  vec_in = transpose(array_in)
2986  else
2987  vec_in = array_in
2988  end if
2989 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2990 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
2991 
2992 ! Interpolate
2993 if (bint%bump%geom%same_grid) then
2994  call bint%apply_interp(vec_in,vec_out,lnn)
2995 else
2996  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
2997  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
2998 end if
2999 
3000 ! Unpack output data
3001 shp_out = shape(array_out)
3002 
3003 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3004 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3005  do il=1,nl_out
3006  if (ltrans_out) then
3007  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
3008  else
3009  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
3010  end if
3011  end do
3012 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3013 
3014 ! Probe out
3015 
3016 
3017 end subroutine bint_apply_logical_r2_r3
3018 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3019 # 566 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3020 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3021 !----------------------------------------------------------------------
3022 ! Subroutine: bint_apply_logical_r3_r1
3023 !> Apply interpolation
3024 !----------------------------------------------------------------------
3025 subroutine bint_apply_logical_r3_r1(bint,array_in,array_out,trans_in,trans_out,nn)
3026 
3027 implicit none
3028 
3029 ! Passed variables
3030 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3031 logical,intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
3032 logical,intent(out) :: array_out(:) !< Output array, the rightmost dimension being the vertical
3033 logical,intent(in),optional :: trans_in !< Input array should be transposed
3034 logical,intent(in),optional :: trans_out !< Output array should be transposed
3035 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
3036 
3037 ! Local variables
3038 integer :: nl_in,nl_out
3039 integer :: shp_out(1)
3040  integer :: il
3041 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3042 logical :: ltrans_in,ltrans_out,lnn
3043 
3044 ! Set name
3045 
3046 
3047 ! Get instance
3048 
3049 
3050 ! Probe in
3051 
3052 
3053 ! Local flags
3054 ltrans_in = .false.
3055 if (present(trans_in)) ltrans_in = trans_in
3056 ltrans_out = .false.
3057 if (present(trans_out)) ltrans_out = trans_out
3058 lnn = .false.
3059 if (present(nn)) lnn = nn
3060 
3061 ! Get number of levels
3062 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3063  if (ltrans_in) then
3064  nl_in = size(array_in,1)
3065  else
3066  nl_in = size(array_in,3)
3067  end if
3068 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3069 # 618 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3070  nl_out = 1
3071 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3072 bint%bump%geom%nl0 = nl_in
3073 
3074 ! Allocation
3075 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3076 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3077 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3078 
3079 ! Pack input data
3080 
3081 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3082 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3083  do il=1,nl_in
3084  if (ltrans_in) then
3085  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
3086  else
3087  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
3088  end if
3089  end do
3090 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3091 
3092 ! Interpolate
3093 if (bint%bump%geom%same_grid) then
3094  call bint%apply_interp(vec_in,vec_out,lnn)
3095 else
3096  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
3097  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
3098 end if
3099 
3100 ! Unpack output data
3101 shp_out = shape(array_out)
3102  array_out = vec_out(:,1)
3103 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3104 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3105 
3106 ! Probe out
3107 
3108 
3109 end subroutine bint_apply_logical_r3_r1
3110 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3111 !----------------------------------------------------------------------
3112 ! Subroutine: bint_apply_logical_r3_r2
3113 !> Apply interpolation
3114 !----------------------------------------------------------------------
3115 subroutine bint_apply_logical_r3_r2(bint,array_in,array_out,trans_in,trans_out,nn)
3116 
3117 implicit none
3118 
3119 ! Passed variables
3120 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3121 logical,intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
3122 logical,intent(out) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
3123 logical,intent(in),optional :: trans_in !< Input array should be transposed
3124 logical,intent(in),optional :: trans_out !< Output array should be transposed
3125 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
3126 
3127 ! Local variables
3128 integer :: nl_in,nl_out
3129 integer :: shp_out(2)
3130  integer :: il
3131 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3132 logical :: ltrans_in,ltrans_out,lnn
3133 
3134 ! Set name
3135 
3136 
3137 ! Get instance
3138 
3139 
3140 ! Probe in
3141 
3142 
3143 ! Local flags
3144 ltrans_in = .false.
3145 if (present(trans_in)) ltrans_in = trans_in
3146 ltrans_out = .false.
3147 if (present(trans_out)) ltrans_out = trans_out
3148 lnn = .false.
3149 if (present(nn)) lnn = nn
3150 
3151 ! Get number of levels
3152 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3153  if (ltrans_in) then
3154  nl_in = size(array_in,1)
3155  else
3156  nl_in = size(array_in,3)
3157  end if
3158 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3159 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3160  if (ltrans_out) then
3161  nl_out = size(array_out,1)
3162  else
3163  nl_out = size(array_out,2)
3164  end if
3165 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3166 bint%bump%geom%nl0 = nl_in
3167 
3168 ! Allocation
3169 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3170 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3171 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3172 
3173 ! Pack input data
3174 
3175 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3176 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3177  do il=1,nl_in
3178  if (ltrans_in) then
3179  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
3180  else
3181  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
3182  end if
3183  end do
3184 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3185 
3186 ! Interpolate
3187 if (bint%bump%geom%same_grid) then
3188  call bint%apply_interp(vec_in,vec_out,lnn)
3189 else
3190  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
3191  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
3192 end if
3193 
3194 ! Unpack output data
3195 shp_out = shape(array_out)
3196 
3197 # 664 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3198  if (ltrans_out) then
3199  array_out = transpose(vec_out)
3200  else
3201  array_out = vec_out
3202  end if
3203 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3204 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3205 
3206 ! Probe out
3207 
3208 
3209 end subroutine bint_apply_logical_r3_r2
3210 # 567 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3211 !----------------------------------------------------------------------
3212 ! Subroutine: bint_apply_logical_r3_r3
3213 !> Apply interpolation
3214 !----------------------------------------------------------------------
3215 subroutine bint_apply_logical_r3_r3(bint,array_in,array_out,trans_in,trans_out,nn)
3216 
3217 implicit none
3218 
3219 ! Passed variables
3220 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3221 logical,intent(in) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
3222 logical,intent(out) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
3223 logical,intent(in),optional :: trans_in !< Input array should be transposed
3224 logical,intent(in),optional :: trans_out !< Output array should be transposed
3225 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
3226 
3227 ! Local variables
3228 integer :: nl_in,nl_out
3229 integer :: shp_out(3)
3230  integer :: il
3231 logical,allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3232 logical :: ltrans_in,ltrans_out,lnn
3233 
3234 ! Set name
3235 
3236 
3237 ! Get instance
3238 
3239 
3240 ! Probe in
3241 
3242 
3243 ! Local flags
3244 ltrans_in = .false.
3245 if (present(trans_in)) ltrans_in = trans_in
3246 ltrans_out = .false.
3247 if (present(trans_out)) ltrans_out = trans_out
3248 lnn = .false.
3249 if (present(nn)) lnn = nn
3250 
3251 ! Get number of levels
3252 # 611 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3253  if (ltrans_in) then
3254  nl_in = size(array_in,1)
3255  else
3256  nl_in = size(array_in,3)
3257  end if
3258 # 617 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3259 # 620 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3260  if (ltrans_out) then
3261  nl_out = size(array_out,1)
3262  else
3263  nl_out = size(array_out,3)
3264  end if
3265 # 626 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3266 bint%bump%geom%nl0 = nl_in
3267 
3268 ! Allocation
3269 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3270 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3271 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3272 
3273 ! Pack input data
3274 
3275 # 642 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3276 # 643 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3277  do il=1,nl_in
3278  if (ltrans_in) then
3279  vec_in(:,il) = reshape(transpose(array_in(:,:,il)),(/bint%bump%geom%nmga/))
3280  else
3281  vec_in(:,il) = reshape(array_in(:,:,il),(/bint%bump%geom%nmga/))
3282  end if
3283  end do
3284 # 651 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3285 
3286 ! Interpolate
3287 if (bint%bump%geom%same_grid) then
3288  call bint%apply_interp(vec_in,vec_out,lnn)
3289 else
3290  call bint%bump%geom%copy_mga_to_c0a(bint%bump%mpl,vec_in,vec_in_tmp)
3291  call bint%apply_interp(vec_in_tmp,vec_out,lnn)
3292 end if
3293 
3294 ! Unpack output data
3295 shp_out = shape(array_out)
3296 
3297 # 670 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3298 # 671 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3299  do il=1,nl_out
3300  if (ltrans_out) then
3301  array_out(:,:,il) = transpose(reshape(vec_out(:,il),(/shp_out(2),shp_out(1)/)))
3302  else
3303  array_out(:,:,il) = reshape(vec_out(:,il),shp_out(1:2))
3304  end if
3305  end do
3306 # 679 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3307 
3308 ! Probe out
3309 
3310 
3311 end subroutine bint_apply_logical_r3_r3
3312 # 685 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3313 # 686 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3314 # 687 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3315 
3316 # 689 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3317 !----------------------------------------------------------------------
3318 ! Subroutine: bint_apply_interp_int
3319 !> Low-level routine to apply the interpolation to a single field on a single level
3320 !----------------------------------------------------------------------
3321 subroutine bint_apply_interp_int(bint,array_in,array_out,nn)
3322 
3323 implicit none
3324 
3325 ! Passed variables
3326 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3327 integer(kind_int),intent(in) :: array_in(bint%bump%geom%nc0a,bint%bump%geom%nl0) !< Input field
3328 integer(kind_int),intent(out) :: array_out(bint%nouta,bint%bump%geom%nl0) !< Output field
3329 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
3330 
3331 ! Local variables
3332 
3333 integer(kind_int),allocatable :: array_in_ext(:,:)
3334 logical :: lnn
3335 
3336 ! Set name
3337 
3338 
3339 ! Get instance
3340 
3341 
3342 ! Probe in
3343 
3344 
3345 ! Local flag
3346 lnn = .false.
3347 if (present(nn)) lnn = nn
3348 
3349 ! Allocation
3350 allocate(array_in_ext(bint%nc0b,bint%bump%geom%nl0))
3351 
3352 ! Halo extension
3353 call bint%com%ext(bint%bump%mpl,array_in,array_in_ext)
3354 
3355 if (bint%nouta > 0) then
3356 # 741 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3357  ! Copy nearest neighbor
3358  array_out = array_in_ext(bint%nn_index,:)
3359 # 744 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3360 end if
3361 
3362 ! Release memory
3363 deallocate(array_in_ext)
3364 
3365 ! Probe out
3366 
3367 
3368 end subroutine bint_apply_interp_int
3369 # 689 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3370 !----------------------------------------------------------------------
3371 ! Subroutine: bint_apply_interp_real
3372 !> Low-level routine to apply the interpolation to a single field on a single level
3373 !----------------------------------------------------------------------
3374 subroutine bint_apply_interp_real(bint,array_in,array_out,nn)
3375 
3376 implicit none
3377 
3378 ! Passed variables
3379 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3380 real(kind_real),intent(in) :: array_in(bint%bump%geom%nc0a,bint%bump%geom%nl0) !< Input field
3381 real(kind_real),intent(out) :: array_out(bint%nouta,bint%bump%geom%nl0) !< Output field
3382 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
3383 
3384 ! Local variables
3385  integer :: ilev
3386 real(kind_real),allocatable :: array_in_ext(:,:)
3387 logical :: lnn
3388 
3389 ! Set name
3390 
3391 
3392 ! Get instance
3393 
3394 
3395 ! Probe in
3396 
3397 
3398 ! Local flag
3399 lnn = .false.
3400 if (present(nn)) lnn = nn
3401 
3402 ! Allocation
3403 allocate(array_in_ext(bint%nc0b,bint%bump%geom%nl0))
3404 
3405 ! Halo extension
3406 call bint%com%ext(bint%bump%mpl,array_in,array_in_ext)
3407 
3408 if (bint%nouta > 0) then
3409 # 729 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3410  if (lnn) then
3411  ! Copy nearest neighbor
3412  array_out = array_in_ext(bint%nn_index,:)
3413  else
3414  ! Horizontal interpolation
3415  !$omp parallel do schedule(static) private(ilev)
3416  do ilev=1,bint%bump%geom%nl0
3417  call bint%h%apply(bint%bump%mpl,array_in_ext(:,ilev),array_out(:,ilev))
3418  end do
3419  !$omp end parallel do
3420  end if
3421 # 744 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3422 end if
3423 
3424 ! Release memory
3425 deallocate(array_in_ext)
3426 
3427 ! Probe out
3428 
3429 
3430 end subroutine bint_apply_interp_real
3431 # 689 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3432 !----------------------------------------------------------------------
3433 ! Subroutine: bint_apply_interp_logical
3434 !> Low-level routine to apply the interpolation to a single field on a single level
3435 !----------------------------------------------------------------------
3436 subroutine bint_apply_interp_logical(bint,array_in,array_out,nn)
3437 
3438 implicit none
3439 
3440 ! Passed variables
3441 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3442 logical,intent(in) :: array_in(bint%bump%geom%nc0a,bint%bump%geom%nl0) !< Input field
3443 logical,intent(out) :: array_out(bint%nouta,bint%bump%geom%nl0) !< Output field
3444 logical,intent(in),optional :: nn !< Nearest neighbor interpolation
3445 
3446 ! Local variables
3447 
3448 logical,allocatable :: array_in_ext(:,:)
3449 logical :: lnn
3450 
3451 ! Set name
3452 
3453 
3454 ! Get instance
3455 
3456 
3457 ! Probe in
3458 
3459 
3460 ! Local flag
3461 lnn = .false.
3462 if (present(nn)) lnn = nn
3463 
3464 ! Allocation
3465 allocate(array_in_ext(bint%nc0b,bint%bump%geom%nl0))
3466 
3467 ! Halo extension
3468 call bint%com%ext(bint%bump%mpl,array_in,array_in_ext)
3469 
3470 if (bint%nouta > 0) then
3471 # 741 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3472  ! Copy nearest neighbor
3473  array_out = array_in_ext(bint%nn_index,:)
3474 # 744 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3475 end if
3476 
3477 ! Release memory
3478 deallocate(array_in_ext)
3479 
3480 ! Probe out
3481 
3482 
3483 end subroutine bint_apply_interp_logical
3484 # 754 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3485 
3486 !----------------------------------------------------------------------
3487 !> Apply interpolator operator adjoint
3488 !! The caller can optionally pass this arguement as an empty fieldset and the
3489 !! routine will create and allocate each component of the fieldset. Or, if
3490 !! the field components of the fieldset are already allocated by the caller,
3491 !! then this routine will merely replace the field values with the result
3492 !! of the computation.
3493 !----------------------------------------------------------------------
3494 subroutine bint_apply_ad(bint,fieldset_out,fieldset_in)
3495 
3496 implicit none
3497 
3498 ! Passed variables
3499 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3500 type(fieldset_type),intent(in) :: fieldset_out !< Fields on the second grid, i.e. the target grid of the original interpolation. For the adjoint, these fields are treated as an input.
3501 type(fieldset_type),intent(inout) :: fieldset_in !< Fields defined on the first grid, i.e. the source grid of the original interpolation. For the adjoint, these are treated as an output.
3502 
3503 ! Local variables
3504 integer :: ifield
3505 real(kind_real),allocatable :: array_in_mga(:,:),array_in_c0a(:,:),array_out(:,:)
3506 character(len=max_string) :: fieldname
3507 type(atlas_field) :: afield_in,afield_out
3508 
3509 ! Set name
3510 
3511 
3512 ! Get instance
3513 
3514 
3515 ! Probe in
3516 
3517 
3518 ! Allocation
3519 allocate(array_in_mga(bint%bump%geom%nmga,bint%bump%geom%nl0))
3520 if (.not.bint%bump%geom%same_grid) allocate(array_in_c0a(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3521 allocate(array_out(bint%nouta,bint%bump%geom%nl0))
3522 
3523 do ifield=1,fieldset_out%size()
3524  ! Copy field and field name
3525  afield_out = fieldset_out%field(ifield)
3526  fieldname = afield_out%name()
3527 
3528  ! Allocation
3529  if (fieldset_in%has_field(fieldname)) then
3530  afield_in = fieldset_in%field(name=fieldname)
3531  else
3532  afield_in = bint%afunctionspace_in%create_field(name=fieldname,kind=atlas_real(kind_real),levels=bint%bump%geom%nl0)
3533  call fieldset_in%add(afield_in)
3534  end if
3535 
3536  ! ATLAS field to BUMP array
3537  call field_to_array(afield_out,bint%bump%mpl,array_out)
3538  if (bint%bump%geom%same_grid) then
3539  ! Apply interpolation operator adjoint
3540  call bint%apply_interp_ad(array_out,array_in_mga)
3541  else
3542  ! Apply interpolation operator adjoint
3543  call bint%apply_interp_ad(array_out,array_in_c0a)
3544 
3545  ! Subset Sc0 to model grid
3546  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,array_in_c0a,array_in_mga)
3547  end if
3548 
3549  ! BUMP array to ATLAS field
3550  call field_from_array(afield_in,bint%bump%mpl,array_in_mga)
3551 
3552  ! Release pointers
3553  call afield_in%final()
3554  call afield_out%final()
3555 end do
3556 
3557 ! Release memory
3558 deallocate(array_in_mga)
3559 if (.not.bint%bump%geom%same_grid) deallocate(array_in_c0a)
3560 deallocate(array_out)
3561 
3562 ! Probe out
3563 
3564 
3565 end subroutine bint_apply_ad
3566 
3567 # 837 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3568 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3569 !----------------------------------------------------------------------
3570 ! Subroutine: bint_apply_ad_r1_r1
3571 !> Apply interpolation operator adjoint
3572 !----------------------------------------------------------------------
3573 subroutine bint_apply_ad_r1_r1(bint,array_out,array_in,trans_out,trans_in)
3574 
3575 implicit none
3576 
3577 ! Passed variables
3578 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3579 real(kind_real),intent(in) :: array_out(:) !< Output array, the rightmost dimension being the vertical
3580 real(kind_real),intent(inout) :: array_in(:) !< Input array, the rightmost dimension being the vertical
3581 logical,intent(in),optional :: trans_out !< Output array should be transposed
3582 logical,intent(in),optional :: trans_in !< Input array should be transposed
3583 
3584 ! Local variables
3585 integer :: nl_in,nl_out
3586 integer :: shp_in(1)
3587 
3588 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3589 logical :: ltrans_in,ltrans_out
3590 
3591 ! Set name
3592 
3593 
3594 ! Get instance
3595 
3596 
3597 ! Probe in
3598 
3599 
3600 ! Local flags
3601 ltrans_out = .false.
3602 if (present(trans_out)) ltrans_out = trans_out
3603 ltrans_in = .false.
3604 if (present(trans_in)) ltrans_in = trans_in
3605 
3606 ! Get number of levels
3607 # 877 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3608  nl_out = 1
3609 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3610 # 886 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3611  nl_in = 1
3612 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3613 bint%bump%geom%nl0 = nl_in
3614 
3615 ! Allocation
3616 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3617 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3618 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3619 
3620 ! Pack output data
3621  vec_out(:,1) = array_out
3622 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3623 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3624 
3625 ! Interpolate
3626 if (bint%bump%geom%same_grid) then
3627  call bint%apply_interp_ad(vec_out,vec_in)
3628 else
3629  call bint%apply_interp_ad(vec_out,vec_in_tmp)
3630  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
3631 end if
3632 
3633 ! Unpack input data
3634 shp_in = shape(array_in)
3635  array_in = vec_in(:,1)
3636 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3637 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3638 
3639 ! Release memory
3640 deallocate(vec_out)
3641 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
3642 deallocate(vec_in)
3643 
3644 ! Probe out
3645 
3646 
3647 end subroutine bint_apply_ad_r1_r1
3648 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3649 !----------------------------------------------------------------------
3650 ! Subroutine: bint_apply_ad_r1_r2
3651 !> Apply interpolation operator adjoint
3652 !----------------------------------------------------------------------
3653 subroutine bint_apply_ad_r1_r2(bint,array_out,array_in,trans_out,trans_in)
3654 
3655 implicit none
3656 
3657 ! Passed variables
3658 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3659 real(kind_real),intent(in) :: array_out(:) !< Output array, the rightmost dimension being the vertical
3660 real(kind_real),intent(inout) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
3661 logical,intent(in),optional :: trans_out !< Output array should be transposed
3662 logical,intent(in),optional :: trans_in !< Input array should be transposed
3663 
3664 ! Local variables
3665 integer :: nl_in,nl_out
3666 integer :: shp_in(2)
3667 
3668 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3669 logical :: ltrans_in,ltrans_out
3670 
3671 ! Set name
3672 
3673 
3674 ! Get instance
3675 
3676 
3677 ! Probe in
3678 
3679 
3680 ! Local flags
3681 ltrans_out = .false.
3682 if (present(trans_out)) ltrans_out = trans_out
3683 ltrans_in = .false.
3684 if (present(trans_in)) ltrans_in = trans_in
3685 
3686 ! Get number of levels
3687 # 877 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3688  nl_out = 1
3689 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3690 # 888 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3691  if (ltrans_in) then
3692  nl_in = size(array_in,1)
3693  else
3694  nl_in = size(array_in,2)
3695  end if
3696 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3697 bint%bump%geom%nl0 = nl_in
3698 
3699 ! Allocation
3700 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3701 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3702 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3703 
3704 ! Pack output data
3705  vec_out(:,1) = array_out
3706 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3707 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3708 
3709 ! Interpolate
3710 if (bint%bump%geom%same_grid) then
3711  call bint%apply_interp_ad(vec_out,vec_in)
3712 else
3713  call bint%apply_interp_ad(vec_out,vec_in_tmp)
3714  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
3715 end if
3716 
3717 ! Unpack input data
3718 shp_in = shape(array_in)
3719 
3720 # 932 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3721  if (ltrans_in) then
3722  array_in = transpose(vec_in)
3723  else
3724  array_in = vec_in
3725  end if
3726 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3727 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3728 
3729 ! Release memory
3730 deallocate(vec_out)
3731 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
3732 deallocate(vec_in)
3733 
3734 ! Probe out
3735 
3736 
3737 end subroutine bint_apply_ad_r1_r2
3738 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3739 !----------------------------------------------------------------------
3740 ! Subroutine: bint_apply_ad_r1_r3
3741 !> Apply interpolation operator adjoint
3742 !----------------------------------------------------------------------
3743 subroutine bint_apply_ad_r1_r3(bint,array_out,array_in,trans_out,trans_in)
3744 
3745 implicit none
3746 
3747 ! Passed variables
3748 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3749 real(kind_real),intent(in) :: array_out(:) !< Output array, the rightmost dimension being the vertical
3750 real(kind_real),intent(inout) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
3751 logical,intent(in),optional :: trans_out !< Output array should be transposed
3752 logical,intent(in),optional :: trans_in !< Input array should be transposed
3753 
3754 ! Local variables
3755 integer :: nl_in,nl_out
3756 integer :: shp_in(3)
3757  integer :: il
3758 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3759 logical :: ltrans_in,ltrans_out
3760 
3761 ! Set name
3762 
3763 
3764 ! Get instance
3765 
3766 
3767 ! Probe in
3768 
3769 
3770 ! Local flags
3771 ltrans_out = .false.
3772 if (present(trans_out)) ltrans_out = trans_out
3773 ltrans_in = .false.
3774 if (present(trans_in)) ltrans_in = trans_in
3775 
3776 ! Get number of levels
3777 # 877 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3778  nl_out = 1
3779 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3780 # 888 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3781  if (ltrans_in) then
3782  nl_in = size(array_in,1)
3783  else
3784  nl_in = size(array_in,3)
3785  end if
3786 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3787 bint%bump%geom%nl0 = nl_in
3788 
3789 ! Allocation
3790 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3791 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3792 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3793 
3794 ! Pack output data
3795  vec_out(:,1) = array_out
3796 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3797 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3798 
3799 ! Interpolate
3800 if (bint%bump%geom%same_grid) then
3801  call bint%apply_interp_ad(vec_out,vec_in)
3802 else
3803  call bint%apply_interp_ad(vec_out,vec_in_tmp)
3804  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
3805 end if
3806 
3807 ! Unpack input data
3808 shp_in = shape(array_in)
3809 
3810 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3811 # 939 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3812  do il=1,nl_in
3813  if (ltrans_in) then
3814  array_in(:,:,il) = transpose(reshape(vec_in(:,il),(/shp_in(2),shp_in(1)/)))
3815  else
3816  array_in(:,:,il) = reshape(vec_in(:,il),shp_in(1:2))
3817  end if
3818  end do
3819 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3820 
3821 ! Release memory
3822 deallocate(vec_out)
3823 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
3824 deallocate(vec_in)
3825 
3826 ! Probe out
3827 
3828 
3829 end subroutine bint_apply_ad_r1_r3
3830 # 958 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3831 # 837 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3832 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3833 !----------------------------------------------------------------------
3834 ! Subroutine: bint_apply_ad_r2_r1
3835 !> Apply interpolation operator adjoint
3836 !----------------------------------------------------------------------
3837 subroutine bint_apply_ad_r2_r1(bint,array_out,array_in,trans_out,trans_in)
3838 
3839 implicit none
3840 
3841 ! Passed variables
3842 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3843 real(kind_real),intent(in) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
3844 real(kind_real),intent(inout) :: array_in(:) !< Input array, the rightmost dimension being the vertical
3845 logical,intent(in),optional :: trans_out !< Output array should be transposed
3846 logical,intent(in),optional :: trans_in !< Input array should be transposed
3847 
3848 ! Local variables
3849 integer :: nl_in,nl_out
3850 integer :: shp_in(1)
3851 
3852 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3853 logical :: ltrans_in,ltrans_out
3854 
3855 ! Set name
3856 
3857 
3858 ! Get instance
3859 
3860 
3861 ! Probe in
3862 
3863 
3864 ! Local flags
3865 ltrans_out = .false.
3866 if (present(trans_out)) ltrans_out = trans_out
3867 ltrans_in = .false.
3868 if (present(trans_in)) ltrans_in = trans_in
3869 
3870 ! Get number of levels
3871 # 879 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3872  if (ltrans_out) then
3873  nl_out = size(array_out,1)
3874  else
3875  nl_out = size(array_out,2)
3876  end if
3877 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3878 # 886 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3879  nl_in = 1
3880 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3881 bint%bump%geom%nl0 = nl_in
3882 
3883 ! Allocation
3884 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3885 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3886 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3887 
3888 ! Pack output data
3889 
3890 # 904 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3891  if (ltrans_out) then
3892  vec_out = transpose(array_out)
3893  else
3894  vec_out = array_out
3895  end if
3896 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3897 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3898 
3899 ! Interpolate
3900 if (bint%bump%geom%same_grid) then
3901  call bint%apply_interp_ad(vec_out,vec_in)
3902 else
3903  call bint%apply_interp_ad(vec_out,vec_in_tmp)
3904  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
3905 end if
3906 
3907 ! Unpack input data
3908 shp_in = shape(array_in)
3909  array_in = vec_in(:,1)
3910 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3911 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3912 
3913 ! Release memory
3914 deallocate(vec_out)
3915 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
3916 deallocate(vec_in)
3917 
3918 ! Probe out
3919 
3920 
3921 end subroutine bint_apply_ad_r2_r1
3922 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3923 !----------------------------------------------------------------------
3924 ! Subroutine: bint_apply_ad_r2_r2
3925 !> Apply interpolation operator adjoint
3926 !----------------------------------------------------------------------
3927 subroutine bint_apply_ad_r2_r2(bint,array_out,array_in,trans_out,trans_in)
3928 
3929 implicit none
3930 
3931 ! Passed variables
3932 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
3933 real(kind_real),intent(in) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
3934 real(kind_real),intent(inout) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
3935 logical,intent(in),optional :: trans_out !< Output array should be transposed
3936 logical,intent(in),optional :: trans_in !< Input array should be transposed
3937 
3938 ! Local variables
3939 integer :: nl_in,nl_out
3940 integer :: shp_in(2)
3941 
3942 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
3943 logical :: ltrans_in,ltrans_out
3944 
3945 ! Set name
3946 
3947 
3948 ! Get instance
3949 
3950 
3951 ! Probe in
3952 
3953 
3954 ! Local flags
3955 ltrans_out = .false.
3956 if (present(trans_out)) ltrans_out = trans_out
3957 ltrans_in = .false.
3958 if (present(trans_in)) ltrans_in = trans_in
3959 
3960 ! Get number of levels
3961 # 879 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3962  if (ltrans_out) then
3963  nl_out = size(array_out,1)
3964  else
3965  nl_out = size(array_out,2)
3966  end if
3967 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3968 # 888 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3969  if (ltrans_in) then
3970  nl_in = size(array_in,1)
3971  else
3972  nl_in = size(array_in,2)
3973  end if
3974 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3975 bint%bump%geom%nl0 = nl_in
3976 
3977 ! Allocation
3978 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
3979 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
3980 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
3981 
3982 ! Pack output data
3983 
3984 # 904 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3985  if (ltrans_out) then
3986  vec_out = transpose(array_out)
3987  else
3988  vec_out = array_out
3989  end if
3990 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3991 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
3992 
3993 ! Interpolate
3994 if (bint%bump%geom%same_grid) then
3995  call bint%apply_interp_ad(vec_out,vec_in)
3996 else
3997  call bint%apply_interp_ad(vec_out,vec_in_tmp)
3998  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
3999 end if
4000 
4001 ! Unpack input data
4002 shp_in = shape(array_in)
4003 
4004 # 932 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4005  if (ltrans_in) then
4006  array_in = transpose(vec_in)
4007  else
4008  array_in = vec_in
4009  end if
4010 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4011 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4012 
4013 ! Release memory
4014 deallocate(vec_out)
4015 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
4016 deallocate(vec_in)
4017 
4018 ! Probe out
4019 
4020 
4021 end subroutine bint_apply_ad_r2_r2
4022 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4023 !----------------------------------------------------------------------
4024 ! Subroutine: bint_apply_ad_r2_r3
4025 !> Apply interpolation operator adjoint
4026 !----------------------------------------------------------------------
4027 subroutine bint_apply_ad_r2_r3(bint,array_out,array_in,trans_out,trans_in)
4028 
4029 implicit none
4030 
4031 ! Passed variables
4032 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4033 real(kind_real),intent(in) :: array_out(:,:) !< Output array, the rightmost dimension being the vertical
4034 real(kind_real),intent(inout) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
4035 logical,intent(in),optional :: trans_out !< Output array should be transposed
4036 logical,intent(in),optional :: trans_in !< Input array should be transposed
4037 
4038 ! Local variables
4039 integer :: nl_in,nl_out
4040 integer :: shp_in(3)
4041  integer :: il
4042 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
4043 logical :: ltrans_in,ltrans_out
4044 
4045 ! Set name
4046 
4047 
4048 ! Get instance
4049 
4050 
4051 ! Probe in
4052 
4053 
4054 ! Local flags
4055 ltrans_out = .false.
4056 if (present(trans_out)) ltrans_out = trans_out
4057 ltrans_in = .false.
4058 if (present(trans_in)) ltrans_in = trans_in
4059 
4060 ! Get number of levels
4061 # 879 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4062  if (ltrans_out) then
4063  nl_out = size(array_out,1)
4064  else
4065  nl_out = size(array_out,2)
4066  end if
4067 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4068 # 888 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4069  if (ltrans_in) then
4070  nl_in = size(array_in,1)
4071  else
4072  nl_in = size(array_in,3)
4073  end if
4074 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4075 bint%bump%geom%nl0 = nl_in
4076 
4077 ! Allocation
4078 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
4079 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
4080 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
4081 
4082 ! Pack output data
4083 
4084 # 904 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4085  if (ltrans_out) then
4086  vec_out = transpose(array_out)
4087  else
4088  vec_out = array_out
4089  end if
4090 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4091 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4092 
4093 ! Interpolate
4094 if (bint%bump%geom%same_grid) then
4095  call bint%apply_interp_ad(vec_out,vec_in)
4096 else
4097  call bint%apply_interp_ad(vec_out,vec_in_tmp)
4098  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
4099 end if
4100 
4101 ! Unpack input data
4102 shp_in = shape(array_in)
4103 
4104 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4105 # 939 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4106  do il=1,nl_in
4107  if (ltrans_in) then
4108  array_in(:,:,il) = transpose(reshape(vec_in(:,il),(/shp_in(2),shp_in(1)/)))
4109  else
4110  array_in(:,:,il) = reshape(vec_in(:,il),shp_in(1:2))
4111  end if
4112  end do
4113 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4114 
4115 ! Release memory
4116 deallocate(vec_out)
4117 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
4118 deallocate(vec_in)
4119 
4120 ! Probe out
4121 
4122 
4123 end subroutine bint_apply_ad_r2_r3
4124 # 958 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4125 # 837 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4126 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4127 !----------------------------------------------------------------------
4128 ! Subroutine: bint_apply_ad_r3_r1
4129 !> Apply interpolation operator adjoint
4130 !----------------------------------------------------------------------
4131 subroutine bint_apply_ad_r3_r1(bint,array_out,array_in,trans_out,trans_in)
4132 
4133 implicit none
4134 
4135 ! Passed variables
4136 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4137 real(kind_real),intent(in) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
4138 real(kind_real),intent(inout) :: array_in(:) !< Input array, the rightmost dimension being the vertical
4139 logical,intent(in),optional :: trans_out !< Output array should be transposed
4140 logical,intent(in),optional :: trans_in !< Input array should be transposed
4141 
4142 ! Local variables
4143 integer :: nl_in,nl_out
4144 integer :: shp_in(1)
4145  integer :: il
4146 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
4147 logical :: ltrans_in,ltrans_out
4148 
4149 ! Set name
4150 
4151 
4152 ! Get instance
4153 
4154 
4155 ! Probe in
4156 
4157 
4158 ! Local flags
4159 ltrans_out = .false.
4160 if (present(trans_out)) ltrans_out = trans_out
4161 ltrans_in = .false.
4162 if (present(trans_in)) ltrans_in = trans_in
4163 
4164 ! Get number of levels
4165 # 879 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4166  if (ltrans_out) then
4167  nl_out = size(array_out,1)
4168  else
4169  nl_out = size(array_out,3)
4170  end if
4171 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4172 # 886 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4173  nl_in = 1
4174 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4175 bint%bump%geom%nl0 = nl_in
4176 
4177 ! Allocation
4178 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
4179 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
4180 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
4181 
4182 ! Pack output data
4183 
4184 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4185 # 911 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4186  do il=1,nl_out
4187  if (ltrans_out) then
4188  vec_out(:,il) = reshape(transpose(array_out(:,:,il)),(/bint%nouta/))
4189  else
4190  vec_out(:,il) = reshape(array_out(:,:,il),(/bint%nouta/))
4191  end if
4192  end do
4193 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4194 
4195 ! Interpolate
4196 if (bint%bump%geom%same_grid) then
4197  call bint%apply_interp_ad(vec_out,vec_in)
4198 else
4199  call bint%apply_interp_ad(vec_out,vec_in_tmp)
4200  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
4201 end if
4202 
4203 ! Unpack input data
4204 shp_in = shape(array_in)
4205  array_in = vec_in(:,1)
4206 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4207 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4208 
4209 ! Release memory
4210 deallocate(vec_out)
4211 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
4212 deallocate(vec_in)
4213 
4214 ! Probe out
4215 
4216 
4217 end subroutine bint_apply_ad_r3_r1
4218 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4219 !----------------------------------------------------------------------
4220 ! Subroutine: bint_apply_ad_r3_r2
4221 !> Apply interpolation operator adjoint
4222 !----------------------------------------------------------------------
4223 subroutine bint_apply_ad_r3_r2(bint,array_out,array_in,trans_out,trans_in)
4224 
4225 implicit none
4226 
4227 ! Passed variables
4228 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4229 real(kind_real),intent(in) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
4230 real(kind_real),intent(inout) :: array_in(:,:) !< Input array, the rightmost dimension being the vertical
4231 logical,intent(in),optional :: trans_out !< Output array should be transposed
4232 logical,intent(in),optional :: trans_in !< Input array should be transposed
4233 
4234 ! Local variables
4235 integer :: nl_in,nl_out
4236 integer :: shp_in(2)
4237  integer :: il
4238 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
4239 logical :: ltrans_in,ltrans_out
4240 
4241 ! Set name
4242 
4243 
4244 ! Get instance
4245 
4246 
4247 ! Probe in
4248 
4249 
4250 ! Local flags
4251 ltrans_out = .false.
4252 if (present(trans_out)) ltrans_out = trans_out
4253 ltrans_in = .false.
4254 if (present(trans_in)) ltrans_in = trans_in
4255 
4256 ! Get number of levels
4257 # 879 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4258  if (ltrans_out) then
4259  nl_out = size(array_out,1)
4260  else
4261  nl_out = size(array_out,3)
4262  end if
4263 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4264 # 888 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4265  if (ltrans_in) then
4266  nl_in = size(array_in,1)
4267  else
4268  nl_in = size(array_in,2)
4269  end if
4270 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4271 bint%bump%geom%nl0 = nl_in
4272 
4273 ! Allocation
4274 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
4275 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
4276 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
4277 
4278 ! Pack output data
4279 
4280 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4281 # 911 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4282  do il=1,nl_out
4283  if (ltrans_out) then
4284  vec_out(:,il) = reshape(transpose(array_out(:,:,il)),(/bint%nouta/))
4285  else
4286  vec_out(:,il) = reshape(array_out(:,:,il),(/bint%nouta/))
4287  end if
4288  end do
4289 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4290 
4291 ! Interpolate
4292 if (bint%bump%geom%same_grid) then
4293  call bint%apply_interp_ad(vec_out,vec_in)
4294 else
4295  call bint%apply_interp_ad(vec_out,vec_in_tmp)
4296  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
4297 end if
4298 
4299 ! Unpack input data
4300 shp_in = shape(array_in)
4301 
4302 # 932 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4303  if (ltrans_in) then
4304  array_in = transpose(vec_in)
4305  else
4306  array_in = vec_in
4307  end if
4308 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4309 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4310 
4311 ! Release memory
4312 deallocate(vec_out)
4313 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
4314 deallocate(vec_in)
4315 
4316 ! Probe out
4317 
4318 
4319 end subroutine bint_apply_ad_r3_r2
4320 # 838 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4321 !----------------------------------------------------------------------
4322 ! Subroutine: bint_apply_ad_r3_r3
4323 !> Apply interpolation operator adjoint
4324 !----------------------------------------------------------------------
4325 subroutine bint_apply_ad_r3_r3(bint,array_out,array_in,trans_out,trans_in)
4326 
4327 implicit none
4328 
4329 ! Passed variables
4330 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4331 real(kind_real),intent(in) :: array_out(:,:,:) !< Output array, the rightmost dimension being the vertical
4332 real(kind_real),intent(inout) :: array_in(:,:,:) !< Input array, the rightmost dimension being the vertical
4333 logical,intent(in),optional :: trans_out !< Output array should be transposed
4334 logical,intent(in),optional :: trans_in !< Input array should be transposed
4335 
4336 ! Local variables
4337 integer :: nl_in,nl_out
4338 integer :: shp_in(3)
4339  integer :: il
4340 real(kind_real),allocatable :: vec_in(:,:),vec_in_tmp(:,:),vec_out(:,:)
4341 logical :: ltrans_in,ltrans_out
4342 
4343 ! Set name
4344 
4345 
4346 ! Get instance
4347 
4348 
4349 ! Probe in
4350 
4351 
4352 ! Local flags
4353 ltrans_out = .false.
4354 if (present(trans_out)) ltrans_out = trans_out
4355 ltrans_in = .false.
4356 if (present(trans_in)) ltrans_in = trans_in
4357 
4358 ! Get number of levels
4359 # 879 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4360  if (ltrans_out) then
4361  nl_out = size(array_out,1)
4362  else
4363  nl_out = size(array_out,3)
4364  end if
4365 # 885 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4366 # 888 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4367  if (ltrans_in) then
4368  nl_in = size(array_in,1)
4369  else
4370  nl_in = size(array_in,3)
4371  end if
4372 # 894 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4373 bint%bump%geom%nl0 = nl_in
4374 
4375 ! Allocation
4376 allocate(vec_out(bint%nouta,bint%bump%geom%nl0))
4377 if (.not.bint%bump%geom%same_grid) allocate(vec_in_tmp(bint%bump%geom%nc0a,bint%bump%geom%nl0))
4378 allocate(vec_in(bint%bump%geom%nmga,bint%bump%geom%nl0))
4379 
4380 ! Pack output data
4381 
4382 # 910 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4383 # 911 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4384  do il=1,nl_out
4385  if (ltrans_out) then
4386  vec_out(:,il) = reshape(transpose(array_out(:,:,il)),(/bint%nouta/))
4387  else
4388  vec_out(:,il) = reshape(array_out(:,:,il),(/bint%nouta/))
4389  end if
4390  end do
4391 # 919 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4392 
4393 ! Interpolate
4394 if (bint%bump%geom%same_grid) then
4395  call bint%apply_interp_ad(vec_out,vec_in)
4396 else
4397  call bint%apply_interp_ad(vec_out,vec_in_tmp)
4398  call bint%bump%geom%copy_c0a_to_mga(bint%bump%mpl,vec_in_tmp,vec_in)
4399 end if
4400 
4401 ! Unpack input data
4402 shp_in = shape(array_in)
4403 
4404 # 938 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4405 # 939 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4406  do il=1,nl_in
4407  if (ltrans_in) then
4408  array_in(:,:,il) = transpose(reshape(vec_in(:,il),(/shp_in(2),shp_in(1)/)))
4409  else
4410  array_in(:,:,il) = reshape(vec_in(:,il),shp_in(1:2))
4411  end if
4412  end do
4413 # 947 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4414 
4415 ! Release memory
4416 deallocate(vec_out)
4417 if (.not.bint%bump%geom%same_grid) deallocate(vec_in_tmp)
4418 deallocate(vec_in)
4419 
4420 ! Probe out
4421 
4422 
4423 end subroutine bint_apply_ad_r3_r3
4424 # 958 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4425 # 959 "/Users/miesch/JEDI/code/working_copy/public/fv3-bundle/saber/src/saber/interpolation/interpolatorbump_mod.fypp"
4426 
4427 !----------------------------------------------------------------------
4428 ! Subroutine: bint_apply_interp_ad
4429 !> Low-level routine to apply the adjoint of the interpolation operator
4430 !! to a single field on a single level
4431 !----------------------------------------------------------------------
4432 subroutine bint_apply_interp_ad(bint,array_out,array_in)
4433 
4434 implicit none
4435 
4436 ! Passed variables
4437 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4438 real(kind_real),intent(in) :: array_out(bint%nouta,bint%bump%geom%nl0) !< Field on input grid
4439 real(kind_real),intent(out) :: array_in(bint%bump%geom%nc0a,bint%bump%geom%nl0) !< Field on output grid
4440 
4441 ! Local variables
4442 integer :: ilev
4443 real(kind_real) :: array_in_ext(bint%nc0b,bint%bump%geom%nl0)
4444 
4445 ! Set name
4446 
4447 
4448 ! Get instance
4449 
4450 
4451 ! Probe in
4452 
4453 
4454 if (bint%nouta > 0) then
4455  ! Horizontal interpolation
4456  !$omp parallel do schedule(static) private(ilev)
4457  do ilev=1,bint%bump%geom%nl0
4458  call bint%h%apply_ad(bint%bump%mpl,array_out(:,ilev),array_in_ext(:,ilev))
4459  end do
4460  !$omp end parallel do
4461 else
4462  ! No output point on this task
4463  array_in_ext = zero
4464 end if
4465 
4466 ! Halo reduction
4467 call bint%com%red(bint%bump%mpl,array_in_ext,array_in)
4468 
4469 ! Probe out
4470 
4471 
4472 end subroutine bint_apply_interp_ad
4473 
4474 !----------------------------------------------------------------------
4475 ! Subroutine: bint_deallocate_outgrid
4476 !> Release memory (partial) by deallocating output grid
4477 !----------------------------------------------------------------------
4478 subroutine bint_deallocate_outgrid(bint)
4479 
4480 implicit none
4481 
4482 ! Passed variables
4483 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4484 
4485 ! Set name
4486 
4487 
4488 ! Get instance
4489 
4490 
4491 ! Probe in
4492 
4493 
4494 ! Release memory
4495 call bint%geom_out%dealloc()
4496 
4497 ! Probe out
4498 
4499 
4500 end subroutine bint_deallocate_outgrid
4501 
4502 !----------------------------------------------------------------------
4503 ! Subroutine: bint_delete
4504 !> Release all memory
4505 !----------------------------------------------------------------------
4506 subroutine bint_delete(bint)
4507 
4508 implicit none
4509 
4510 ! Passed variables
4511 class(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4512 
4513 ! Set name
4514 
4515 
4516 ! Get instance
4517 
4518 
4519 ! Probe in
4520 
4521 
4522 ! Release memory
4523 call bint%deallocate_outgrid()
4524 call bint%h%dealloc()
4525 call bint%com%dealloc()
4526 call bint%bump%dealloc()
4527 
4528 ! Probe out
4529 
4530 
4531 ! Release probe instance
4532 
4533 
4534 end subroutine bint_delete
4535 
4536 !----------------------------------------------------------------------
4537 ! Subroutine: bint_dummy_final
4538 !> Dummy finalization
4539 !----------------------------------------------------------------------
4540 subroutine bint_dummy_final(bint)
4541 
4542 implicit none
4543 
4544 ! Passed variables
4545 type(bump_interpolator),intent(inout) :: bint !< BUMP interpolator
4546 
4547 ! Set name
4548 
4549 
4550 ! Get instance
4551 
4552 
4553 ! Probe in
4554 
4555 
4556 ! Dummy action to avoid compiler warning
4557 bint%dummy_logical = .false.
4558 
4559 ! Probe out
4560 
4561 
4562 end subroutine bint_dummy_final
4563 
4564 end module interpolatorbump_mod
Generic ranks, dimensions and types.
integer, parameter max_string
Maximum string size.
subroutine bint_apply_real_r1_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_dummy_final(bint)
Dummy finalization.
subroutine bint_apply_ad_r3_r3(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply_logical_r1_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_int_r1_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_int_r2_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_delete(bint)
Release all memory.
subroutine bint_apply_ad_r1_r3(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_driver(bint, mpl, rng, nam, geom)
Initialize BUMP to perform interpolation.
subroutine bint_apply_int_r2_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_interp_int(bint, array_in, array_out, nn)
Low-level routine to apply the interpolation to a single field on a single level.
subroutine bint_apply_ad_r3_r1(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply_real_r3_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_logical_r2_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_int_r3_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_real_r2_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_logical_r3_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_ad_r1_r1(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply_int_r1_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_logical_r1_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_logical_r2_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_ad_r2_r3(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply(bint, fieldset_in, fieldset_out)
Apply interpolation If the fields that constitute the fieldset are not already allocated by the calle...
subroutine bint_apply_interp_logical(bint, array_in, array_out, nn)
Low-level routine to apply the interpolation to a single field on a single level.
subroutine bint_apply_logical_r3_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_ad(bint, fieldset_out, fieldset_in)
Apply interpolator operator adjoint The caller can optionally pass this arguement as an empty fieldse...
subroutine bint_apply_ad_r2_r1(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply_int_r3_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_int_r3_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_ad_r3_r2(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply_logical_r1_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_int_r2_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_deallocate_outgrid(bint)
Release memory (partial) by deallocating output grid.
subroutine bint_init(bint, comm, lon1d_in, lat1d_in, lon_in, lat_in, afunctionspace_in, lon1d_out, lat1d_out, lon_out, lat_out, afunctionspace_out, nl, masks, config)
Initialize interpolation object The input and output fields are ATLAS_FieldSet objects that are assum...
subroutine bint_apply_real_r1_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_logical_r3_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_interp_real(bint, array_in, array_out, nn)
Low-level routine to apply the interpolation to a single field on a single level.
subroutine bint_apply_logical_r2_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_ad_r1_r2(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply_real_r3_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_ad_r2_r2(bint, array_out, array_in, trans_out, trans_in)
Apply interpolation operator adjoint.
subroutine bint_apply_real_r2_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_int_r1_r2(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_interp_ad(bint, array_out, array_in)
Low-level routine to apply the adjoint of the interpolation operator to a single field on a single le...
subroutine bint_apply_real_r1_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_real_r3_r3(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
subroutine bint_apply_real_r2_r1(bint, array_in, array_out, trans_in, trans_out, nn)
Apply interpolation.
Generic ranks, dimensions and types.
Definition: tools_atlas.F90:42
Subroutines/functions list.
Definition: tools_const.F90:31
real(kind_real), parameter, public three
Three.
Definition: tools_const.F90:44
real(kind_real), parameter, public pi
Pi.
Definition: tools_const.F90:51
real(kind_real), parameter, public deg2rad
Degree to radian.
Definition: tools_const.F90:52
real(kind_real), parameter, public zero
Zero.
Definition: tools_const.F90:37
real(kind_real), parameter, public rad2deg
Radian to degree.
Definition: tools_const.F90:53
real(kind_real), parameter, public hundred
Hundred.
Definition: tools_const.F90:49
Subroutines/functions list.
Definition: tools_func.F90:31
Kinds definition.
Definition: tools_kinds.F90:9
integer, parameter, public kind_int
Integer kind.
Definition: tools_kinds.F90:17
integer, parameter, public kind_real
Real kind alias for the whole code.
Definition: tools_kinds.F90:25
Generic ranks, dimensions and types.
Definition: tools_repro.F90:42
real(kind_real), public rth
Reproducibility threshold.
Definition: tools_repro.F90:51
Subroutines/functions list.
Definition: type_bump.F90:31
Generic ranks, dimensions and types.
Definition: type_com.F90:42
Subroutines/functions list.
Generic ranks, dimensions and types.
Definition: type_geom.F90:42
Subroutines/functions list.
Definition: type_linop.F90:31
Subroutines/functions list.
Definition: type_mesh.F90:31
Generic ranks, dimensions and types.
Definition: type_mpl.F90:42
Subroutines/functions list.
Definition: type_nam.F90:31
Generic ranks, dimensions and types.
Definition: type_rng.F90:42