57subroutine gdncfileopen(fileid, filename, writable, overwrite, stat, err)
66 & nf90_64bit_offset, &
74 integer,
intent(out):: fileid
75 character(len = *),
intent(in):: filename
76 logical,
intent(in),
optional:: writable
77 logical,
intent(in),
optional:: overwrite
78 logical,
intent(out),
optional:: err
79 integer,
intent(out),
optional:: stat
80 logical:: writable_required
81 logical:: overwrite_required
83 integer:: mystat, mode
84 character(len = 256):: real_filename
85 character(len = STRING):: cause_c
86 character(*),
parameter:: subname =
"GDNcFileOpen"
92 writable_required = .false.
93 overwrite_required = .false.
94 if (
present(writable)) writable_required = writable
95 if (
present(overwrite)) overwrite_required = overwrite
96 call beginsub(subname,
'writable=%y overwrite=%y file=%c', &
97 & l=(/writable_required, overwrite_required/), c1=trim(filename))
105 if ((identptr % filename == filename) &
106 & .and. (identptr % writable .or. .not. writable_required))
then
107 fileid = identptr % id
108 identptr % count = identptr % count + 1
109 if (
present(err)) err = .false.
110 if (
present(stat)) stat = nf90_noerr
115 identptr => identptr % next
116 if (.not.
associated(identptr))
exit
119 prev%next => identptr
126 nullify(identptr % next)
127 identptr % filename = filename
128 identptr % writable = writable_required
133 real_filename = filename
134 if (real_filename(1:8) ==
'file:///')
then
135 real_filename = real_filename(8: )
136 else if (real_filename(1:5) ==
'file:' .AND. real_filename(6:6) /=
'/')
then
137 real_filename = real_filename(6: )
143 if (writable_required) mode = ior(mode, nf90_write)
145 mystat = nf90_open(real_filename, mode, identptr % id)
149 if (mystat == nf90_noerr)
then
151 if (writable_required)
then
152 if (overwrite_required)
then
156 &
'"%c" is overwritten.', c1=trim(filename), rank_mpi = -1)
159 mode = nf90_noclobber
161 &
'"%c" is opened in write-protect mode.', c1=trim(filename), rank_mpi = -1)
163 mode = ior(mode,nf90_64bit_offset)
164 mystat = nf90_create(real_filename, mode, identptr % id)
165 if (mystat /= nf90_noerr)
then
167 if (
present(stat)) stat = mystat
176 if (.not. writable_required)
then
180 if (mystat /= nf90_noerr)
then
182 if (
present(stat)) stat = mystat
189 mode = ior(mode,nf90_64bit_offset)
190 mystat = nf90_create(real_filename, mode, identptr % id)
191 if (mystat /= nf90_noerr)
then
193 if (
present(stat)) stat = mystat
199 fileid = identptr % id
202 if (mystat /= nf90_noerr)
then
203 if (
associated(prev))
then
204 prev%next => identptr % next
213 if (
present(stat))
then
215 if (
present(err)) err = (stat /= nf90_noerr)
221 call storeerror(mystat, subname, err, cause_c)
222 call endsub(subname,
'id=%d stat=%d', i=(/fileid, mystat/))
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)