29 use fms_mod,
only: lowercase, uppercase, string_array_index, fms_error_handler
30 use fms2_io_mod,
only: fmsnetcdfdomainfile_t, variable_att_exists, fmsnetcdffile_t, &
105 type(fmsnetcdffile_t),
intent(in) :: fileobj
106 character(len=*),
intent(in) :: axisname
107 character(len=1),
intent(out) :: cart
109 character(len=1) :: axis_cart
110 character(len=16),
dimension(2) :: lon_names, lat_names
111 character(len=16),
dimension(3) :: z_names
112 character(len=16),
dimension(2) :: t_names
113 character(len=16),
dimension(3) :: lon_units, lat_units
114 character(len=8) ,
dimension(4) :: z_units
115 character(len=3) ,
dimension(6) :: t_units
116 character(len=32) :: name
119 lon_names = (/
'lon',
'x '/)
120 lat_names = (/
'lat',
'y '/)
121 z_names = (/
'depth ',
'height',
'z '/)
122 t_names = (/
'time',
't '/)
123 lon_units = (/
'degrees_e ',
'degrees_east',
'degreese '/)
124 lat_units = (/
'degrees_n ',
'degrees_north',
'degreesn '/)
125 z_units = (/
'cm ',
'm ',
'pa ',
'hpa'/)
126 t_units = (/
'sec',
'min',
'hou',
'day',
'mon',
'yea'/)
129 if (variable_exists(fileobj, axisname))
then
130 if (variable_att_exists(fileobj, axisname,
"cartesian_axis"))
then
131 call get_variable_attribute(fileobj, axisname,
"cartesian_axis", cart(1:1))
132 elseif (variable_att_exists(fileobj, axisname,
"axis"))
then
133 call get_variable_attribute(fileobj, axisname,
"axis", cart(1:1))
135 axis_cart = uppercase(cart)
136 if (axis_cart .eq.
'X' .or. axis_cart .eq.
'Y' .or. axis_cart .eq.
'Z' &
137 .or. axis_cart .eq.
'T')
then
143 if (cart /=
'X' .and. cart /=
'Y' .and. cart /=
'Z' .and. cart /=
'T')
then
144 name = lowercase(axisname)
145 do i=1,
size(lon_names(:))
146 if (trim(name(1:3)) == trim(lon_names(i))) cart =
'X'
148 do i=1,
size(lat_names(:))
149 if (trim(name(1:3)) == trim(lat_names(i))) cart =
'Y'
151 do i=1,
size(z_names(:))
152 if (trim(name) == trim(z_names(i))) cart =
'Z'
154 do i=1,
size(t_names(:))
155 if (trim(name) == t_names(i)) cart =
'T'
159 if (cart /=
'X' .and. cart /=
'Y' .and. cart /=
'Z' .and. cart /=
'T')
then
160 name = lowercase(axisname)
161 do i=1,
size(lon_units(:))
162 if (trim(name) == trim(lon_units(i))) cart =
'X'
164 do i=1,
size(lat_units(:))
165 if (trim(name) == trim(lat_units(i))) cart =
'Y'
167 do i=1,
size(z_units(:))
168 if (trim(name) == trim(z_units(i))) cart =
'Z'
170 do i=1,
size(t_units(:))
171 if (name(1:3) == trim(t_units(i))) cart =
'T'
190 type(fmsnetcdffile_t),
intent(in) :: fileobj
191 character(len=*),
intent(in) :: axisname
192 character(len=*),
intent(out) :: tbeg, tend
194 logical :: found_tbeg, found_tend
196 found_tbeg = variable_att_exists(fileobj, axisname,
"modulo_beg")
197 found_tend = variable_att_exists(fileobj, axisname,
"modulo_end")
199 if (found_tbeg .and. .not. found_tend)
then
200 call mpp_error(fatal,
'error in get: Found modulo_beg but not modulo_end')
202 if (.not. found_tbeg .and. found_tend)
then
203 call mpp_error(fatal,
'error in get: Found modulo_end but not modulo_beg')
207 call get_variable_attribute(fileobj, axisname,
"modulo_beg", tbeg)
208 call get_variable_attribute(fileobj, axisname,
"modulo_end", tend)
subroutine, public get_axis_cart(fileobj, axisname, cart)
Returns X,Y,Z or T cartesian attribute.