1 |
gmaze |
1.1 |
% |
2 |
|
|
|
3 |
|
|
function latlon2ingrid_netcdf(pathname,pathout, ... |
4 |
|
|
stepnum,fpref,otab, ... |
5 |
|
|
lon_c, lon_u, ... |
6 |
|
|
lat_c, lat_v, ... |
7 |
|
|
z_c, z_w, ... |
8 |
|
|
subname, ... |
9 |
|
|
lonmin,lonmax,latmin,latmax,depmin,depmax); |
10 |
|
|
|
11 |
|
|
irow=strmatch({fpref},otab(:,1),'exact'); |
12 |
|
|
if length(irow) ~= 1 |
13 |
|
|
fprintf('Bad irow value in latlon2ingrid_netcdf2\n'); |
14 |
|
|
return |
15 |
|
|
end |
16 |
|
|
loc=otab{irow,3}; |
17 |
|
|
id=otab{irow,4}; |
18 |
|
|
units=otab{irow,5}; |
19 |
|
|
dimspec=otab{irow,2}; |
20 |
|
|
if strmatch(id,'unknown_id','exact') |
21 |
|
|
id = fpref; |
22 |
|
|
end |
23 |
|
|
fprintf('Field %s, loc=%s, id=%s, units=%s, dimspec=%s\n',fpref,loc,id,units,dimspec); |
24 |
|
|
wordlen=otab{irow,6}; |
25 |
|
|
if wordlen == 4 |
26 |
|
|
numfmt='float32'; |
27 |
|
|
end |
28 |
|
|
if wordlen == 8 |
29 |
|
|
numfmt='float64'; |
30 |
|
|
end |
31 |
|
|
%numfmt='float64'; |
32 |
|
|
%wordlen =8; |
33 |
|
|
|
34 |
|
|
%ilo_c=min(find(lon_c >= lonmin & lon_c <= lonmax)); |
35 |
|
|
%ilo_u=min(find(lon_u >= lonmin & lon_u <= lonmax)); |
36 |
|
|
%ihi_c=max(find(lon_c >= lonmin & lon_c <= lonmax)); |
37 |
|
|
%ihi_u=max(find(lon_u >= lonmin & lon_u <= lonmax)); |
38 |
|
|
ilo_c=min(find(lon_c-180 >= lonmin & lon_c-180 <= lonmax)); |
39 |
|
|
ilo_u=min(find(lon_u-180 >= lonmin & lon_u-180 <= lonmax)); |
40 |
|
|
ihi_c=max(find(lon_c-180 >= lonmin & lon_c-180 <= lonmax)); |
41 |
|
|
ihi_u=max(find(lon_u-180 >= lonmin & lon_u-180 <= lonmax)); |
42 |
|
|
jlo_c=min(find(lat_c >= latmin & lat_c <= latmax)); |
43 |
|
|
jlo_v=min(find(lat_v >= latmin & lat_v <= latmax)); |
44 |
|
|
jhi_c=max(find(lat_c >= latmin & lat_c <= latmax)); |
45 |
|
|
jhi_v=max(find(lat_v >= latmin & lat_v <= latmax)); |
46 |
|
|
klo_w=min(find(z_w >= depmin & z_w <= depmax)); |
47 |
|
|
khi_w=max(find(z_w >= depmin & z_w <= depmax)); |
48 |
|
|
klo_c=min(find(z_c >= depmin & z_c <= depmax)); |
49 |
|
|
khi_c=max(find(z_c >= depmin & z_c <= depmax)); |
50 |
|
|
|
51 |
|
|
fnam=sprintf('%s.%10.10d.data',fpref,stepnum); |
52 |
|
|
if loc == 'c' |
53 |
|
|
ilo=ilo_c; |
54 |
|
|
ihi=ihi_c; |
55 |
|
|
jlo=jlo_c; |
56 |
|
|
jhi=jhi_c; |
57 |
|
|
klo=klo_c; |
58 |
|
|
khi=khi_c; |
59 |
|
|
lon=lon_c; |
60 |
|
|
lat=lat_c; |
61 |
|
|
dep=-z_c; |
62 |
|
|
end |
63 |
|
|
if loc == 'u' |
64 |
|
|
ilo=ilo_u; |
65 |
|
|
ihi=ihi_u; |
66 |
|
|
jlo=jlo_c; |
67 |
|
|
jhi=jhi_c; |
68 |
|
|
klo=klo_c; |
69 |
|
|
khi=khi_c; |
70 |
|
|
lon=lon_u; |
71 |
|
|
lat=lat_c; |
72 |
|
|
dep=-z_c; |
73 |
|
|
end |
74 |
|
|
if loc == 'v' |
75 |
|
|
ilo=ilo_c; |
76 |
|
|
ihi=ihi_c; |
77 |
|
|
jlo=jlo_v; |
78 |
|
|
jhi=jhi_v; |
79 |
|
|
klo=klo_c; |
80 |
|
|
khi=khi_c; |
81 |
|
|
lon=lon_c; |
82 |
|
|
lat=lat_v; |
83 |
|
|
dep=-z_c; |
84 |
|
|
end |
85 |
|
|
if loc == 'w' |
86 |
|
|
ilo=ilo_c; |
87 |
|
|
ihi=ihi_c; |
88 |
|
|
jlo=jlo_c; |
89 |
|
|
jhi=jhi_c; |
90 |
|
|
klo=klo_w; |
91 |
|
|
khi=khi_w; |
92 |
|
|
lon=lon_c; |
93 |
|
|
lat=lat_v; |
94 |
|
|
dep=-z_w; |
95 |
|
|
end |
96 |
|
|
|
97 |
|
|
nx=1;ny=1;nz=1; |
98 |
|
|
if strmatch(dimspec,'xyz','exact'); |
99 |
|
|
nx=length(lon); |
100 |
|
|
ny=length(lat); |
101 |
|
|
nz=length(dep); |
102 |
|
|
end |
103 |
|
|
if strmatch(dimspec,'xy','exact'); |
104 |
|
|
nx=length(lon); |
105 |
|
|
ny=length(lat); |
106 |
|
|
end |
107 |
|
|
|
108 |
|
|
if klo > nz |
109 |
|
|
klo = nz; |
110 |
|
|
end |
111 |
|
|
if khi > nz |
112 |
|
|
khi = nz; |
113 |
|
|
end |
114 |
|
|
|
115 |
|
|
phiXYZ=zeros(ihi-ilo+1,jhi-jlo+1,khi-klo+1,'single'); |
116 |
|
|
disp(strcat('in:',pathname,fnam)) |
117 |
|
|
%[klo khi khi-klo+1] |
118 |
|
|
|
119 |
|
|
% Read a single level (selected by k) |
120 |
|
|
for k = klo : khi |
121 |
|
|
fid = fopen(strcat(pathname,fnam),'r','ieee-be'); |
122 |
|
|
fseek(fid,(k-1)*nx*ny*wordlen,'bof'); |
123 |
|
|
phi = fread(fid,nx*ny,numfmt); |
124 |
|
|
%whos phi, [k nx ny] |
125 |
|
|
phiXY = reshape(phi,[nx ny]); |
126 |
|
|
phiXY = phiXY(ilo:ihi,jlo:jhi); |
127 |
|
|
phiXYZ(:,:,k) = phiXY; |
128 |
|
|
%phiXYZ(100,100,k) |
129 |
|
|
fclose(fid); |
130 |
|
|
end |
131 |
|
|
|
132 |
|
|
%%%clear phi; |
133 |
|
|
%%%clear phiXY; |
134 |
|
|
phiXYZ(find(phiXYZ==0))=NaN; |
135 |
|
|
|
136 |
|
|
if subname == ' ' |
137 |
|
|
%outname=sprintf('%s.nc',id); |
138 |
|
|
outname = sprintf('%s.nc',otab{irow,1}); |
139 |
|
|
else |
140 |
|
|
%outname=sprintf('%s_%s.nc',subname,id); |
141 |
|
|
outname = sprintf('%s.%s.nc',otab{irow,1},subname); |
142 |
|
|
%outname = sprintf('%s.%s.nc',strcat(otab{irow,1},'s'),subname); |
143 |
|
|
|
144 |
|
|
end |
145 |
|
|
nc = netcdf(strcat(pathout,outname),'clobber'); |
146 |
|
|
%disp(strcat(pathout,outname)) |
147 |
|
|
|
148 |
|
|
nc('X')=ihi-ilo+1; |
149 |
|
|
nc('Y')=jhi-jlo+1; |
150 |
|
|
nc('Z')=khi-klo+1; |
151 |
|
|
|
152 |
|
|
nc{'X'}='X'; |
153 |
|
|
nc{'Y'}='Y'; |
154 |
|
|
nc{'Z'}='Z'; |
155 |
|
|
|
156 |
|
|
nc{'X'}.uniquename='X'; |
157 |
|
|
nc{'X'}.long_name='longitude'; |
158 |
|
|
nc{'X'}.gridtype=ncint(0); |
159 |
|
|
nc{'X'}.units='degrees_east'; |
160 |
|
|
nc{'X'}(:) = lon(ilo:ihi); |
161 |
|
|
|
162 |
|
|
nc{'Y'}.uniquename='Y'; |
163 |
|
|
nc{'Y'}.long_name='latitude'; |
164 |
|
|
nc{'Y'}.gridtype=ncint(0); |
165 |
|
|
nc{'Y'}.units='degrees_north'; |
166 |
|
|
nc{'Y'}(:) = lat(jlo:jhi); |
167 |
|
|
|
168 |
|
|
nc{'Z'}.uniquename='Z'; |
169 |
|
|
nc{'Z'}.long_name='depth'; |
170 |
|
|
nc{'Z'}.gridtype=ncint(0); |
171 |
|
|
nc{'Z'}.units='m'; |
172 |
|
|
nc{'Z'}(:) = dep(klo:khi); |
173 |
|
|
|
174 |
|
|
ncid=id; |
175 |
|
|
nc{ncid}={'Z' 'Y' 'X'}; |
176 |
|
|
nc{ncid}.missing_value = ncdouble(NaN); |
177 |
|
|
nc{ncid}.FillValue_ = ncdouble(0.0); |
178 |
|
|
nc{ncid}(:,:,:) = permute(phiXYZ,[3 2 1]); |
179 |
|
|
nc{ncid}.units=units; |
180 |
|
|
|
181 |
|
|
close(nc); |