gtool5 Fortran 90/95 Library 1.0.0-rc5
日本語
Loading...
Searching...
No Matches
Functions/Subroutines
gdncfileopen.f90 File Reference

Open a netCDF file . More...

Go to the source code of this file.

Functions/Subroutines

subroutine gdncfileopen (fileid, filename, writable, overwrite, stat, err)
 

Detailed Description

Open a netCDF file

.

Author
Yasuhiro MORIKAWA, Eizi TOYODA

Definition in file gdncfileopen.f90.

Function/Subroutine Documentation

◆ gdncfileopen()

subroutine gdncfileopen ( integer, intent(out)  fileid,
character(len = *), intent(in)  filename,
logical, intent(in), optional  writable,
logical, intent(in), optional  overwrite,
integer, intent(out), optional  stat,
logical, intent(out), optional  err 
)

Open a netCDF file

Opens a netCDF file with the specified access mode. If a file with the same name is already open with compatible access mode, returns the existing file ID and increments the reference count.

Supports partial URL format: file:///path and file:path are converted to plain file paths.

Parameters
[out]fileidFile ID
[in]filenameFile name
[in]writableWritable flag (optional, default: .false.)
  • .true.: write mode
  • .false.: read mode (error if file does not exist)
[in]overwriteOverwrite flag (optional, only valid when writable is .true.)
  • .true.: overwrite existing file
  • .false.: error if file exists
[out]statStatus code (optional)
[out]errError flag (optional)

Definition at line 57 of file gdncfileopen.f90.

60 use netcdf, only: &
61 & nf90_write, &
62 & nf90_nowrite, &
63 & nf90_noerr, &
64 & nf90_noclobber, &
65 & nf90_clobber, &
66 & nf90_64bit_offset, &
67 & nf90_open, &
68 & nf90_create
69 use dc_message, only: messagenotify
70 use dc_error, only: storeerror
71 use dc_types, only: string
72 use dc_trace, only: beginsub, endsub
73 implicit none
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
82 type(GD_NC_FILE_ID_ENTRY), pointer:: identptr, prev
83 integer:: mystat, mode
84 character(len = 256):: real_filename
85 character(len = STRING):: cause_c
86 character(*), parameter:: subname = "GDNcFileOpen"
87continue
88 fileid = -1
89 !
90 ! オプションの解釈
91 !
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))
98 !
99 ! 同じ名前で書込み可能性も適合していれば nf90_open しないで済ませる
100 !
101 if (id_used) then
102 identptr => id_head
103 nullify(prev)
104 do
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
111 mystat = nf90_noerr
112 goto 999
113 endif
114 prev => identptr
115 identptr => identptr % next
116 if (.not. associated(identptr)) exit
117 enddo
118 allocate(identptr)
119 prev%next => identptr
120 else
121 nullify(prev)
122 allocate(id_head)
123 identptr => id_head
124 id_used = .true.
125 endif
126 nullify(identptr % next)
127 identptr % filename = filename
128 identptr % writable = writable_required
129 identptr % count = 1
130 !
131 ! URL の部分的サポート
132 !
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: )
138 endif
139 !
140 ! いざ nf90_open
141 !
142 mode = nf90_nowrite
143 if (writable_required) mode = ior(mode, nf90_write)
144 ! 既に nc ファイルがあると思って開けてみる
145 mystat = nf90_open(real_filename, mode, identptr % id)
146 !
147 ! ファイルが既に存在する場合
148 !
149 if (mystat == nf90_noerr) then
150 ! 書き込みモードの場合
151 if (writable_required) then
152 if (overwrite_required) then
153 ! 上書きモードの場合
154 mode = nf90_clobber
155 call messagenotify('M', subname, &
156 & '"%c" is overwritten.', c1=trim(filename), rank_mpi = -1)
157 else
158 ! 上書き禁止モードの場合
159 mode = nf90_noclobber
160 call messagenotify('W', subname, &
161 & '"%c" is opened in write-protect mode.', c1=trim(filename), rank_mpi = -1)
162 end if
163 mode = ior(mode,nf90_64bit_offset)
164 mystat = nf90_create(real_filename, mode, identptr % id)
165 if (mystat /= nf90_noerr) then
166 cause_c=filename
167 if (present(stat)) stat = mystat
168 goto 999
169 end if
170 endif
171 ! 読み込みモードの場合は何もしない
172 else
173 !
174 ! ファイルが無かった場合
175 !
176 if (.not. writable_required) then
177 ! 読み込みモードの場合
178 !
179 ! 「無いよ」とエラーを吐いて終了
180 if (mystat /= nf90_noerr) then
181 cause_c=filename
182 if (present(stat)) stat = mystat
183 goto 999
184 end if
185 else
186 ! 書き込みモードの場合
187 mode = nf90_clobber
188 ! ファイルを作成する
189 mode = ior(mode,nf90_64bit_offset)
190 mystat = nf90_create(real_filename, mode, identptr % id)
191 if (mystat /= nf90_noerr) then
192 cause_c=filename
193 if (present(stat)) stat = mystat
194 goto 999
195 end if
196 endif
197 endif
198
199 fileid = identptr % id
200
201 ! 失敗したら消しておく
202 if (mystat /= nf90_noerr) then
203 if (associated(prev)) then
204 prev%next => identptr % next
205 else
206 id_head => identptr % next
207 if (.not. associated(id_head)) id_used = .false.
208 endif
209 deallocate(identptr)
210 fileid = -1
211 endif
212
213 if (present(stat)) then
214 stat = mystat
215 if (present(err)) err = (stat /= nf90_noerr)
216 else
217 cause_c=filename
218 goto 999
219 endif
220999 continue
221 call storeerror(mystat, subname, err, cause_c)
222 call endsub(subname, 'id=%d stat=%d', i=(/fileid, mystat/))
Error handling module.
Definition dc_error.f90:454
subroutine, public storeerror(number, where, err, cause_c, cause_i)
Definition dc_error.f90:891
Message output module.
Debug tracing module.
Definition dc_trace.f90:150
subroutine, public beginsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca, version)
Definition dc_trace.f90:476
subroutine, public endsub(name, fmt, i, r, d, l, n, c1, c2, c3, ca)
Definition dc_trace.f90:599
Provides kind type parameter values.
Definition dc_types.f90:55
integer, parameter, public string
Character length for string
Definition dc_types.f90:137
logical, save id_used
Flag indicating whether id_head has been initialized
type(gd_nc_file_id_entry), pointer, save id_head

References dc_trace::beginsub(), dc_trace::endsub(), gtdata_netcdf_file_internal::id_head, gtdata_netcdf_file_internal::id_used, dc_error::storeerror(), and dc_types::string.

Here is the call graph for this function: