21 use dc_trace
, only: dbgmessage
26 integer,
parameter:: gdnctab_init_size = 16
33 integer function vtable_add(var, entry)
result(result)
40 if (.not.
allocated(gdnctab))
then 41 allocate(gdnctab(gdnctab_init_size), stat=result)
42 if (result /= 0)
goto 999
43 do, i = 1, gdnctab_init_size
48 nullify(gdnctab(i)%dimids)
52 do, i = 1,
size(gdnctab)
53 if (gdnctab(i)%fileid == entry%fileid &
54 & .and. gdnctab(i)%varid == entry%varid &
55 & .and. gdnctab(i)%dimid == entry%dimid)
then 58 call dbgmessage(
'gtdata_netcdf_internal.add: found %d', i=(/i/))
65 do, i = 1,
size(gdnctab)
66 if (gdnctab(i)%fileid == 0)
then 71 if (var%id == -1)
then 74 allocate(tmp_table(n), stat=result)
75 if (result /= 0)
goto 999
76 tmp_table(:) = gdnctab(:)
77 deallocate(gdnctab, stat=result)
78 if (result /= 0)
goto 999
79 allocate(gdnctab(n * 2), stat=result)
80 if (result /= 0)
goto 999
81 gdnctab(1:n) = tmp_table(1:n)
82 deallocate(tmp_table, stat=result)
83 if (result /= 0)
goto 999
85 gdnctab(n+2)%fileid = 0
86 gdnctab(n+2)%varid = 0
87 gdnctab(n+2)%dimid = 0
88 gdnctab(n+2)%attrid = 0
89 nullify(gdnctab(n+2)%dimids)
90 gdnctab(n+3: n*2) = gdnctab(n+2)
94 gdnctab(var%id)%fileid = entry%fileid
95 gdnctab(var%id)%varid = entry%varid
96 gdnctab(var%id)%dimid = entry%dimid
99 call internal_build_dimids(gdnctab(var%id), result)
100 if (result /= nf90_noerr)
goto 999
103 call dbgmessage(
'gtdata_netcdf_internal.add: added %d', i=(/var%id/))
113 subroutine internal_build_dimids(ent, stat)
117 integer,
intent(out):: stat
119 if (ent%varid > 0)
then 120 stat = nf90_inquire_variable(ent%fileid, ent%varid, ndims = ndims)
121 if (stat /= nf90_noerr)
return 122 if ((ent%dimid > 0) .and. (ndims /= 1))
goto 100
128 allocate(ent%dimids(ndims), stat=stat)
133 stat = nf90_inquire_variable(ent%fileid, ent%varid, dimids = ent%dimids)
134 if (stat /= nf90_noerr)
return 135 if ((ent%dimid > 0) .and. (ent%dimids(1) /= ent%dimid))
then 136 deallocate(ent%dimids)
140 allocate(ent%dimids(1), stat=stat)
145 ent%dimids(1) = ent%dimid
152 allocate(ent%dimids(1))
153 ent%dimids(1) = ent%dimid
154 end subroutine internal_build_dimids
162 if (.not.
allocated(gdnctab))
goto 999
163 if (var%id <= 0 .or. var%id >
size(gdnctab))
goto 999
164 if (gdnctab(var%id)%fileid == 0)
goto 999
165 result = gdnctab(var%id)%fileid
166 gdnctab(var%id)%fileid = 0
167 gdnctab(var%id)%varid = 0
168 gdnctab(var%id)%dimid = 0
169 gdnctab(var%id)%attrid = 0
170 if (
associated(gdnctab(var%id)%dimids)) &
171 &
deallocate(gdnctab(var%id)%dimids)
172 call dbgmessage(
'gtdata_netcdf_internal.delete: delete %d', i=(/var%id/))
176 result = nf90_enotvar
182 if (.not.
allocated(gdnctab))
goto 999
183 if (var%id <= 0 .or. var%id >
size(gdnctab))
goto 999
184 if (gdnctab(var%id)%fileid == 0)
goto 999
185 entry = gdnctab(var%id)
190 nullify(entry%dimids)
195 result = nf90_enotvar
200 integer,
intent(in):: attrid
202 if (.not.
allocated(gdnctab))
goto 999
203 if (var%id <= 0 .or. var%id >
size(gdnctab))
goto 999
204 if (gdnctab(var%id)%fileid == 0)
goto 999
205 gdnctab(var%id)%attrid = attrid
210 result = nf90_enotvar
integer function, public vtable_lookup(var, entry)
integer function, public vtable_delete(var)
integer function, public vtable_add(var, entry)
integer function, public vtable_set_attrid(var, attrid)