Skip to content

Commit d380f1d

Browse files
nikizadehgfdlmarshallward
authored andcommitted
An alternate fix to class(*) issues with FMS 2022-01
- This update is an alternate to PR#66 to fix the issues with passing read arguments to subroutines receiving class(*) - This tries to show that there are no inherent issues with passing a real and receiving it as class(*). Rather the root cause of the issues is some of these arguments are optional and are being passed to FMS even thought they are not present! Then they are trapped in FMS diag_manager inside a SELECT TYPE statement and the compiler is not smart enough to know that they are absent and bombs. 
1 parent 8ecf333 commit d380f1d

2 files changed

Lines changed: 74 additions & 12 deletions

File tree

config_src/infra/FMS1/MOM_diag_manager_infra.F90

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,15 @@ integer function register_static_field_infra(module_name, field_name, axes, long
236236
integer, optional, intent(in) :: area !< Diagnostic ID of the field containing the area attribute
237237
integer, optional, intent(in) :: volume !< Diagnostic ID of the field containing the volume attribute
238238

239-
register_static_field_infra = register_static_field_fms(module_name, field_name, axes, long_name, units,&
240-
& missing_value, range, mask_variant, standard_name, dynamic=.false.,do_not_log=do_not_log, &
239+
if(present(missing_value) .or. present(range)) then
240+
register_static_field_infra = register_static_field_fms(module_name, field_name, axes, long_name, units,&
241+
& missing_value, range, mask_variant=mask_variant, standard_name=standard_name, dynamic=.false.,&
242+
do_not_log=do_not_log, interp_method=interp_method,tile_count=tile_count, area=area, volume=volume)
243+
else
244+
register_static_field_infra = register_static_field_fms(module_name, field_name, axes, long_name, units,&
245+
& mask_variant=mask_variant, standard_name=standard_name, dynamic=.false.,do_not_log=do_not_log, &
241246
interp_method=interp_method,tile_count=tile_count, area=area, volume=volume)
247+
endif
242248
end function register_static_field_infra
243249

244250
!> Returns true if the argument data are successfully passed to a diagnostic manager
@@ -267,7 +273,20 @@ logical function send_data_infra_1d(diag_field_id, field, is_in, ie_in, time, ma
267273
character(len=*), optional, intent(out) :: err_msg !< A log indicating the status of the post upon
268274
!! returning to the calling routine
269275

270-
send_data_infra_1d = send_data_fms(diag_field_id, field, time, is_in, mask, rmask, ie_in, weight, err_msg)
276+
if(present(rmask) .or. present(weight)) then
277+
if(present(rmask) .and. present(weight)) then
278+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, mask=mask, rmask=rmask, ie_in=ie_in,&
279+
weight=weight, err_msg=err_msg)
280+
elseif(present(rmask)) then
281+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, mask=mask, rmask=rmask, ie_in=ie_in,&
282+
err_msg=err_msg)
283+
elseif(present(weight)) then
284+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, ie_in=ie_in, weight=weight,&
285+
err_msg=err_msg)
286+
endif
287+
else
288+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, ie_in=ie_in, err_msg=err_msg)
289+
endif
271290

272291
end function send_data_infra_1d
273292

@@ -289,9 +308,21 @@ logical function send_data_infra_2d(diag_field_id, field, is_in, ie_in, js_in, j
289308
character(len=*), optional, intent(out) :: err_msg !< A log indicating the status of the post upon
290309
!! returning to the calling routine
291310

292-
send_data_infra_2d = send_data_fms(diag_field_id, field, time, is_in, js_in, mask, &
293-
rmask, ie_in, je_in, weight, err_msg)
294-
311+
if(present(rmask) .or. present(weight)) then
312+
if(present(rmask) .and. present(weight)) then
313+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
314+
rmask=rmask, ie_in=ie_in, je_in=je_in, weight=weight, err_msg=err_msg)
315+
elseif(present(rmask)) then
316+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
317+
rmask=rmask, ie_in=ie_in, je_in=je_in, err_msg=err_msg)
318+
elseif(present(weight)) then
319+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
320+
ie_in=ie_in, je_in=je_in, weight=weight, err_msg=err_msg)
321+
endif
322+
else
323+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
324+
ie_in=ie_in, je_in=je_in, err_msg=err_msg)
325+
endif
295326
end function send_data_infra_2d
296327

297328
!> Returns true if the argument data are successfully passed to a diagnostic manager

config_src/infra/FMS2/MOM_diag_manager_infra.F90

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,15 @@ integer function register_static_field_infra(module_name, field_name, axes, long
236236
integer, optional, intent(in) :: area !< Diagnostic ID of the field containing the area attribute
237237
integer, optional, intent(in) :: volume !< Diagnostic ID of the field containing the volume attribute
238238

239-
register_static_field_infra = register_static_field_fms(module_name, field_name, axes, long_name, units,&
240-
& missing_value, range, mask_variant, standard_name, dynamic=.false.,do_not_log=do_not_log, &
239+
if(present(missing_value) .or. present(range)) then
240+
register_static_field_infra = register_static_field_fms(module_name, field_name, axes, long_name, units,&
241+
& missing_value, range, mask_variant=mask_variant, standard_name=standard_name, dynamic=.false.,&
242+
do_not_log=do_not_log, interp_method=interp_method,tile_count=tile_count, area=area, volume=volume)
243+
else
244+
register_static_field_infra = register_static_field_fms(module_name, field_name, axes, long_name, units,&
245+
& mask_variant=mask_variant, standard_name=standard_name, dynamic=.false.,do_not_log=do_not_log, &
241246
interp_method=interp_method,tile_count=tile_count, area=area, volume=volume)
247+
endif
242248
end function register_static_field_infra
243249

244250
!> Returns true if the argument data are successfully passed to a diagnostic manager
@@ -267,7 +273,20 @@ logical function send_data_infra_1d(diag_field_id, field, is_in, ie_in, time, ma
267273
character(len=*), optional, intent(out) :: err_msg !< A log indicating the status of the post upon
268274
!! returning to the calling routine
269275

270-
send_data_infra_1d = send_data_fms(diag_field_id, field, time, is_in, mask, rmask, ie_in, weight, err_msg)
276+
if(present(rmask) .or. present(weight)) then
277+
if(present(rmask) .and. present(weight)) then
278+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, mask=mask, rmask=rmask, ie_in=ie_in,&
279+
weight=weight, err_msg=err_msg)
280+
elseif(present(rmask)) then
281+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, mask=mask, rmask=rmask, ie_in=ie_in,&
282+
err_msg=err_msg)
283+
elseif(present(weight)) then
284+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, ie_in=ie_in, weight=weight,&
285+
err_msg=err_msg)
286+
endif
287+
else
288+
send_data_infra_1d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, ie_in=ie_in, err_msg=err_msg)
289+
endif
271290

272291
end function send_data_infra_1d
273292

@@ -289,9 +308,21 @@ logical function send_data_infra_2d(diag_field_id, field, is_in, ie_in, js_in, j
289308
character(len=*), optional, intent(out) :: err_msg !< A log indicating the status of the post upon
290309
!! returning to the calling routine
291310

292-
send_data_infra_2d = send_data_fms(diag_field_id, field, time, is_in, js_in, mask, &
293-
rmask, ie_in, je_in, weight, err_msg)
294-
311+
if(present(rmask) .or. present(weight)) then
312+
if(present(rmask) .and. present(weight)) then
313+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
314+
rmask=rmask, ie_in=ie_in, je_in=je_in, weight=weight, err_msg=err_msg)
315+
elseif(present(rmask)) then
316+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
317+
rmask=rmask, ie_in=ie_in, je_in=je_in, err_msg=err_msg)
318+
elseif(present(weight)) then
319+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
320+
ie_in=ie_in, je_in=je_in, weight=weight, err_msg=err_msg)
321+
endif
322+
else
323+
send_data_infra_2d = send_data_fms(diag_field_id, field, time=time, is_in=is_in, js_in=js_in, mask=mask, &
324+
ie_in=ie_in, je_in=je_in, err_msg=err_msg)
325+
endif
295326
end function send_data_infra_2d
296327

297328
!> Returns true if the argument data are successfully passed to a diagnostic manager

0 commit comments

Comments
 (0)