bonjour,
Je n'arrive pas à créer un fichier netcdf à partir de fortran.
Tout d'abord j'ai un fichier file.cdl que je transforme en file.f90 comme suit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
ncgen -f -o file.nc file.cdl > file.f90
fichier file.cdl
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
netcdf file_cdl {	 // example of CDL notation for a netCDF dataset
 
dimensions: 		 // dimension names and lengths are declared first
	lat = 5, lon = 10, level = 4, time = unlimited;
 
variables: 		 // variable types, names, shapes, attributes
	float temp(time,level,lat,lon);
		temp:long_name = "temperature";
		temp:units = "celsius";
	float rh(time,lat,lon);
		rh:long_name = "relative humidity";
		rh:valid_range = 0.0, 1.0; // min and max
	int lat(lat), lon(lon), level(level);
		lat:units = "degrees_north";
		lon:units = "degrees_east";
		level:units = "millibars";
	short time(time);
		time:units = "hours since 1996-1-1";
	// global attributes
		:source = "MESONH OUTPUT";
data:		 // optional data assignments
	level = 1000, 850, 700, 500;
	lat = 20, 30, 40, 50, 60;
	lon = -160,-140,-118,-96,-84,-52,-45,-35,-25,-15;
	time = 12;
	rh =.5,.2,.4,.2,.3,.2,.4,.5,.6,.7,
	.1,.3,.1,.1,.1,.1,.5,.7,.8,.8,
	.1,.2,.2,.2,.2,.5,.7,.8,.9,.9,
	.1,.2,.3,.3,.3,.3,.7,.8,.9,.9,
	0,.1,.2,.4,.4,.4,.4,.7,.9,.9;
}
Ci joint voici le programme que je cherche à exécuter
J'obtiens le fichier file.f90 suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
 
      program fgennc
      include 'netcdf.inc'
!* error status return
      integer  iret
!* netCDF id
      integer  ncid
!* dimension ids
      integer  lat_dim
      integer  lon_dim
      integer  level_dim
      integer  time_dim
!* dimension lengths
      integer  lat_len
      integer  lon_len
      integer  level_len
      integer  time_len
      parameter (lat_len = 5)
      parameter (lon_len = 10)
      parameter (level_len = 4)
      parameter (time_len = UNLIMITED)
!* variable ids
      integer  temp_id
      integer  rh_id
      integer  lat_id
      integer  lon_id
      integer  level_id
      integer  time_id
!* rank (number of dimensions) for each variable
      integer  temp_rank
      integer  rh_rank
      integer  lat_rank
      integer  lon_rank
      integer  level_rank
      integer  time_rank
      parameter (temp_rank = 4)
      parameter (rh_rank = 3)
      parameter (lat_rank = 1)
      parameter (lon_rank = 1)
      parameter (level_rank = 1)
      parameter (time_rank = 1)
!* variable shapes
      integer  temp_dims(temp_rank)
      integer  rh_dims(rh_rank)
      integer  lat_dims(lat_rank)
      integer  lon_dims(lon_rank)
      integer  level_dims(level_rank)
      integer  time_dims(time_rank)
!* data variables
      integer  lat(lat_len)
      integer  lon(lon_len)
      integer  level(level_len)
!* attribute vectors
      double precision  doubleval(2)
!* enter define mode
      iret = nf_create('file_bis.nc', NF_CLOBBER, ncid)
      call check_err(iret)
!* define dimensions
      iret = nf_def_dim(ncid, 'lat', 5, lat_dim)
      call check_err(iret)
      iret = nf_def_dim(ncid, 'lon', 10, lon_dim)
      call check_err(iret)
      iret = nf_def_dim(ncid, 'level', 4, level_dim)
      call check_err(iret)
      iret = nf_def_dim(ncid, 'time', NF_UNLIMITED, time_dim)
      call check_err(iret)
!* define variables
      temp_dims(4) = time_dim
      temp_dims(3) = level_dim
      temp_dims(2) = lat_dim
      temp_dims(1) = lon_dim
      iret = nf_def_var(ncid, 'temp', NF_REAL, temp_rank, temp_dims, te&
      mp_id)
      call check_err(iret)
      rh_dims(3) = time_dim
      rh_dims(2) = lat_dim
      rh_dims(1) = lon_dim
      iret = nf_def_var(ncid, 'rh', NF_REAL, rh_rank, rh_dims, rh_id)
      call check_err(iret)
      lat_dims(1) = lat_dim
      iret = nf_def_var(ncid, 'lat', NF_INT, lat_rank, lat_dims, lat_id)
      call check_err(iret)
      lon_dims(1) = lon_dim
      iret = nf_def_var(ncid, 'lon', NF_INT, lon_rank, lon_dims, lon_id)
      call check_err(iret)
      level_dims(1) = level_dim
      iret = nf_def_var(ncid, 'level', NF_INT, level_rank, level_dims,&
      level_id)
      call check_err(iret)
      time_dims(1) = time_dim
      iret = nf_def_var(ncid, 'time', NF_INT2, time_rank, time_dims, ti&
      me_id)
      call check_err(iret)
!* assign attributes
      iret = nf_put_att_text(ncid, temp_id, 'long_name', 11, 'temperatu&
      re')
      call check_err(iret)
      iret = nf_put_att_text(ncid, temp_id, 'units', 7, 'celsius')
      call check_err(iret)
      iret = nf_put_att_text(ncid, rh_id, 'long_name', 17, 'relative hu&
      midity')
      call check_err(iret)
      doubleval(1) = 0
      doubleval(2) = 1
      iret = nf_put_att_double(ncid, rh_id, 'valid_range', NF_DOUBLE, &
      2, doubleval)
      call check_err(iret)
      iret = nf_put_att_text(ncid, lat_id, 'units', 13, 'degrees_north')
      call check_err(iret)
      iret = nf_put_att_text(ncid, lon_id, 'units', 12, 'degrees_east')
      call check_err(iret)
      iret = nf_put_att_text(ncid, level_id, 'units', 9, 'millibars')
      call check_err(iret)
      iret = nf_put_att_text(ncid, time_id, 'units', 20, &
      'hours since 1996-1-1')
      call check_err(iret)
      iret = nf_put_att_text(ncid, NF_GLOBAL, 'source', 13, &
       'MESONH OUTPUT')
      call check_err(iret)
!* leave define mode
      iret = nf_enddef(ncid)
      call check_err(iret)
!* store level
      data level /1000, 850, 700, 500/
      iret = nf_put_var_int(ncid, level_id, level)
      call check_err(iret)
!* store lat
      data lat /20, 30, 40, 50, 60/
      iret = nf_put_var_int(ncid, lat_id, lat)
      call check_err(iret)
!* store lon
      data lon /-160, -140, -118, -96, -84, -52, -45, -35, -25, -15/
      iret = nf_put_var_int(ncid, lon_id, lon)
      call check_err(iret)
 
!* Write record variables
      call writerecs(ncid,temp_id,rh_id,time_id)
 
      iret = nf_close(ncid)
      call check_err(iret)
      end
 
      subroutine writerecs(ncid,temp_id,rh_id,time_id)
 
!* netCDF id
      integer  ncid
!* variable ids
      integer  temp_id
      integer  rh_id
      integer  time_id
 
      include 'netcdf.inc'
!* error status return
      integer  iret
 
!* netCDF dimension sizes for dimensions used with record variables
      integer  lat_len
      parameter (lat_len = 5)
      integer  lon_len
      parameter (lon_len = 10)
      integer  level_len
      parameter (level_len = 4)
 
!* rank (number of dimensions) for each variable
      integer  temp_rank
      integer  rh_rank
      integer  time_rank
      parameter (temp_rank = 4)
      parameter (rh_rank = 3)
      parameter (time_rank = 1)
!* starts and counts for array sections of record variables
      integer  temp_start(temp_rank), temp_count(temp_rank)
      integer  rh_start(rh_rank), rh_count(rh_rank)
      integer  time_start(time_rank), time_count(time_rank)
 
!* data variables
 
      integer  temp_nr
      parameter (temp_nr = 1)
      real  temp(lon_len, lat_len, level_len, temp_nr)
 
      integer  rh_nr
      parameter (rh_nr = 1)
      real  rh(lon_len, lat_len, rh_nr)
 
      integer  time_nr
      parameter (time_nr = 1)
      integer  time(time_nr)
 
      data temp /200 * NF_FILL_FLOAT/
      data rh /0.5, 0.2, 0.40000001, 0.2, 0.30000001,&
              0.2, 0.40000001, 0.5, 0.60000002, 0.69999999,&
              0.1, 0.30000001, 0.1, 0.1, 0.1, &
             0.1, 0.5, 0.69999999, 0.80000001, 0.80000001,&
              0.1, 0.2, 0.2, 0.2, 0.2,&
             0.5, 0.69999999, 0.80000001, 0.89999998, 0.89999998, &
               0.1, 0.2,  0.30000001, 0.30000001, 0.30000001, &
              0.30000001, 0.69999999, 0.80000001,0.89999998,0.89999998,&
               0, 0.1, 0.2, 0.40000001, 0.40000001,&
               0.40000001, 0.40000001, 0.69999999, 0.89999998, 0.89999998/
      data time /12/
 
!* store rh
      rh_start(1) = 1
      rh_start(2) = 1
      rh_start(3) = 1
      rh_count(1) = lon_len
      rh_count(2) = lat_len
      rh_count(3) = rh_nr
      iret = nf_put_vara_real(ncid, rh_id, rh_start, rh_count, rh)
      call check_err(iret)
!* store time
      time_start(1) = 1
      time_count(1) = time_nr
      iret = nf_put_vara_int(ncid, time_id, time_start, time_count, &
      time)
      call check_err(iret)
 
      end
 
      subroutine check_err(iret)
      integer iret
      include 'netcdf.inc'
      if (iret .ne. NF_NOERR) then
      print *, nf_strerror(iret)
      stop
      endif
      end
Je n'arrive pas à compiler le fichier file.f90 ainsi obtenu

Merci pour votre aide