gtool5 Fortran 90/95 Library 1.0.0-rc5
日本語
Loading...
Searching...
No Matches
gdncattrgetnum.f90
Go to the documentation of this file.
1! -*- coding: utf-8; mode: f90 -*-
2!-------------------------------------------------------------------------------------
3! Copyright (c) 2000-2026 Gtool Development Group. All rights reserved.
4!-------------------------------------------------------------------------------------
46!
66subroutine gdncattrgetint(var, name, value, stat, default)
69 use netcdf, only: &
70 & nf90_noerr, &
71 & nf90_global, &
72 & nf90_char, &
73 & nf90_enomem, &
74 & nf90_inquire_attribute, &
75 & nf90_get_att
76 use dc_url, only: gt_plus
78 use dc_types, only: string
79 use dc_string
80 implicit none
81 type(gd_nc_variable), intent(in) :: var
82 character(len = *), intent(in) :: name
83 integer, intent(out):: stat
84 integer, intent(out):: value(:)
85 integer, intent(in), optional:: default
86 integer, allocatable:: rbuffer(:)
87 character(STRING) :: cbuffer
88 character(STRING), pointer :: lbuffer(:)
89 integer :: attrlen, xtype, i, xferend, iname, varid
90 type(gd_nc_variable_entry):: ent
91 continue
92 stat = vtable_lookup(var, ent)
93 if (stat /= nf90_noerr) then
94 if (present(default)) value(:) = default
95 return
96 endif
97 ! 型と長さを取得
98 if (name(1:1) == gt_plus) then
99 iname = 2
100 varid = nf90_global
101 else
102 iname = 1
103 varid = ent%varid
104 endif
105 stat = nf90_inquire_attribute(ent%fileid, varid, &
106 name = name(iname:), xtype = xtype, len = attrlen)
107 if (stat /= nf90_noerr) then
108 if (present(default)) value(:) = default
109 return
110 endif
111 ! 文字型の場合は長さをコンマで分解した語数と読み替える
112 if (xtype == nf90_char) then
113 call get_attr(var, name, cbuffer, "", stat)
114 if (stat /= 0) return
115 call split(cbuffer, lbuffer, ", ")
116 attrlen = size(lbuffer)
117 endif
118 ! 結果を入れるところがなければ長さだけを伝え終了
119 if (size(value) == 0) then
120 if (xtype == nf90_char) deallocate(lbuffer)
121 stat = attrlen
122 return
123 endif
124 ! 型に応じて要求されただけ値を転送
125 xferend = min(size(value), attrlen)
126 if (present(default)) value(xferend+1: ) = default
127 if (xtype == nf90_char) then
128 do, i = 1, xferend
129 value(i) = stoi(lbuffer(i))
130 enddo
131 deallocate(lbuffer)
132 stat = attrlen
133 return
134 else
135 allocate(rbuffer(attrlen), stat=stat)
136 if (stat /= 0) then
137 stat = nf90_enomem
138 return
139 endif
140 stat = nf90_get_att(ent%fileid, varid, name(iname:), rbuffer)
141 if (stat == nf90_noerr) then
142 value(1:xferend) = rbuffer(1:xferend)
143 stat = attrlen
144 endif
145 deallocate(rbuffer)
146 return
147 endif
148end subroutine gdncattrgetint
168subroutine gdncattrgetreal(var, name, value, stat, default)
171 use netcdf, only: &
172 & nf90_noerr, &
173 & nf90_global, &
174 & nf90_char, &
175 & nf90_enomem, &
176 & nf90_inquire_attribute, &
177 & nf90_get_att
178 use dc_url, only: gt_plus
180 use dc_types, only: string, sp
181 use dc_string
182 implicit none
183 type(gd_nc_variable), intent(in) :: var
184 character(len = *), intent(in) :: name
185 integer, intent(out):: stat
186 real(SP), intent(out):: value(:)
187 real(SP), intent(in), optional:: default
188 real(SP), allocatable:: rbuffer(:)
189 character(STRING) :: cbuffer
190 character(STRING), pointer :: lbuffer(:)
191 integer :: attrlen, xtype, i, xferend, iname, varid
192 type(gd_nc_variable_entry):: ent
193 continue
194 stat = vtable_lookup(var, ent)
195 if (stat /= nf90_noerr) then
196 if (present(default)) value(:) = default
197 return
198 endif
199 ! 型と長さを取得
200 if (name(1:1) == gt_plus) then
201 iname = 2
202 varid = nf90_global
203 else
204 iname = 1
205 varid = ent%varid
206 endif
207 stat = nf90_inquire_attribute(ent%fileid, varid, &
208 name = name(iname:), xtype = xtype, len = attrlen)
209 if (stat /= nf90_noerr) then
210 if (present(default)) value(:) = default
211 return
212 endif
213 ! 文字型の場合は長さをコンマで分解した語数と読み替える
214 if (xtype == nf90_char) then
215 call get_attr(var, name, cbuffer, "", stat)
216 if (stat /= 0) return
217 call split(cbuffer, lbuffer, ", ")
218 attrlen = size(lbuffer)
219 endif
220 ! 結果を入れるところがなければ長さだけを伝え終了
221 if (size(value) == 0) then
222 if (xtype == nf90_char) deallocate(lbuffer)
223 stat = attrlen
224 return
225 endif
226 ! 型に応じて要求されただけ値を転送
227 xferend = min(size(value), attrlen)
228 if (present(default)) value(xferend+1: ) = default
229 if (xtype == nf90_char) then
230 do, i = 1, xferend
231 value(i) = real(stod(lbuffer(i)), kind=kind(value(i)))
232 enddo
233 deallocate(lbuffer)
234 stat = attrlen
235 return
236 else
237 allocate(rbuffer(attrlen), stat=stat)
238 if (stat /= 0) then
239 stat = nf90_enomem
240 return
241 endif
242 stat = nf90_get_att(ent%fileid, varid, name(iname:), rbuffer)
243 if (stat == nf90_noerr) then
244 value(1:xferend) = rbuffer(1:xferend)
245 stat = attrlen
246 endif
247 deallocate(rbuffer)
248 return
249 endif
250end subroutine gdncattrgetreal
270subroutine gdncattrgetdouble(var, name, value, stat, default)
273 use netcdf, only: &
274 & nf90_noerr, &
275 & nf90_global, &
276 & nf90_char, &
277 & nf90_enomem, &
278 & nf90_inquire_attribute, &
279 & nf90_get_att
280 use dc_url, only: gt_plus
282 use dc_types, only: string, dp
283 use dc_string
284 implicit none
285 type(gd_nc_variable), intent(in) :: var
286 character(len = *), intent(in) :: name
287 integer, intent(out):: stat
288 real(DP), intent(out):: value(:)
289 real(DP), intent(in), optional:: default
290 real(DP), allocatable:: rbuffer(:)
291 character(STRING) :: cbuffer
292 character(STRING), pointer :: lbuffer(:)
293 integer :: attrlen, xtype, i, xferend, iname, varid
294 type(gd_nc_variable_entry):: ent
295 continue
296 stat = vtable_lookup(var, ent)
297 if (stat /= nf90_noerr) then
298 if (present(default)) value(:) = default
299 return
300 endif
301 ! 型と長さを取得
302 if (name(1:1) == gt_plus) then
303 iname = 2
304 varid = nf90_global
305 else
306 iname = 1
307 varid = ent%varid
308 endif
309 stat = nf90_inquire_attribute(ent%fileid, varid, &
310 name = name(iname:), xtype = xtype, len = attrlen)
311 if (stat /= nf90_noerr) then
312 if (present(default)) value(:) = default
313 return
314 endif
315 ! 文字型の場合は長さをコンマで分解した語数と読み替える
316 if (xtype == nf90_char) then
317 call get_attr(var, name, cbuffer, "", stat)
318 if (stat /= 0) return
319 call split(cbuffer, lbuffer, ", ")
320 attrlen = size(lbuffer)
321 endif
322 ! 結果を入れるところがなければ長さだけを伝え終了
323 if (size(value) == 0) then
324 if (xtype == nf90_char) deallocate(lbuffer)
325 stat = attrlen
326 return
327 endif
328 ! 型に応じて要求されただけ値を転送
329 xferend = min(size(value), attrlen)
330 if (present(default)) value(xferend+1: ) = default
331 if (xtype == nf90_char) then
332 do, i = 1, xferend
333 value(i) = stod(lbuffer(i))
334 enddo
335 deallocate(lbuffer)
336 stat = attrlen
337 return
338 else
339 allocate(rbuffer(attrlen), stat=stat)
340 if (stat /= 0) then
341 stat = nf90_enomem
342 return
343 endif
344 stat = nf90_get_att(ent%fileid, varid, name(iname:), rbuffer)
345 if (stat == nf90_noerr) then
346 value(1:xferend) = rbuffer(1:xferend)
347 stat = attrlen
348 endif
349 deallocate(rbuffer)
350 return
351 endif
352end subroutine gdncattrgetdouble
subroutine gdncattrgetreal(var, name, value, stat, default)
subroutine gdncattrgetdouble(var, name, value, stat, default)
subroutine gdncattrgetint(var, name, value, stat, default)
Handling character types.
Definition dc_string.f90:83
Provides kind type parameter values.
Definition dc_types.f90:55
integer, parameter, public sp
Single Precision Real number.
Definition dc_types.f90:82
integer, parameter, public dp
Double Precision Real number
Definition dc_types.f90:92
integer, parameter, public string
Character length for string
Definition dc_types.f90:137
Variable URL string parser.
Definition dc_url.f90:61
character, parameter, public gt_plus
Definition dc_url.f90:109
integer function, public vtable_lookup(var, entry)