10 & nf90_64bit_offset, &
13 use dc_message
, only: messagenotify
16 use dc_trace
, only: beginsub, endsub
18 integer,
intent(out):: fileid
19 character(len = *),
intent(in):: filename
20 logical,
intent(in),
optional:: writable
27 logical,
intent(in),
optional:: overwrite
34 logical,
intent(out),
optional:: err
35 integer,
intent(out),
optional:: stat
36 logical:: writable_required
37 logical:: overwrite_required
38 type(gd_nc_file_id_entry),
pointer:: identptr, prev
39 integer:: mystat, mode
40 character(len = 256):: real_filename
41 character(len = STRING):: cause_c
42 character(*),
parameter:: subname =
"GDNcFileOpen" 48 writable_required = .false.
49 overwrite_required = .false.
50 if (
present(writable)) writable_required = writable
51 if (
present(overwrite)) overwrite_required = overwrite
52 call beginsub(subname,
'writable=%y overwrite=%y file=%c', &
53 & l=(/writable_required, overwrite_required/), c1=trim(filename))
61 if ((identptr % filename == filename) &
62 & .and. (identptr % writable .or. .not. writable_required))
then 63 fileid = identptr % id
64 identptr % count = identptr % count + 1
65 if (
present(err)) err = .false.
66 if (
present(stat)) stat = nf90_noerr
71 identptr => identptr % next
72 if (.not.
associated(identptr))
exit 82 nullify(identptr % next)
83 identptr % filename = filename
84 identptr % writable = writable_required
89 real_filename = filename
90 if (real_filename(1:8) ==
'file:///')
then 91 real_filename = real_filename(8: )
92 else if (real_filename(1:5) ==
'file:' .AND. real_filename(6:6) /=
'/')
then 93 real_filename = real_filename(6: )
99 if (writable_required) mode = ior(mode, nf90_write)
101 mystat = nf90_open(real_filename, mode, identptr % id)
105 if (mystat == nf90_noerr)
then 107 if (writable_required)
then 108 if (overwrite_required)
then 111 call messagenotify(
'M', subname, &
112 &
'"%c" is overwritten.', c1=trim(filename), rank_mpi = -1)
115 mode = nf90_noclobber
116 call messagenotify(
'W', subname, &
117 &
'"%c" is opened in write-protect mode.', c1=trim(filename), rank_mpi = -1)
119 mode = ior(mode,nf90_64bit_offset)
120 mystat = nf90_create(real_filename, mode, identptr % id)
121 if (mystat /= nf90_noerr)
then 123 if (
present(stat)) stat = mystat
132 if (.not. writable_required)
then 136 if (mystat /= nf90_noerr)
then 138 if (
present(stat)) stat = mystat
145 mode = ior(mode,nf90_64bit_offset)
146 mystat = nf90_create(real_filename, mode, identptr % id)
147 if (mystat /= nf90_noerr)
then 149 if (
present(stat)) stat = mystat
155 fileid = identptr % id
158 if (mystat /= nf90_noerr)
then 159 if (
associated(prev))
then 160 prev%next => identptr % next
169 if (
present(stat))
then 171 if (
present(err)) err = (stat /= nf90_noerr)
177 call storeerror(mystat, subname, err, cause_c)
178 call endsub(subname,
'id=%d stat=%d', i=(/fileid, mystat/))
subroutine, public storeerror(number, where, err, cause_c, cause_i)
type(gd_nc_file_id_entry), pointer, save id_head
Provides kind type parameter values.
integer, parameter, public string
Character length for string.