@@ -2164,6 +2164,7 @@ integer function register_diag_field(module_name, field_name, axes_in, init_time
2164
2164
character (len= 256 ) :: msg, cm_string
2165
2165
character (len= 256 ) :: new_module_name
2166
2166
character (len= 480 ) :: module_list, var_list
2167
+ character (len= 16 ) :: dimensions
2167
2168
integer :: num_modnm, num_varnm
2168
2169
logical :: active
2169
2170
@@ -2384,6 +2385,21 @@ integer function register_diag_field(module_name, field_name, axes_in, init_time
2384
2385
enddo ! i
2385
2386
enddo
2386
2387
2388
+ dimensions = " "
2389
+ if (axes_in% is_h_point) dimensions = trim (dimensions)// " ,yh, xh"
2390
+ if (axes_in% is_q_point) dimensions = trim (dimensions)// " ,yq, xq"
2391
+ if (axes_in% is_u_point) dimensions = trim (dimensions)// " ,yh, xq"
2392
+ if (axes_in% is_v_point) dimensions = trim (dimensions)// " ,yq, xh"
2393
+ if (axes_in% is_layer) dimensions = trim (dimensions)// " , zl"
2394
+ if (axes_in% is_interface) dimensions = trim (dimensions)// " , zi"
2395
+
2396
+ if (len (dimensions) > 0 ) then
2397
+ dimensions = trim (adjustl (dimensions))
2398
+ if (dimensions(1 :1 ) == " ," ) then
2399
+ dimensions = dimensions(2 :)
2400
+ endif
2401
+ endif
2402
+
2387
2403
if (is_root_pe() .and. (diag_CS% available_diag_doc_unit > 0 )) then
2388
2404
msg = ' '
2389
2405
if (present (cmor_field_name)) msg = ' CMOR equivalent is "' // trim (cmor_field_name)// ' "'
@@ -2395,7 +2411,7 @@ integer function register_diag_field(module_name, field_name, axes_in, init_time
2395
2411
if (num_varnm <= 1 ) var_list = ' '
2396
2412
2397
2413
call log_available_diag(dm_id> 0 , module_list, field_name, cm_string, msg, diag_CS, &
2398
- long_name, units, standard_name, variants= var_list)
2414
+ long_name, units, standard_name, variants= var_list, dimensions = dimensions )
2399
2415
endif
2400
2416
2401
2417
register_diag_field = dm_id
@@ -2897,6 +2913,7 @@ function register_scalar_field(module_name, field_name, init_time, diag_cs, &
2897
2913
integer :: dm_id, fms_id
2898
2914
type (diag_type), pointer :: diag = > null (), cmor_diag = > null ()
2899
2915
character (len= 256 ) :: posted_cmor_units, posted_cmor_standard_name, posted_cmor_long_name
2916
+ character (len= 16 ) :: dimensions
2900
2917
2901
2918
MOM_missing_value = diag_cs% missing_value
2902
2919
if (present (missing_value)) MOM_missing_value = missing_value
@@ -2956,15 +2973,18 @@ function register_scalar_field(module_name, field_name, init_time, diag_cs, &
2956
2973
endif
2957
2974
endif
2958
2975
2976
+ dimensions = " scalar"
2977
+
2959
2978
! Document diagnostics in list of available diagnostics
2960
2979
if (is_root_pe() .and. diag_CS% available_diag_doc_unit > 0 ) then
2961
2980
if (present (cmor_field_name)) then
2962
2981
call log_available_diag(associated (diag), module_name, field_name, ' ' , ' ' , diag_CS, &
2963
2982
long_name, units, standard_name, &
2964
- variants= " {" // trim (field_name)// " ," // trim (cmor_field_name)// " }" )
2983
+ variants= " {" // trim (field_name)// " ," // trim (cmor_field_name)// " }" , &
2984
+ dimensions= dimensions)
2965
2985
else
2966
2986
call log_available_diag(associated (diag), module_name, field_name, ' ' , ' ' , diag_CS, &
2967
- long_name, units, standard_name)
2987
+ long_name, units, standard_name, dimensions = dimensions )
2968
2988
endif
2969
2989
endif
2970
2990
@@ -3016,6 +3036,7 @@ function register_static_field(module_name, field_name, axes, &
3016
3036
integer :: dm_id, fms_id
3017
3037
character (len= 256 ) :: posted_cmor_units, posted_cmor_standard_name, posted_cmor_long_name
3018
3038
character (len= 9 ) :: axis_name
3039
+ character (len= 16 ) :: dimensions
3019
3040
3020
3041
MOM_missing_value = axes% diag_cs% missing_value
3021
3042
if (present (missing_value)) MOM_missing_value = missing_value
@@ -3108,15 +3129,31 @@ function register_static_field(module_name, field_name, axes, &
3108
3129
endif
3109
3130
endif
3110
3131
3132
+ dimensions = " "
3133
+ if (axes% is_h_point) dimensions = trim (dimensions)// " ,yh, xh"
3134
+ if (axes% is_q_point) dimensions = trim (dimensions)// " ,yq, xq"
3135
+ if (axes% is_u_point) dimensions = trim (dimensions)// " ,yh, xq"
3136
+ if (axes% is_v_point) dimensions = trim (dimensions)// " ,yq, xh"
3137
+ if (axes% is_layer) dimensions = trim (dimensions)// " , zl"
3138
+ if (axes% is_interface) dimensions = trim (dimensions)// " , zi"
3139
+
3140
+ if (len (dimensions) > 0 ) then
3141
+ dimensions = trim (adjustl (dimensions))
3142
+ if (dimensions(1 :1 ) == " ," ) then
3143
+ dimensions = dimensions(2 :)
3144
+ endif
3145
+ endif
3146
+
3111
3147
! Document diagnostics in list of available diagnostics
3112
3148
if (is_root_pe() .and. diag_CS% available_diag_doc_unit > 0 ) then
3113
3149
if (present (cmor_field_name)) then
3114
3150
call log_available_diag(associated (diag), module_name, field_name, ' ' , ' ' , diag_CS, &
3115
3151
long_name, units, standard_name, &
3116
- variants= " {" // trim (field_name)// " ," // trim (cmor_field_name)// " }" )
3152
+ variants= " {" // trim (field_name)// " ," // trim (cmor_field_name)// " }" , &
3153
+ dimensions= dimensions)
3117
3154
else
3118
3155
call log_available_diag(associated (diag), module_name, field_name, ' ' , ' ' , diag_CS, &
3119
- long_name, units, standard_name)
3156
+ long_name, units, standard_name, dimensions = dimensions )
3120
3157
endif
3121
3158
endif
3122
3159
@@ -3865,13 +3902,14 @@ end subroutine alloc_diag_with_id
3865
3902
3866
3903
! > Log a diagnostic to the available diagnostics file.
3867
3904
subroutine log_available_diag (used , module_name , field_name , cell_methods_string , comment , &
3868
- diag_CS , long_name , units , standard_name , variants )
3905
+ diag_CS , long_name , units , standard_name , variants , dimensions )
3869
3906
logical , intent (in ) :: used ! < Whether this diagnostic was in the diag_table or not
3870
3907
character (len=* ), intent (in ) :: module_name ! < Name of the diagnostic module
3871
3908
character (len=* ), intent (in ) :: field_name ! < Name of this diagnostic field
3872
3909
character (len=* ), intent (in ) :: cell_methods_string ! < The spatial component of the CF cell_methods attribute
3873
3910
character (len=* ), intent (in ) :: comment ! < A comment to append after [Used|Unused]
3874
3911
type (diag_ctrl), intent (in ) :: diag_CS ! < The diagnotics control structure
3912
+ character (len=* ), optional , intent (in ) :: dimensions ! < Descriptor of the horizontal and vertical dimensions
3875
3913
character (len=* ), optional , intent (in ) :: long_name ! < CF long name of diagnostic
3876
3914
character (len=* ), optional , intent (in ) :: units ! < Units for diagnostic
3877
3915
character (len=* ), optional , intent (in ) :: standard_name ! < CF standardized name of diagnostic
@@ -3891,6 +3929,11 @@ subroutine log_available_diag(used, module_name, field_name, cell_methods_string
3891
3929
write (diag_CS% available_diag_doc_unit, ' (a)' ) trim (mesg)
3892
3930
endif
3893
3931
call describe_option(" modules" , module_name, diag_CS)
3932
+ if (present (dimensions)) then
3933
+ if (len (trim (dimensions)) > 0 ) then
3934
+ call describe_option(" dimensions" , dimensions, diag_CS)
3935
+ endif
3936
+ endif
3894
3937
if (present (long_name)) call describe_option(" long_name" , long_name, diag_CS)
3895
3938
if (present (units)) call describe_option(" units" , units, diag_CS)
3896
3939
if (present (standard_name)) &
0 commit comments