36 use fms_mod,
only: fatal,
stdout
38 use platform_mod,
only: r4_kind, r8_kind, fms_path_len
71 character(len=128),
public :: fm_util_default_caller =
' '
77 character(len=48),
parameter :: mod_name =
'fm_util_mod'
83 character(len=128) :: save_default_caller =
' '
84 character(len=128) :: default_good_name_list =
' '
85 character(len=128) :: save_default_good_name_list =
' '
86 logical :: default_no_overwrite = .false.
87 logical :: save_default_no_overwrite = .false.
88 character(len=FMS_PATH_LEN) :: save_current_list
89 character(len=FMS_PATH_LEN) :: save_path
90 character(len=FMS_PATH_LEN) :: save_name
92 #include<file_version.h>
101 module procedure fm_util_set_value_real_r4
102 module procedure fm_util_set_value_real_r8
106 module procedure fm_util_set_value_real_array_r4
107 module procedure fm_util_set_value_real_array_r8
113 module procedure fm_util_set_value_real_array_r4
114 module procedure fm_util_set_value_real_array_r8
117 module procedure fm_util_set_value_real_r4
118 module procedure fm_util_set_value_real_r8
145 character(len=*),
intent(in) :: caller
155 save_default_caller = fm_util_default_caller
161 if (caller .eq.
' ')
then
162 fm_util_default_caller =
' '
164 fm_util_default_caller =
'[' // trim(caller) //
']'
191 fm_util_default_caller = save_default_caller
192 save_default_caller =
' '
210 character(len=*),
intent(in) :: good_name_list
220 save_default_good_name_list = default_good_name_list
226 default_good_name_list = good_name_list
252 default_good_name_list = save_default_good_name_list
253 save_default_good_name_list =
' '
271 logical,
intent(in) :: no_overwrite
281 save_default_no_overwrite = default_no_overwrite
287 default_no_overwrite = no_overwrite
313 default_no_overwrite = save_default_no_overwrite
314 save_default_no_overwrite = .false.
331 character(len=*),
intent(in) :: list
332 character(len=*),
intent(in),
dimension(:) :: good_fields
333 character(len=*),
intent(in),
optional :: caller
339 character(len=48),
parameter :: sub_name =
'fm_util_check_for_bad_fields'
345 logical :: fm_success
348 integer :: list_length
349 integer :: good_length
350 character(len=fm_type_name_len) :: typ
351 character(len=fm_field_name_len) :: name
353 character(len=256) :: error_header
354 character(len=256) :: warn_header
355 character(len=256) :: note_header
356 character(len=128) :: caller_str
365 if (
present(caller))
then
366 caller_str =
'[' // trim(caller) //
']'
368 caller_str = fm_util_default_caller
371 error_header =
'==>Error from ' // trim(mod_name) // &
372 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
373 warn_header =
'==>Warning from ' // trim(mod_name) // &
374 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
375 note_header =
'==>Note from ' // trim(mod_name) // &
376 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
382 if (list .eq.
' ')
then
383 write (out_unit,*) trim(error_header) //
' Empty list given'
384 call mpp_error(fatal, trim(error_header) //
' Empty list given')
391 if (fm_get_type(list) .ne.
'list')
then
392 write (out_unit,*) trim(error_header) //
' Not given a list: ' // trim(list)
393 call mpp_error(fatal, trim(error_header) //
' Not given a list: ' // trim(list))
400 list_length = fm_get_length(list)
401 if (list_length .lt. 0)
then
402 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(list))
409 good_length =
size(good_fields)
411 if (list_length .lt. good_length)
then
419 write (out_unit,*) trim(error_header),
' List length < number of good fields (', &
420 list_length,
' < ', good_length,
') in list ', trim(list)
423 write (out_unit,*)
'The list contains the following fields:'
426 write (out_unit,*)
'The supposed list of good fields is:'
427 do i = 1, good_length
428 if (
fm_exists(trim(list) //
'/' // good_fields(i)))
then
429 write (out_unit,*)
'List field: "', trim(good_fields(i)),
'"'
431 write (out_unit,*)
'EXTRA good field: "', trim(good_fields(i)),
'"'
436 call mpp_error(fatal, trim(error_header) // &
437 ' List length < number of good fields for list: ' // trim(list))
439 elseif (list_length .gt. good_length)
then
447 write (out_unit,*) trim(warn_header),
'List length > number of good fields (', &
448 list_length,
' > ', good_length,
') in list ', trim(list)
450 write (out_unit,*) trim(error_header),
' Start of list of fields'
453 do i = 1, good_length
454 found = found .or. (name .eq. good_fields(i))
457 write (out_unit,*)
'Good list field: "', trim(name),
'"'
459 write (out_unit,*)
'EXTRA list field: "', trim(name),
'"'
462 write (out_unit,*) trim(error_header),
' End of list of fields'
464 call mpp_error(fatal, trim(error_header) // &
465 ' List length > number of good fields for list: ' // trim(list))
489 integer :: field_length
495 character(len=*),
intent(in) :: name
496 character(len=*),
intent(in),
optional :: caller
502 character(len=48),
parameter :: sub_name =
'fm_util_get_length'
508 character(len=256) :: error_header
509 character(len=256) :: warn_header
510 character(len=256) :: note_header
511 character(len=128) :: caller_str
517 if (
present(caller))
then
518 caller_str =
'[' // trim(caller) //
']'
520 caller_str = fm_util_default_caller
523 error_header =
'==>Error from ' // trim(mod_name) // &
524 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
525 warn_header =
'==>Warning from ' // trim(mod_name) // &
526 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
527 note_header =
'==>Note from ' // trim(mod_name) // &
528 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
534 if (name .eq.
' ')
then
535 call mpp_error(fatal, trim(error_header) //
' Empty name given')
542 field_length = fm_get_length(name)
543 if (field_length .lt. 0)
then
544 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
569 character(len=*),
intent(in) :: name
570 character(len=*),
intent(in) :: string
571 character(len=*),
intent(in),
optional :: caller
577 character(len=48),
parameter :: sub_name =
'fm_util_get_index_string'
583 character(len=256) :: error_header
584 character(len=256) :: warn_header
585 character(len=256) :: note_header
586 character(len=128) :: caller_str
587 character(len=32) :: index_str
588 character(len=fm_type_name_len) :: fm_type
589 character(len=fm_string_len) :: fm_string
597 if (
present(caller))
then
598 caller_str =
'[' // trim(caller) //
']'
600 caller_str = fm_util_default_caller
603 error_header =
'==>Error from ' // trim(mod_name) // &
604 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
605 warn_header =
'==>Warning from ' // trim(mod_name) // &
606 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
607 note_header =
'==>Note from ' // trim(mod_name) // &
608 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
614 if (name .eq.
' ')
then
615 call mpp_error(fatal, trim(error_header) //
' Empty name given')
623 fm_type = fm_get_type(name)
624 if (fm_type .eq.
'string')
then
625 length = fm_get_length(name)
626 if (length .lt. 0)
then
627 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
629 if (length .gt. 0)
then
631 if (.not.
fm_get_value(name, fm_string, index = i))
then
632 write (index_str,*)
'(', i,
')'
633 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name) // trim(index_str))
635 if (fm_string .eq. string)
then
641 elseif (fm_type .eq.
' ')
then
642 call mpp_error(fatal, trim(error_header) //
' Array does not exist: ' // trim(name))
644 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
673 character(len=*),
intent(in) :: name
674 character(len=*),
intent(in),
optional :: caller
680 character(len=48),
parameter :: sub_name =
'fm_util_get_index_list'
686 character(len=256) :: error_header
687 character(len=256) :: warn_header
688 character(len=256) :: note_header
689 character(len=128) :: caller_str
690 character(len=fm_type_name_len) :: fm_type
696 if (
present(caller))
then
697 caller_str =
'[' // trim(caller) //
']'
699 caller_str = fm_util_default_caller
702 error_header =
'==>Error from ' // trim(mod_name) // &
703 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
704 warn_header =
'==>Warning from ' // trim(mod_name) // &
705 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
706 note_header =
'==>Note from ' // trim(mod_name) // &
707 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
713 if (name .eq.
' ')
then
714 call mpp_error(fatal, trim(error_header) //
' Empty name given')
722 fm_type = fm_get_type(name)
723 if (fm_type .eq.
'list')
then
724 fm_index = fm_get_index(name)
725 if (fm_index .le. 0)
then
726 call mpp_error(fatal, trim(error_header) //
' List does not exist: ' // trim(name))
728 elseif (fm_type .eq.
' ')
then
729 call mpp_error(fatal, trim(error_header) //
' List does not exist: ' // trim(name))
731 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
752 integer,
pointer,
dimension(:) :: array
758 character(len=*),
intent(in) :: name
759 character(len=*),
intent(in),
optional :: caller
765 character(len=48),
parameter :: sub_name =
'fm_util_get_integer_array'
771 character(len=256) :: error_header
772 character(len=256) :: warn_header
773 character(len=256) :: note_header
774 character(len=128) :: caller_str
775 character(len=32) :: index_str
776 character(len=fm_type_name_len) :: fm_type
786 if (
present(caller))
then
787 caller_str =
'[' // trim(caller) //
']'
789 caller_str = fm_util_default_caller
792 error_header =
'==>Error from ' // trim(mod_name) // &
793 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
794 warn_header =
'==>Warning from ' // trim(mod_name) // &
795 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
796 note_header =
'==>Note from ' // trim(mod_name) // &
797 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
803 if (name .eq.
' ')
then
804 call mpp_error(fatal, trim(error_header) //
' Empty name given')
807 fm_type = fm_get_type(name)
808 if (fm_type .eq.
'integer')
then
809 length = fm_get_length(name)
810 if (length .lt. 0)
then
811 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
813 if (length .gt. 0)
then
814 allocate(array(length))
817 write (index_str,*)
'(', i,
')'
818 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name) // trim(index_str))
822 elseif (fm_type .eq.
' ')
then
823 call mpp_error(fatal, trim(error_header) //
' Array does not exist: ' // trim(name))
825 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
844 logical,
pointer,
dimension(:) :: array
850 character(len=*),
intent(in) :: name
851 character(len=*),
intent(in),
optional :: caller
857 character(len=48),
parameter :: sub_name =
'fm_util_get_logical_array'
863 character(len=256) :: error_header
864 character(len=256) :: warn_header
865 character(len=256) :: note_header
866 character(len=128) :: caller_str
867 character(len=32) :: index_str
868 character(len=fm_type_name_len) :: fm_type
878 if (
present(caller))
then
879 caller_str =
'[' // trim(caller) //
']'
881 caller_str = fm_util_default_caller
884 error_header =
'==>Error from ' // trim(mod_name) // &
885 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
886 warn_header =
'==>Warning from ' // trim(mod_name) // &
887 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
888 note_header =
'==>Note from ' // trim(mod_name) // &
889 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
895 if (name .eq.
' ')
then
896 call mpp_error(fatal, trim(error_header) //
' Empty name given')
899 fm_type = fm_get_type(name)
900 if (fm_type .eq.
'logical')
then
901 length = fm_get_length(name)
902 if (length .lt. 0)
then
903 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
905 if (length .gt. 0)
then
906 allocate(array(length))
909 write (index_str,*)
'(', i,
')'
910 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name) // trim(index_str))
914 elseif (fm_type .eq.
' ')
then
915 call mpp_error(fatal, trim(error_header) //
' Array does not exist: ' // trim(name))
917 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
936 real(r8_kind),
pointer,
dimension(:) :: array
942 character(len=*),
intent(in) :: name
943 character(len=*),
intent(in),
optional :: caller
949 character(len=48),
parameter :: sub_name =
'fm_util_get_real_array'
955 character(len=256) :: error_header
956 character(len=256) :: warn_header
957 character(len=256) :: note_header
958 character(len=128) :: caller_str
959 character(len=32) :: index_str
960 character(len=fm_type_name_len) :: fm_type
970 if (
present(caller))
then
971 caller_str =
'[' // trim(caller) //
']'
973 caller_str = fm_util_default_caller
976 error_header =
'==>Error from ' // trim(mod_name) // &
977 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
978 warn_header =
'==>Warning from ' // trim(mod_name) // &
979 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
980 note_header =
'==>Note from ' // trim(mod_name) // &
981 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
987 if (name .eq.
' ')
then
988 call mpp_error(fatal, trim(error_header) //
' Empty name given')
991 fm_type = fm_get_type(name)
992 if (fm_type .eq.
'real')
then
993 length = fm_get_length(name)
994 if (length .lt. 0)
then
995 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
997 if (length .gt. 0)
then
998 allocate(array(length))
1000 if (.not.
fm_get_value(name, array(i), index = i))
then
1001 write (index_str,*)
'(', i,
')'
1002 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name) // trim(index_str))
1006 elseif (fm_type .eq.
' ')
then
1007 call mpp_error(fatal, trim(error_header) //
' Array does not exist: ' // trim(name))
1009 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
1029 character(len=fm_string_len),
pointer,
dimension(:) :: array
1035 character(len=*),
intent(in) :: name
1036 character(len=*),
intent(in),
optional :: caller
1042 character(len=48),
parameter :: sub_name =
'fm_util_get_string_array'
1048 character(len=256) :: error_header
1049 character(len=256) :: warn_header
1050 character(len=256) :: note_header
1051 character(len=128) :: caller_str
1052 character(len=32) :: index_str
1053 character(len=fm_type_name_len) :: fm_type
1063 if (
present(caller))
then
1064 caller_str =
'[' // trim(caller) //
']'
1066 caller_str = fm_util_default_caller
1069 error_header =
'==>Error from ' // trim(mod_name) // &
1070 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1071 warn_header =
'==>Warning from ' // trim(mod_name) // &
1072 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1073 note_header =
'==>Note from ' // trim(mod_name) // &
1074 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1080 if (name .eq.
' ')
then
1081 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1084 fm_type = fm_get_type(name)
1085 if (fm_type .eq.
'string')
then
1086 length = fm_get_length(name)
1087 if (length .lt. 0)
then
1088 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1090 if (length .gt. 0)
then
1091 allocate(array(length))
1093 if (.not.
fm_get_value(name, array(i), index = i))
then
1094 write (index_str,*)
'(', i,
')'
1095 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name) // trim(index_str))
1099 elseif (fm_type .eq.
' ')
then
1100 call mpp_error(fatal, trim(error_header) //
' Array does not exist: ' // trim(name))
1102 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
1127 character(len=*),
intent(in) :: name
1128 character(len=*),
intent(in),
optional :: caller
1129 integer,
intent(in),
optional :: index
1130 integer,
intent(in),
optional :: default_value
1131 logical,
intent(in),
optional :: scalar
1137 character(len=48),
parameter :: sub_name =
'fm_util_get_integer'
1143 character(len=256) :: error_header
1144 character(len=256) :: warn_header
1145 character(len=256) :: note_header
1146 character(len=128) :: caller_str
1148 character(len=fm_type_name_len) :: fm_type
1149 integer :: field_length
1155 if (
present(caller))
then
1156 caller_str =
'[' // trim(caller) //
']'
1158 caller_str = fm_util_default_caller
1161 error_header =
'==>Error from ' // trim(mod_name) // &
1162 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1163 warn_header =
'==>Warning from ' // trim(mod_name) // &
1164 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1165 note_header =
'==>Note from ' // trim(mod_name) // &
1166 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1172 if (name .eq.
' ')
then
1173 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1181 if (
present(scalar))
then
1183 field_length = fm_get_length(name)
1184 if (field_length .lt. 0)
then
1185 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1186 elseif (field_length .gt. 1)
then
1187 call mpp_error(fatal, trim(error_header) // trim(name) //
' not scalar')
1196 if (
present(index))
then
1198 if (index .le. 0)
then
1199 call mpp_error(fatal, trim(error_header) //
' Index not positive')
1205 fm_type = fm_get_type(name)
1206 if (fm_type .eq.
'integer')
then
1207 if (.not.
fm_get_value(name, ival, index = index_t))
then
1208 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name))
1210 elseif (fm_type .eq.
' ' .and.
present(default_value))
then
1211 ival = default_value
1212 elseif (fm_type .eq.
' ')
then
1213 call mpp_error(fatal, trim(error_header) //
' Field does not exist: ' // trim(name))
1215 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
1240 character(len=*),
intent(in) :: name
1241 character(len=*),
intent(in),
optional :: caller
1242 integer,
intent(in),
optional :: index
1243 logical,
intent(in),
optional :: default_value
1244 logical,
intent(in),
optional :: scalar
1250 character(len=48),
parameter :: sub_name =
'fm_util_get_logical'
1256 character(len=256) :: error_header
1257 character(len=256) :: warn_header
1258 character(len=256) :: note_header
1259 character(len=128) :: caller_str
1261 character(len=fm_type_name_len) :: fm_type
1262 integer :: field_length
1268 if (
present(caller))
then
1269 caller_str =
'[' // trim(caller) //
']'
1271 caller_str = fm_util_default_caller
1274 error_header =
'==>Error from ' // trim(mod_name) // &
1275 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1276 warn_header =
'==>Warning from ' // trim(mod_name) // &
1277 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1278 note_header =
'==>Note from ' // trim(mod_name) // &
1279 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1285 if (name .eq.
' ')
then
1286 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1294 if (
present(scalar))
then
1296 field_length = fm_get_length(name)
1297 if (field_length .lt. 0)
then
1298 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1299 elseif (field_length .gt. 1)
then
1300 call mpp_error(fatal, trim(error_header) // trim(name) //
' not scalar')
1309 if (
present(index))
then
1311 if (index .le. 0)
then
1312 call mpp_error(fatal, trim(error_header) //
' Index not positive')
1318 fm_type = fm_get_type(name)
1319 if (fm_type .eq.
'logical')
then
1320 if (.not.
fm_get_value(name, lval, index = index_t))
then
1321 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name))
1323 elseif (fm_type .eq.
' ' .and.
present(default_value))
then
1324 lval = default_value
1325 elseif (fm_type .eq.
' ')
then
1326 call mpp_error(fatal, trim(error_header) //
' Field does not exist: ' // trim(name))
1328 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
1348 real(r8_kind) :: rval
1354 character(len=*),
intent(in) :: name
1355 character(len=*),
intent(in),
optional :: caller
1356 integer,
intent(in),
optional :: index
1357 real(r8_kind),
intent(in),
optional :: default_value
1358 logical,
intent(in),
optional :: scalar
1364 character(len=48),
parameter :: sub_name =
'fm_util_get_real'
1370 character(len=256) :: error_header
1371 character(len=256) :: warn_header
1372 character(len=256) :: note_header
1373 character(len=128) :: caller_str
1375 character(len=fm_type_name_len) :: fm_type
1376 integer :: field_length
1383 if (
present(caller))
then
1384 caller_str =
'[' // trim(caller) //
']'
1386 caller_str = fm_util_default_caller
1389 error_header =
'==>Error from ' // trim(mod_name) // &
1390 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1391 warn_header =
'==>Warning from ' // trim(mod_name) // &
1392 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1393 note_header =
'==>Note from ' // trim(mod_name) // &
1394 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1400 if (name .eq.
' ')
then
1401 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1409 if (
present(scalar))
then
1411 field_length = fm_get_length(name)
1412 if (field_length .lt. 0)
then
1413 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1414 elseif (field_length .gt. 1)
then
1415 call mpp_error(fatal, trim(error_header) // trim(name) //
' not scalar')
1424 if (
present(index))
then
1426 if (index .le. 0)
then
1427 call mpp_error(fatal, trim(error_header) //
' Index not positive')
1433 fm_type = fm_get_type(name)
1434 if (fm_type .eq.
'real')
then
1435 if (.not.
fm_get_value(name, rval, index = index_t))
then
1436 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name))
1438 else if (fm_type .eq.
'integer')
then
1439 if (.not.
fm_get_value(name, ivalue, index = index_t))
then
1440 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name))
1442 rval = real(ivalue,r8_kind)
1443 elseif (fm_type .eq.
' ' .and.
present(default_value))
then
1444 rval = default_value
1445 elseif (fm_type .eq.
' ')
then
1446 call mpp_error(fatal, trim(error_header) //
' Field does not exist: ' // trim(name))
1448 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
1469 character(len=fm_string_len) :: sval
1475 character(len=*),
intent(in) :: name
1476 character(len=*),
intent(in),
optional :: caller
1477 integer,
intent(in),
optional :: index
1478 character(len=*),
intent(in),
optional :: default_value
1479 logical,
intent(in),
optional :: scalar
1485 character(len=48),
parameter :: sub_name =
'fm_util_get_string'
1491 character(len=256) :: error_header
1492 character(len=256) :: warn_header
1493 character(len=256) :: note_header
1494 character(len=128) :: caller_str
1496 character(len=fm_type_name_len) :: fm_type
1497 integer :: field_length
1503 if (
present(caller))
then
1504 caller_str =
'[' // trim(caller) //
']'
1506 caller_str = fm_util_default_caller
1509 error_header =
'==>Error from ' // trim(mod_name) // &
1510 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1511 warn_header =
'==>Warning from ' // trim(mod_name) // &
1512 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1513 note_header =
'==>Note from ' // trim(mod_name) // &
1514 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1520 if (name .eq.
' ')
then
1521 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1529 if (
present(scalar))
then
1531 field_length = fm_get_length(name)
1532 if (field_length .lt. 0)
then
1533 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1534 elseif (field_length .gt. 1)
then
1535 call mpp_error(fatal, trim(error_header) // trim(name) //
' not scalar')
1544 if (
present(index))
then
1546 if (index .le. 0)
then
1547 call mpp_error(fatal, trim(error_header) //
' Index not positive')
1553 fm_type = fm_get_type(name)
1554 if (fm_type .eq.
'string')
then
1555 if (.not.
fm_get_value(name, sval, index = index_t))
then
1556 call mpp_error(fatal, trim(error_header) //
' Problem getting ' // trim(name))
1558 elseif (fm_type .eq.
' ' .and.
present(default_value))
then
1559 sval = default_value
1560 elseif (fm_type .eq.
' ')
then
1561 call mpp_error(fatal, trim(error_header) //
' Field does not exist: ' // trim(name))
1563 call mpp_error(fatal, trim(error_header) //
' Wrong type for ' // trim(name) //
', found (' // trim(fm_type) //
')')
1581 character(len=*),
intent(in) :: name
1582 integer,
intent(in) :: length
1583 integer,
intent(in) :: ival(length)
1584 character(len=*),
intent(in),
optional :: caller
1585 logical,
intent(in),
optional :: no_overwrite
1586 character(len=*),
intent(in),
optional :: good_name_list
1592 character(len=48),
parameter :: sub_name =
'fm_util_set_value_integer_array'
1598 character(len=256) :: error_header
1599 character(len=256) :: warn_header
1600 character(len=256) :: note_header
1601 character(len=128) :: caller_str
1602 character(len=32) :: str_error
1603 integer :: field_index
1604 integer :: field_length
1606 logical :: no_overwrite_use
1607 character(len=FMS_PATH_LEN) :: good_name_list_use
1614 if (
present(caller))
then
1615 caller_str =
'[' // trim(caller) //
']'
1617 caller_str = fm_util_default_caller
1620 error_header =
'==>Error from ' // trim(mod_name) // &
1621 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1622 warn_header =
'==>Warning from ' // trim(mod_name) // &
1623 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1624 note_header =
'==>Note from ' // trim(mod_name) // &
1625 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1631 if (name .eq.
' ')
then
1632 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1639 if (length .lt. 0)
then
1640 call mpp_error(fatal, trim(error_header) //
' Negative array length')
1647 if (
present(no_overwrite))
then
1648 no_overwrite_use = no_overwrite
1650 no_overwrite_use = default_no_overwrite
1657 if (
present(good_name_list))
then
1658 good_name_list_use = good_name_list
1660 good_name_list_use = default_good_name_list
1667 if (length .eq. 0)
then
1668 if (.not. (no_overwrite_use .and.
fm_exists(name)))
then
1670 if (field_index .le. 0)
then
1671 write (str_error,*)
' with length = ', length
1672 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
1676 if (no_overwrite_use .and.
fm_exists(name))
then
1677 field_length = fm_get_length(name)
1678 if (field_length .lt. 0)
then
1679 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1681 do n = field_length + 1, length
1683 if (field_index .le. 0)
then
1684 write (str_error,*)
' with index = ', n
1685 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
1690 if (field_index .le. 0)
then
1691 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name))
1695 if (field_index .le. 0)
then
1696 write (str_error,*)
' with index = ', n
1697 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
1708 if (good_name_list_use .ne.
' ')
then
1711 caller = caller_str) .le. 0
1715 if (add_name .and.
fm_exists(name))
then
1716 if (
fm_new_value(good_name_list_use, name, append = .true., create = .true.) .le. 0)
then
1717 call mpp_error(fatal, trim(error_header) // &
1718 ' Could not add ' // trim(name) //
' to "' // trim(good_name_list_use) //
'" list')
1738 character(len=*),
intent(in) :: name
1739 integer,
intent(in) :: length
1740 logical,
intent(in) :: lval(length)
1741 character(len=*),
intent(in),
optional :: caller
1742 logical,
intent(in),
optional :: no_overwrite
1743 character(len=*),
intent(in),
optional :: good_name_list
1749 character(len=48),
parameter :: sub_name =
'fm_util_set_value_logical_array'
1755 character(len=256) :: error_header
1756 character(len=256) :: warn_header
1757 character(len=256) :: note_header
1758 character(len=128) :: caller_str
1759 character(len=32) :: str_error
1760 integer :: field_index
1761 integer :: field_length
1763 logical :: no_overwrite_use
1764 character(len=FMS_PATH_LEN) :: good_name_list_use
1771 if (
present(caller))
then
1772 caller_str =
'[' // trim(caller) //
']'
1774 caller_str = fm_util_default_caller
1777 error_header =
'==>Error from ' // trim(mod_name) // &
1778 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1779 warn_header =
'==>Warning from ' // trim(mod_name) // &
1780 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1781 note_header =
'==>Note from ' // trim(mod_name) // &
1782 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1788 if (name .eq.
' ')
then
1789 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1796 if (length .lt. 0)
then
1797 call mpp_error(fatal, trim(error_header) //
' Negative array length')
1804 if (
present(no_overwrite))
then
1805 no_overwrite_use = no_overwrite
1807 no_overwrite_use = default_no_overwrite
1814 if (
present(good_name_list))
then
1815 good_name_list_use = good_name_list
1817 good_name_list_use = default_good_name_list
1824 if (length .eq. 0)
then
1825 if (.not. (no_overwrite_use .and.
fm_exists(name)))
then
1827 if (field_index .le. 0)
then
1828 write (str_error,*)
' with length = ', length
1829 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
1833 if (no_overwrite_use .and.
fm_exists(name))
then
1834 field_length = fm_get_length(name)
1835 if (field_length .lt. 0)
then
1836 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1838 do n = field_length + 1, length
1840 if (field_index .le. 0)
then
1841 write (str_error,*)
' with index = ', n
1842 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
1847 if (field_index .le. 0)
then
1848 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name))
1852 if (field_index .le. 0)
then
1853 write (str_error,*)
' with index = ', n
1854 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
1865 if (good_name_list_use .ne.
' ')
then
1868 caller = caller_str) .le. 0
1872 if (add_name .and.
fm_exists(name))
then
1873 if (
fm_new_value(good_name_list_use, name, append = .true., create = .true.) .le. 0)
then
1874 call mpp_error(fatal, trim(error_header) // &
1875 ' Could not add ' // trim(name) //
' to "' // trim(good_name_list_use) //
'" list')
1895 character(len=*),
intent(in) :: name
1896 integer,
intent(in) :: length
1897 character(len=*),
intent(in) :: sval(length)
1898 character(len=*),
intent(in),
optional :: caller
1899 logical,
intent(in),
optional :: no_overwrite
1900 character(len=*),
intent(in),
optional :: good_name_list
1906 character(len=48),
parameter :: sub_name =
'fm_util_set_value_string_array'
1912 character(len=256) :: error_header
1913 character(len=256) :: warn_header
1914 character(len=256) :: note_header
1915 character(len=128) :: caller_str
1916 character(len=32) :: str_error
1917 integer :: field_index
1918 integer :: field_length
1920 logical :: no_overwrite_use
1921 character(len=FMS_PATH_LEN) :: good_name_list_use
1928 if (
present(caller))
then
1929 caller_str =
'[' // trim(caller) //
']'
1931 caller_str = fm_util_default_caller
1934 error_header =
'==>Error from ' // trim(mod_name) // &
1935 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1936 warn_header =
'==>Warning from ' // trim(mod_name) // &
1937 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1938 note_header =
'==>Note from ' // trim(mod_name) // &
1939 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
1945 if (name .eq.
' ')
then
1946 call mpp_error(fatal, trim(error_header) //
' Empty name given')
1953 if (length .lt. 0)
then
1954 call mpp_error(fatal, trim(error_header) //
' Negative array length')
1961 if (
present(no_overwrite))
then
1962 no_overwrite_use = no_overwrite
1964 no_overwrite_use = default_no_overwrite
1971 if (
present(good_name_list))
then
1972 good_name_list_use = good_name_list
1974 good_name_list_use = default_good_name_list
1981 if (length .eq. 0)
then
1982 if (.not. (no_overwrite_use .and.
fm_exists(name)))
then
1984 if (field_index .le. 0)
then
1985 write (str_error,*)
' with length = ', length
1986 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
1990 if (no_overwrite_use .and.
fm_exists(name))
then
1991 field_length = fm_get_length(name)
1992 if (field_length .lt. 0)
then
1993 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
1995 do n = field_length + 1, length
1997 if (field_index .le. 0)
then
1998 write (str_error,*)
' with index = ', n
1999 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2004 if (field_index .le. 0)
then
2005 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name))
2009 if (field_index .le. 0)
then
2010 write (str_error,*)
' with index = ', n
2011 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2022 if (good_name_list_use .ne.
' ')
then
2025 caller = caller_str) .le. 0
2029 if (add_name .and.
fm_exists(name))
then
2030 if (
fm_new_value(good_name_list_use, name, append = .true., create = .true.) .le. 0)
then
2031 call mpp_error(fatal, trim(error_header) // &
2032 ' Could not add ' // trim(name) //
' to "' // trim(good_name_list_use) //
'" list')
2045 no_overwrite, good_name_list)
2053 character(len=*),
intent(in) :: name
2054 integer,
intent(in) :: ival
2055 character(len=*),
intent(in),
optional :: caller
2056 integer,
intent(in),
optional :: index
2057 logical,
intent(in),
optional :: append
2058 logical,
intent(in),
optional :: no_create
2059 logical,
intent(in),
optional :: no_overwrite
2060 character(len=*),
intent(in),
optional :: good_name_list
2066 character(len=48),
parameter :: sub_name =
'fm_util_set_value_integer'
2072 character(len=256) :: error_header
2073 character(len=256) :: warn_header
2074 character(len=256) :: note_header
2075 character(len=128) :: caller_str
2076 character(len=32) :: str_error
2077 integer :: field_index
2078 logical :: no_overwrite_use
2079 integer :: field_length
2080 character(len=FMS_PATH_LEN) :: good_name_list_use
2088 if (
present(caller))
then
2089 caller_str =
'[' // trim(caller) //
']'
2091 caller_str = fm_util_default_caller
2094 error_header =
'==>Error from ' // trim(mod_name) // &
2095 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2096 warn_header =
'==>Warning from ' // trim(mod_name) // &
2097 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2098 note_header =
'==>Note from ' // trim(mod_name) // &
2099 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2105 if (name .eq.
' ')
then
2106 call mpp_error(fatal, trim(error_header) //
' Empty name given')
2113 if (
present(index) .and.
present(append))
then
2114 call mpp_error(fatal, trim(error_header) //
' Append and index both given as arguments')
2121 if (
present(no_overwrite))
then
2122 no_overwrite_use = no_overwrite
2124 no_overwrite_use = default_no_overwrite
2131 if (
present(good_name_list))
then
2132 good_name_list_use = good_name_list
2134 good_name_list_use = default_good_name_list
2137 if (
present(no_create))
then
2138 create = .not. no_create
2139 if (no_create .and. (
present(append) .or.
present(index)))
then
2140 call mpp_error(fatal, trim(error_header) // &
2141 &
' append or index are present when no_create is true for ' // trim(name))
2147 if (
present(index))
then
2149 field_length = fm_get_length(name)
2150 if (field_length .lt. 0)
then
2151 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
2153 if (.not. (no_overwrite_use .and. field_length .ge. index))
then
2155 if (field_index .le. 0)
then
2156 write (str_error,*)
' with index = ', index
2157 call mpp_error(fatal, trim(error_header) //
' Problem overwriting ' // trim(name) // trim(str_error))
2162 if (field_index .le. 0)
then
2163 write (str_error,*)
' with index = ', index
2164 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2167 elseif (
present(append))
then
2168 field_index =
fm_new_value(name, ival, append = append)
2169 if (field_index .le. 0)
then
2170 write (str_error,*)
' with append = ', append
2171 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2175 if (.not. no_overwrite_use)
then
2177 if (field_index .le. 0)
then
2178 call mpp_error(fatal, trim(error_header) //
' Problem overwriting ' // trim(name))
2181 elseif (create)
then
2183 if (field_index .le. 0)
then
2184 call mpp_error(fatal, trim(error_header) //
' Problem creating ' // trim(name))
2194 if (good_name_list_use .ne.
' ')
then
2197 caller = caller_str) .le. 0
2201 if (add_name .and.
fm_exists(name))
then
2202 if (
fm_new_value(good_name_list_use, name, append = .true., create = .true.) .le. 0)
then
2203 call mpp_error(fatal, trim(error_header) // &
2204 ' Could not add ' // trim(name) //
' to "' // trim(good_name_list_use) //
'" list')
2217 no_overwrite, good_name_list)
2225 character(len=*),
intent(in) :: name
2226 logical,
intent(in) :: lval
2227 character(len=*),
intent(in),
optional :: caller
2228 integer,
intent(in),
optional :: index
2229 logical,
intent(in),
optional :: append
2230 logical,
intent(in),
optional :: no_create
2231 logical,
intent(in),
optional :: no_overwrite
2232 character(len=*),
intent(in),
optional :: good_name_list
2238 character(len=48),
parameter :: sub_name =
'fm_util_set_value_logical'
2244 character(len=256) :: error_header
2245 character(len=256) :: warn_header
2246 character(len=256) :: note_header
2247 character(len=128) :: caller_str
2248 character(len=32) :: str_error
2249 integer :: field_index
2250 logical :: no_overwrite_use
2251 integer :: field_length
2252 character(len=FMS_PATH_LEN) :: good_name_list_use
2260 if (
present(caller))
then
2261 caller_str =
'[' // trim(caller) //
']'
2263 caller_str = fm_util_default_caller
2266 error_header =
'==>Error from ' // trim(mod_name) // &
2267 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2268 warn_header =
'==>Warning from ' // trim(mod_name) // &
2269 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2270 note_header =
'==>Note from ' // trim(mod_name) // &
2271 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2277 if (name .eq.
' ')
then
2278 call mpp_error(fatal, trim(error_header) //
' Empty name given')
2285 if (
present(index) .and.
present(append))
then
2286 call mpp_error(fatal, trim(error_header) //
' Append and index both given as arguments')
2293 if (
present(no_overwrite))
then
2294 no_overwrite_use = no_overwrite
2296 no_overwrite_use = default_no_overwrite
2303 if (
present(good_name_list))
then
2304 good_name_list_use = good_name_list
2306 good_name_list_use = default_good_name_list
2309 if (
present(no_create))
then
2310 create = .not. no_create
2311 if (no_create .and. (
present(append) .or.
present(index)))
then
2312 call mpp_error(fatal, trim(error_header) // &
2313 &
' append or index are present when no_create is true for ' // trim(name))
2319 if (
present(index))
then
2321 field_length = fm_get_length(name)
2322 if (field_length .lt. 0)
then
2323 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
2325 if (.not. (no_overwrite_use .and. field_length .ge. index))
then
2327 if (field_index .le. 0)
then
2328 write (str_error,*)
' with index = ', index
2329 call mpp_error(fatal, trim(error_header) //
' Problem overwriting ' // trim(name) // trim(str_error))
2334 if (field_index .le. 0)
then
2335 write (str_error,*)
' with index = ', index
2336 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2339 elseif (
present(append))
then
2340 field_index =
fm_new_value(name, lval, append = append)
2341 if (field_index .le. 0)
then
2342 write (str_error,*)
' with append = ', append
2343 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2347 if (.not. no_overwrite_use)
then
2349 if (field_index .le. 0)
then
2350 call mpp_error(fatal, trim(error_header) //
' Problem overwriting ' // trim(name))
2353 elseif (create)
then
2355 if (field_index .le. 0)
then
2356 call mpp_error(fatal, trim(error_header) //
' Problem creating ' // trim(name))
2366 if (good_name_list_use .ne.
' ')
then
2369 caller = caller_str) .le. 0
2373 if (add_name .and.
fm_exists(name))
then
2374 if (
fm_new_value(good_name_list_use, name, append = .true., create = .true.) .le. 0)
then
2375 call mpp_error(fatal, trim(error_header) // &
2376 ' Could not add ' // trim(name) //
' to "' // trim(good_name_list_use) //
'" list')
2388 no_overwrite, good_name_list)
2396 character(len=*),
intent(in) :: name
2397 character(len=*),
intent(in) :: sval
2398 character(len=*),
intent(in),
optional :: caller
2399 integer,
intent(in),
optional :: index
2400 logical,
intent(in),
optional :: append
2401 logical,
intent(in),
optional :: no_create
2402 logical,
intent(in),
optional :: no_overwrite
2403 character(len=*),
intent(in),
optional :: good_name_list
2409 character(len=48),
parameter :: sub_name =
'fm_util_set_value_string'
2415 character(len=256) :: error_header
2416 character(len=256) :: warn_header
2417 character(len=256) :: note_header
2418 character(len=128) :: caller_str
2419 character(len=32) :: str_error
2420 integer :: field_index
2421 logical :: no_overwrite_use
2422 integer :: field_length
2423 character(len=FMS_PATH_LEN) :: good_name_list_use
2431 if (
present(caller))
then
2432 caller_str =
'[' // trim(caller) //
']'
2434 caller_str = fm_util_default_caller
2437 error_header =
'==>Error from ' // trim(mod_name) // &
2438 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2439 warn_header =
'==>Warning from ' // trim(mod_name) // &
2440 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2441 note_header =
'==>Note from ' // trim(mod_name) // &
2442 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2448 if (name .eq.
' ')
then
2449 call mpp_error(fatal, trim(error_header) //
' Empty name given')
2456 if (
present(index) .and.
present(append))
then
2457 call mpp_error(fatal, trim(error_header) //
' Append and index both given as arguments')
2464 if (
present(no_overwrite))
then
2465 no_overwrite_use = no_overwrite
2467 no_overwrite_use = default_no_overwrite
2474 if (
present(good_name_list))
then
2475 good_name_list_use = good_name_list
2477 good_name_list_use = default_good_name_list
2480 if (
present(no_create))
then
2481 create = .not. no_create
2482 if (no_create .and. (
present(append) .or.
present(index)))
then
2483 call mpp_error(fatal, trim(error_header) // &
2484 &
' append or index are present when no_create is true for ' // trim(name))
2490 if (
present(index))
then
2492 field_length = fm_get_length(name)
2493 if (field_length .lt. 0)
then
2494 call mpp_error(fatal, trim(error_header) //
' Problem getting length of ' // trim(name))
2496 if (.not. (no_overwrite_use .and. field_length .ge. index))
then
2498 if (field_index .le. 0)
then
2499 write (str_error,*)
' with index = ', index
2500 call mpp_error(fatal, trim(error_header) //
' Problem overwriting ' // trim(name) // trim(str_error))
2505 if (field_index .le. 0)
then
2506 write (str_error,*)
' with index = ', index
2507 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2510 elseif (
present(append))
then
2511 field_index =
fm_new_value(name, sval, append = append)
2512 if (field_index .le. 0)
then
2513 write (str_error,*)
' with append = ', append
2514 call mpp_error(fatal, trim(error_header) //
' Problem setting ' // trim(name) // trim(str_error))
2518 if (.not. no_overwrite_use)
then
2520 if (field_index .le. 0)
then
2521 call mpp_error(fatal, trim(error_header) //
' Problem overwriting ' // trim(name))
2524 elseif (create)
then
2526 if (field_index .le. 0)
then
2527 call mpp_error(fatal, trim(error_header) //
' Problem creating ' // trim(name))
2537 if (good_name_list_use .ne.
' ')
then
2540 caller = caller_str) .le. 0
2544 if (add_name .and.
fm_exists(name))
then
2545 if (
fm_new_value(good_name_list_use, name, append = .true., create = .true.) .le. 0)
then
2546 call mpp_error(fatal, trim(error_header) // &
2547 ' Could not add ' // trim(name) //
' to "' // trim(good_name_list_use) //
'" list')
2567 character(len=*),
intent(in) :: path
2568 character(len=*),
intent(in) :: name
2569 character(len=*),
intent(in),
optional :: caller
2570 logical,
intent(in),
optional :: no_overwrite
2571 logical,
intent(in),
optional :: check
2577 character(len=48),
parameter :: sub_name =
'fm_util_start_namelist'
2583 integer :: namelist_index
2584 character(len=FMS_PATH_LEN) :: path_name
2585 character(len=256) :: error_header
2586 character(len=256) :: warn_header
2587 character(len=256) :: note_header
2588 character(len=128) :: caller_str
2597 if (
present(caller))
then
2598 caller_str =
'[' // trim(caller) //
']'
2600 caller_str = fm_util_default_caller
2603 error_header =
'==>Error from ' // trim(mod_name) // &
2604 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2605 warn_header =
'==>Warning from ' // trim(mod_name) // &
2606 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2607 note_header =
'==>Note from ' // trim(mod_name) // &
2608 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2614 if (name .eq.
' ')
then
2615 call mpp_error(fatal, trim(error_header) //
' Empty name given')
2622 if (path .eq.
' ')
then
2625 path_name = trim(path) //
'/' // name
2634 if (
present(caller))
then
2644 if (
present(no_overwrite))
then
2654 if (
present(check))
then
2669 write (out_unit,*) trim(note_header),
' Processing namelist ', trim(path_name)
2675 namelist_index = fm_get_index(
'/ocean_mod/namelists/' // trim(path_name))
2676 if (namelist_index .gt. 0)
then
2686 namelist_index = fm_new_list(
'/ocean_mod/namelists/' // trim(path_name), create = .true.)
2687 if (namelist_index .le. 0)
then
2688 call mpp_error(fatal, trim(error_header) //
' Could not set namelist ' // trim(path_name))
2698 if (
fm_new_value(
'/ocean_mod/GOOD/namelists/' // trim(path) //
'/good_values', &
2699 name, append = .true., create = .true.) .le. 0)
then
2700 call mpp_error(fatal, trim(error_header) // &
2701 ' Could not add ' // trim(name) //
' to "' // trim(path) //
'/good_values" list')
2708 save_current_list = fm_get_current_list()
2709 if (save_current_list .eq.
' ')
then
2710 call mpp_error(fatal, trim(error_header) //
' Could not get the current list')
2713 if (.not. fm_change_list(
'/ocean_mod/namelists/' // trim(path_name)))
then
2714 call mpp_error(fatal, trim(error_header) //
' Could not change to the namelist ' // trim(path_name))
2732 character(len=*),
intent(in) :: path
2733 character(len=*),
intent(in) :: name
2734 character(len=*),
intent(in),
optional :: caller
2735 logical,
intent(in),
optional :: check
2741 character(len=48),
parameter :: sub_name =
'fm_util_end_namelist'
2747 character(len=fm_string_len),
pointer,
dimension(:) :: good_list => null()
2748 character(len=FMS_PATH_LEN) :: path_name
2749 character(len=256) :: error_header
2750 character(len=256) :: warn_header
2751 character(len=256) :: note_header
2752 character(len=128) :: caller_str
2758 if (
present(caller))
then
2759 caller_str =
'[' // trim(caller) //
']'
2761 caller_str = fm_util_default_caller
2764 error_header =
'==>Error from ' // trim(mod_name) // &
2765 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2766 warn_header =
'==>Warning from ' // trim(mod_name) // &
2767 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2768 note_header =
'==>Note from ' // trim(mod_name) // &
2769 '(' // trim(sub_name) //
')' // trim(caller_str) //
':'
2775 if (name .eq.
' ')
then
2776 call mpp_error(fatal, trim(error_header) //
' Empty name given')
2784 if (path .ne. save_path)
then
2785 call mpp_error(fatal, trim(error_header) // &
2786 &
' Path "' // trim(path) //
'" does not match saved path "' // trim(save_path) //
'"')
2787 elseif (name .ne. save_name)
then
2788 call mpp_error(fatal, trim(error_header) // &
2789 &
' Name "' // trim(name) //
'" does not match saved name "' // trim(save_name) //
'"')
2796 if (path .eq.
' ')
then
2799 path_name = trim(path) //
'/' // name
2808 if (
present(check))
then
2810 if (caller_str .eq.
' ')
then
2811 caller_str = trim(mod_name) //
'(' // trim(sub_name) //
')'
2814 caller = trim(mod_name) //
'(' // trim(sub_name) //
')')
2815 if (
associated(good_list))
then
2817 deallocate(good_list)
2819 call mpp_error(fatal, trim(error_header) //
' Empty "' // trim(path_name) //
'" list')
2828 if (save_current_list .ne.
' ')
then
2829 if (.not. fm_change_list(save_current_list))
then
2830 call mpp_error(fatal, trim(error_header) //
' Could not change to the saved list: ' // trim(save_current_list))
2833 save_current_list =
' '
2857 #include "fm_util_r4.fh"
2858 #include "fm_util_r8.fh"
2860 end module fm_util_mod
integer, parameter, public fm_string_len
The length of a character string representing character values for the field.
integer function, public fm_get_length(name)
A function to return how many elements are contained within the named list or entry.
character(len=8) function, public fm_get_type(name)
A function to return the type of the named field.
logical function, public fm_exists(name)
A function to test whether a named field exists.
logical function, public fm_change_list(name)
Change the current list. Return true on success, false otherwise.
integer function, public fm_new_list(name, create, keep)
A function to create a new list.
character(len=fms_path_len) function, public fm_get_current_list()
A function to return the full path of the current list.
integer function, public fm_get_index(name)
A function to return the index of a named field.
integer, parameter, public fm_field_name_len
The length of a character string representing the field name.
integer, parameter, public fm_type_name_len
The length of a character string representing the various types that the values of the field can take...
logical function, public fm_dump_list(name, recursive, unit)
A function to list properties associated with a field.
An overloaded function to find and extract a value for a named field.
A function for looping over a list.
An overloaded function to assign a value to a field.
subroutine fm_util_set_value_logical_array(name, lval, length, caller, no_overwrite, good_name_list)
Set a logical array in the Field Manager tree.
subroutine fm_util_set_value_logical(name, lval, caller, index, append, no_create, no_overwrite, good_name_list)
Set a logical value in the Field Manager tree.
subroutine, public fm_util_reset_no_overwrite
Reset the default value for the optional "no_overwrite" variable used in some of these subroutines to...
subroutine, public fm_util_start_namelist(path, name, caller, no_overwrite, check)
Start processing a namelist.
subroutine fm_util_set_value_integer_array(name, ival, length, caller, no_overwrite, good_name_list)
Set an integer array in the Field Manager tree.
subroutine, public fm_util_set_no_overwrite(no_overwrite)
Set the default value for the optional "no_overwrite" variable used in some of these subroutines.
logical function, dimension(:), pointer, public fm_util_get_logical_array(name, caller)
Get a logical value from the Field Manager tree.
subroutine, public fm_util_end_namelist(path, name, caller, check)
Finish up processing a namelist.
subroutine, public fm_util_check_for_bad_fields(list, good_fields, caller)
Check for unrecognized fields in a list.
integer function, public fm_util_get_index_list(name, caller)
Get the length of an element of the Field Manager tree.
integer function, public fm_util_get_length(name, caller)
Get the length of an element of the Field Manager tree.
subroutine fm_util_set_value_string_array(name, sval, length, caller, no_overwrite, good_name_list)
Set a string array in the Field Manager tree.
logical function, public fm_util_get_logical(name, caller, index, default_value, scalar)
Get a logical value from the Field Manager tree.
subroutine, public fm_util_set_caller(caller)
Set the default value for the optional "caller" variable used in many of these subroutines....
subroutine, public fm_util_reset_caller
Reset the default value for the optional "caller" variable used in many of these subroutines to blank...
integer function, dimension(:), pointer, public fm_util_get_integer_array(name, caller)
Get an integer value from the Field Manager tree.
subroutine, public fm_util_reset_good_name_list
Reset the default value for the optional "good_name_list" variable used in many of these subroutines ...
subroutine fm_util_set_value_string(name, sval, caller, index, append, no_create, no_overwrite, good_name_list)
Set a string value in the Field Manager tree.
real(r8_kind) function, public fm_util_get_real(name, caller, index, default_value, scalar)
Get a real value from the Field Manager tree.
integer function, public fm_util_get_integer(name, caller, index, default_value, scalar)
Get an integer value from the Field Manager tree.
character(len=fm_string_len) function, dimension(:), pointer, public fm_util_get_string_array(name, caller)
Get a string value from the Field Manager tree.
subroutine fm_util_set_value_integer(name, ival, caller, index, append, no_create, no_overwrite, good_name_list)
Set an integer value in the Field Manager tree.
integer function, public fm_util_get_index_string(name, string, caller)
Get the index of an element of a string in the Field Manager tree.
subroutine, public fm_util_set_good_name_list(good_name_list)
Set the default value for the optional "good_name_list" variable used in many of these subroutines.
real(r8_kind) function, dimension(:), pointer, public fm_util_get_real_array(name, caller)
Get a real value from the Field Manager tree.
character(len=fm_string_len) function, public fm_util_get_string(name, caller, index, default_value, scalar)
Get a string value from the Field Manager tree.
integer function stdout()
This function returns the current standard fortran unit numbers for output.