6 use horiz_interp_mod,
only : horiz_interp_type
8 use mom_io,
only : fieldtype, write_field
9 use mpp_domains_mod,
only : domain2d
10 use fms_mod,
only : mpp_chksum
11 use time_manager_mod,
only : time_type
12 use time_interp_external_mod,
only : time_interp_external
25 module procedure rotated_mpp_chksum_real_0d
26 module procedure rotated_mpp_chksum_real_1d
27 module procedure rotated_mpp_chksum_real_2d
28 module procedure rotated_mpp_chksum_real_3d
29 module procedure rotated_mpp_chksum_real_4d
34 module procedure rotated_write_field_real_0d
35 module procedure rotated_write_field_real_1d
36 module procedure rotated_write_field_real_2d
37 module procedure rotated_write_field_real_3d
38 module procedure rotated_write_field_real_4d
43 module procedure rotated_time_interp_external_0d
44 module procedure rotated_time_interp_external_2d
45 module procedure rotated_time_interp_external_3d
56 function rotated_mpp_chksum_real_0d(field, pelist, mask_val, turns) &
58 real,
intent(in) :: field
59 integer,
optional,
intent(in) :: pelist(:)
60 real,
optional,
intent(in) :: mask_val
61 integer,
optional,
intent(in) :: turns
65 call mom_error(fatal,
"Rotation not supported for 0d fields.")
67 chksum = mpp_chksum(field, pelist=pelist, mask_val=mask_val)
68 end function rotated_mpp_chksum_real_0d
73 function rotated_mpp_chksum_real_1d(field, pelist, mask_val, turns) &
75 real,
intent(in) :: field(:)
76 integer,
optional,
intent(in) :: pelist(:)
77 real,
optional,
intent(in) :: mask_val
78 integer,
optional,
intent(in) :: turns
82 call mom_error(fatal,
"Rotation not supported for 1d fields.")
84 chksum = mpp_chksum(field, pelist=pelist, mask_val=mask_val)
85 end function rotated_mpp_chksum_real_1d
89 function rotated_mpp_chksum_real_2d(field, pelist, mask_val, turns) &
91 real,
intent(in) :: field(:,:)
92 integer,
optional,
intent(in) :: pelist(:)
93 real,
optional,
intent(in) :: mask_val
94 integer,
optional,
intent(in) :: turns
97 real,
allocatable :: field_rot(:,:)
101 if (
present(turns)) &
102 qturns = modulo(turns, 4)
104 if (qturns == 0)
then
105 chksum = mpp_chksum(field, pelist=pelist, mask_val=mask_val)
109 chksum = mpp_chksum(field_rot, pelist=pelist, mask_val=mask_val)
110 deallocate(field_rot)
112 end function rotated_mpp_chksum_real_2d
116 function rotated_mpp_chksum_real_3d(field, pelist, mask_val, turns) &
118 real,
intent(in) :: field(:,:,:)
119 integer,
optional,
intent(in) :: pelist(:)
120 real,
optional,
intent(in) :: mask_val
121 integer,
optional,
intent(in) :: turns
124 real,
allocatable :: field_rot(:,:,:)
128 if (
present(turns)) &
129 qturns = modulo(turns, 4)
131 if (qturns == 0)
then
132 chksum = mpp_chksum(field, pelist=pelist, mask_val=mask_val)
136 chksum = mpp_chksum(field_rot, pelist=pelist, mask_val=mask_val)
137 deallocate(field_rot)
139 end function rotated_mpp_chksum_real_3d
143 function rotated_mpp_chksum_real_4d(field, pelist, mask_val, turns) &
145 real,
intent(in) :: field(:,:,:,:)
146 integer,
optional,
intent(in) :: pelist(:)
147 real,
optional,
intent(in) :: mask_val
148 integer,
optional,
intent(in) :: turns
151 real,
allocatable :: field_rot(:,:,:,:)
155 if (
present(turns)) &
156 qturns = modulo(turns, 4)
158 if (qturns == 0)
then
159 chksum = mpp_chksum(field, pelist=pelist, mask_val=mask_val)
163 chksum = mpp_chksum(field_rot, pelist=pelist, mask_val=mask_val)
164 deallocate(field_rot)
166 end function rotated_mpp_chksum_real_4d
176 subroutine rotated_write_field_real_0d(io_unit, field_md, field, tstamp, turns)
177 integer,
intent(in) :: io_unit
178 type(fieldtype),
intent(in) :: field_md
179 real,
intent(inout) :: field
180 real,
optional,
intent(in) :: tstamp
181 integer,
optional,
intent(in) :: turns
183 if (
present(turns)) &
184 call mom_error(fatal,
"Rotation not supported for 0d fields.")
186 call write_field(io_unit, field_md, field, tstamp=tstamp)
187 end subroutine rotated_write_field_real_0d
192 subroutine rotated_write_field_real_1d(io_unit, field_md, field, tstamp, turns)
193 integer,
intent(in) :: io_unit
194 type(fieldtype),
intent(in) :: field_md
195 real,
intent(inout) :: field(:)
196 real,
optional,
intent(in) :: tstamp
197 integer,
optional,
intent(in) :: turns
199 if (
present(turns)) &
200 call mom_error(fatal,
"Rotation not supported for 0d fields.")
202 call write_field(io_unit, field_md, field, tstamp=tstamp)
203 end subroutine rotated_write_field_real_1d
207 subroutine rotated_write_field_real_2d(io_unit, field_md, domain, field, &
208 tstamp, tile_count, default_data, turns)
209 integer,
intent(in) :: io_unit
210 type(fieldtype),
intent(in) :: field_md
211 type(domain2d),
intent(inout) :: domain
212 real,
intent(inout) :: field(:,:)
213 real,
optional,
intent(in) :: tstamp
214 integer,
optional,
intent(in) :: tile_count
215 real,
optional,
intent(in) :: default_data
216 integer,
optional,
intent(in) :: turns
218 real,
allocatable :: field_rot(:,:)
222 if (
present(turns)) &
223 qturns = modulo(turns, 4)
225 if (qturns == 0)
then
226 call write_field(io_unit, field_md, domain, field, tstamp=tstamp, &
227 tile_count=tile_count, default_data=default_data)
231 call write_field(io_unit, field_md, domain, field_rot, tstamp=tstamp, &
232 tile_count=tile_count, default_data=default_data)
233 deallocate(field_rot)
235 end subroutine rotated_write_field_real_2d
239 subroutine rotated_write_field_real_3d(io_unit, field_md, domain, field, &
240 tstamp, tile_count, default_data, turns)
241 integer,
intent(in) :: io_unit
242 type(fieldtype),
intent(in) :: field_md
243 type(domain2d),
intent(inout) :: domain
244 real,
intent(inout) :: field(:,:,:)
245 real,
optional,
intent(in) :: tstamp
246 integer,
optional,
intent(in) :: tile_count
247 real,
optional,
intent(in) :: default_data
248 integer,
optional,
intent(in) :: turns
250 real,
allocatable :: field_rot(:,:,:)
254 if (
present(turns)) &
255 qturns = modulo(turns, 4)
257 if (qturns == 0)
then
258 call write_field(io_unit, field_md, domain, field, tstamp=tstamp, &
259 tile_count=tile_count, default_data=default_data)
263 call write_field(io_unit, field_md, domain, field_rot, tstamp=tstamp, &
264 tile_count=tile_count, default_data=default_data)
265 deallocate(field_rot)
267 end subroutine rotated_write_field_real_3d
271 subroutine rotated_write_field_real_4d(io_unit, field_md, domain, field, &
272 tstamp, tile_count, default_data, turns)
273 integer,
intent(in) :: io_unit
274 type(fieldtype),
intent(in) :: field_md
275 type(domain2d),
intent(inout) :: domain
276 real,
intent(inout) :: field(:,:,:,:)
277 real,
optional,
intent(in) :: tstamp
278 integer,
optional,
intent(in) :: tile_count
279 real,
optional,
intent(in) :: default_data
280 integer,
optional,
intent(in) :: turns
282 real,
allocatable :: field_rot(:,:,:,:)
286 if (
present(turns)) &
287 qturns = modulo(turns, 4)
289 if (qturns == 0)
then
290 call write_field(io_unit, field_md, domain, field, tstamp=tstamp, &
291 tile_count=tile_count, default_data=default_data)
295 call write_field(io_unit, field_md, domain, field_rot, tstamp=tstamp, &
296 tile_count=tile_count, default_data=default_data)
297 deallocate(field_rot)
299 end subroutine rotated_write_field_real_4d
305 subroutine rotated_time_interp_external_0d(fms_id, time, data_in, verbose, &
307 integer,
intent(in) :: fms_id
308 type(time_type),
intent(in) :: time
309 real,
intent(inout) :: data_in
310 logical,
intent(in),
optional :: verbose
311 integer,
intent(in),
optional :: turns
313 if (
present(turns)) &
314 call mom_error(fatal,
"Rotation not supported for 0d fields.")
316 call time_interp_external(fms_id, time, data_in, verbose=verbose)
317 end subroutine rotated_time_interp_external_0d
320 subroutine rotated_time_interp_external_2d(fms_id, time, data_in, interp, &
321 verbose, horz_interp, mask_out, is_in, ie_in, js_in, je_in, window_id, &
323 integer,
intent(in) :: fms_id
324 type(time_type),
intent(in) :: time
325 real,
dimension(:,:),
intent(inout) :: data_in
326 integer,
intent(in),
optional :: interp
327 logical,
intent(in),
optional :: verbose
328 type(horiz_interp_type),
intent(in),
optional :: horz_interp
329 logical,
dimension(:,:),
intent(out),
optional :: mask_out
330 integer,
intent(in),
optional :: is_in, ie_in, js_in, je_in
331 integer,
intent(in),
optional :: window_id
332 integer,
intent(in),
optional :: turns
334 real,
allocatable :: data_pre(:,:)
338 if (
present(mask_out)) &
339 call mom_error(fatal,
"Rotation of masked output not yet support")
342 if (
present(turns)) &
343 qturns = modulo(turns, 4)
346 if (qturns == 0)
then
347 call time_interp_external(fms_id, time, data_in, interp=interp, &
348 verbose=verbose, horz_interp=horz_interp, mask_out=mask_out, &
349 is_in=is_in, ie_in=ie_in, js_in=js_in, je_in=je_in, &
353 call time_interp_external(fms_id, time, data_pre, interp=interp, &
354 verbose=verbose, horz_interp=horz_interp, mask_out=mask_out, &
355 is_in=is_in, ie_in=ie_in, js_in=js_in, je_in=je_in, &
360 end subroutine rotated_time_interp_external_2d
364 subroutine rotated_time_interp_external_3d(fms_id, time, data_in, interp, &
365 verbose, horz_interp, mask_out, is_in, ie_in, js_in, je_in, window_id, &
367 integer,
intent(in) :: fms_id
368 type(time_type),
intent(in) :: time
369 real,
dimension(:,:,:),
intent(inout) :: data_in
370 integer,
intent(in),
optional :: interp
371 logical,
intent(in),
optional :: verbose
372 type(horiz_interp_type),
intent(in),
optional :: horz_interp
373 logical,
dimension(:,:,:),
intent(out),
optional :: mask_out
374 integer,
intent(in),
optional :: is_in, ie_in, js_in, je_in
375 integer,
intent(in),
optional :: window_id
376 integer,
intent(in),
optional :: turns
378 real,
allocatable :: data_pre(:,:,:)
382 if (
present(mask_out)) &
383 call mom_error(fatal,
"Rotation of masked output not yet support")
386 if (
present(turns)) &
387 qturns = modulo(turns, 4)
389 if (qturns == 0)
then
390 call time_interp_external(fms_id, time, data_in, interp=interp, &
391 verbose=verbose, horz_interp=horz_interp, mask_out=mask_out, &
392 is_in=is_in, ie_in=ie_in, js_in=js_in, je_in=je_in, &
396 call time_interp_external(fms_id, time, data_pre, interp=interp, &
397 verbose=verbose, horz_interp=horz_interp, mask_out=mask_out, &
398 is_in=is_in, ie_in=ie_in, js_in=js_in, je_in=je_in, &
403 end subroutine rotated_time_interp_external_3d