/[MITgcm]/MITgcm_contrib/gmaze_pv/eg_write_bin2cdf_csgrid_subdomain.m
ViewVC logotype

Annotation of /MITgcm_contrib/gmaze_pv/eg_write_bin2cdf_csgrid_subdomain.m

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (hide annotations) (download)
Wed Sep 19 15:37:38 2007 UTC (16 years, 8 months ago) by gmaze
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +0 -0 lines
General Update

1 gmaze 1.1 % Script to extract a subdomain from a CS510 simulation
2     % and write in netCDF format on a regular lat/lon grid (1/4)
3     %
4     clear
5     global sla
6     pv_checkpath
7    
8    
9     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Global setup:
10     % Restrict global domain to:
11     subdomain = 3; % North Atlantic
12    
13     % Path to find input binary Cube sphere files:
14     pathi = './bin_cube49';
15    
16     % Path where the netcdf outputs will be stored:
17     patho = './ecco2_cube49_netcdf';
18     patho = strcat(patho,sla,'monthly');
19     %patho = strcat(patho,sla,'six_hourly');
20    
21     % Time step (for date conversion):
22     dt = 1200;
23    
24     % Variables to analyse (index into otab):
25     otab = cs510grid_outputs_table; % from the 1/8 latlon definition
26     wvar = [];
27     dimen = 3;
28     switch dimen
29     case 3 % 3D fields:
30     %wvar = [wvar 34]; % THETA
31     %wvar = [wvar 31]; % RHOAnoma
32     %wvar = [wvar 33]; % SALTanom
33     case 2 % 2D fields:
34     wvar = [wvar 23]; % TFLUX
35     %wvar = [wvar 20]; % SST
36     %wvar = [wvar 19]; % SSS
37     end %switch number of dimensions
38    
39     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Pre-process
40     % Get the grid:
41     path_grid = './grid';
42     XC = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'XC')),1,'float32');
43     YC = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'YC')),1,'float32');
44     XG = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'XG')),1,'float32');
45     YG = readrec_cs510(sprintf('%s.data',strcat(path_grid,sla,'YG')),1,'float32');
46     GRID_125;
47     ZC = - [0 cumsum(thk125(1:length(thk125)-1))];
48     clear dpt125 lat125 lon125 thk125
49    
50     % How to move to a lat/lon grid:
51     % CS510 is about 22km average resolution, ie: 1/4 degree
52     XI = -180 : 1/4 : 180;
53     YI = -90 : 1/4 : 90;
54     ZI = ZC;
55     if ~exist('CS510_to_LATLON025.mat','file')
56     del = cube2latlon_preprocess(XC,YC,XI,YI);
57     save('CS510_to_LATLON025.mat','XI','YI','XC','YC','del','-v6');
58     else
59     load('CS510_to_LATLON025.mat')
60     end
61    
62     % Set subrange - Longitude given as degrees east
63     % (exact values come from the 1/8 lat-lon grid)
64     switch subdomain
65     case 3
66     sub_name = 'north_atlantic';
67     lonmin = 276.0625;
68     lonmax = 359.9375;
69     latmin = 12.0975;
70     latmax = 53.2011;
71     depmin = 1; % !!! indices
72     depmax = 29; % !!! indices
73     if dimen == 3, depmax = 29,
74     else, depmax = 1;end
75     LIMITS = [lonmin lonmax latmin latmax depmin depmax]
76     if 0
77     m_proj('mercator','long',[270 365],'lat',[0 60]);
78     clf;hold on;m_coast;m_grid;
79     m_line(LIMITS([1 2 2 1 1]),LIMITS([3 3 4 4 3]),'color','k','linewidth',2);
80     title(sub_name);
81     end %if 1/0
82     end
83    
84     % Get subdomain horizontal axis:
85     xi = XI(max(find(XI<=LIMITS(1))):max(find(XI<=LIMITS(2))));
86     yi = YI(max(find(YI<=LIMITS(3))):max(find(YI<=LIMITS(4))));
87     zi = ZI(LIMITS(5):LIMITS(6));
88    
89     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Loop over variables to read
91     for i = 1 : length(wvar)
92     ifield = wvar(i);
93     fil = otab{ifield,1};
94    
95     % %%%%%%%%%%%%%%%%%%%%%%%%%%%%
96     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Get info over the time loop
97     % Get the file list:
98     fild = fil; % Insert condition here for special files:
99     if ifield == 23 & findstr(patho,'six')
100     fild = 'surForcT';
101     fil = 'surForcT';
102     end
103     l = dir(strcat(pathi,sla,fild));
104     it = 0;
105     clear ll
106     for il = 1 : size(l,1)
107     if ~l(il).isdir & findstr(l(il).name,strcat(fil,'.')) % is'it the file type we want ?
108     it = it + 1;
109     ll(it).name = l(il).name;
110     end %if
111     end %for il
112     % Create the timetable:
113     for il = 1 : size(ll,2)
114     filin = ll(il).name;
115     % Now extract the stepnum from : %s.%10.10d.data
116     ic = findstr(filin,fil)+length(fil)+1; i = 1; clear stepnum
117     while filin(ic) ~= '.'
118     stepnum(i) = filin(ic); i = i + 1; ic = ic + 1;
119     end
120     ID = str2num(stepnum);
121     TIME(il,:) = datestr(datenum(1992,1,1)+ID*dt/60/60/24,'yyyymmddHHMM');
122     end
123     nt = size(TIME,1);
124    
125     % %%%%%%%%%%%%%%%
126     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Loop over time
127     for it = 1 : nt
128     snapshot = TIME(it,:);
129     ID = 60*60*24/dt*( datenum(snapshot,'yyyymmddHHMM') - datenum(1992,1,1) );
130     filin = ll(it).name;
131     disp('')
132     disp(strcat('Processing: ',fil,'//',snapshot))
133     dirout = strcat(patho,sla,TIME(it,:),sla);
134     filout = sprintf('%s.%s.nc',otab{ifield,1},sub_name);
135    
136     if ~exist(strcat(dirout,sla,filout),'file') % File already exists ?
137    
138     %%%% READ THE FILE
139     switch otab{ifield,6}
140     case 4, flt = 'float32';
141     case 8, flt = 'float64';
142     end
143     t0 = clock;
144     if findstr(filin,'.gz') % Gunzip file, special care !
145     disp('|----> Find a file with gz extension, work on uncompressed file ...')
146    
147     % 1: copy the filename with it path into gunzip_1_file.txt
148     fid1 = fopen('gunzip_1_file.txt','w');
149     fprintf(fid1,'%s',strcat(pathi,sla,fild,sla,filin));fclose(fid1);
150    
151     % 2: uncompress the file into a temporary folder:
152     disp('|------> uncompressing the file ...')
153     ! ./gunzip_1_file.bat
154     disp(strcat('|--------: ',num2str(etime(t0,clock))))
155    
156     % 3: Read the uncompress file:
157     disp('|--> reading it ...')
158     C = readrec_cs510(strcat('gunzip_1_file',sla,'tempo.data'),LIMITS(6),flt);
159     disp(strcat('|----: ',num2str(etime(t0,clock))))
160    
161     % 4: Suppress it
162     ! \rm ./gunzip_1_file/tempo.data
163    
164     else % Simply read the file:
165     disp('|--> reading it ...')
166     C = readrec_cs510(strcat(pathi,sla,fild,sla,filin),LIMITS(6),flt);
167     disp(strcat('|----: ',num2str(etime(t0,clock))))
168     end
169    
170     %%%% RESTRICT TO SUBDOMAIN
171     disp('|--> get subdomain ...')
172     % Restrict vertical to subdomain:
173     if LIMITS(5) ~= 1
174     disp('|----> vertical ...');
175     C = C(:,:,LIMITS(5):end);
176     end
177     % Clean the field:
178     C(find(C==0)) = NaN;
179     % Move the field into lat/lon grid:
180     disp('|----> Move to lat/lon grid ...');
181     C = cube2latlon_fast(del,C);
182     % And then restrict horizontal to subdomain:
183     disp('|----> horizontal ...');
184     C = C(max(find(XI<=LIMITS(1))):max(find(XI<=LIMITS(2))),...
185     max(find(YI<=LIMITS(3))):max(find(YI<=LIMITS(4))),:);
186    
187    
188     %%%% RECORD
189     disp('|--> record netcdf file ...')
190     fid1 = fopen('inprogress.txt','w');
191     fprintf(fid1,'%s',strcat(dirout,sla,filout));fclose(fid1);
192    
193     if 1 % Realy want to record ?
194    
195     if ~exist(dirout,'dir')
196     mkdir(dirout);
197     end
198    
199    
200     nc = netcdf('inprogress.nc','clobber');
201    
202     nc('X') = length(xi);
203     nc('Y') = length(yi);
204     nc('Z') = length(zi);
205    
206     nc{'X'}='X';
207     nc{'Y'}='Y';
208     nc{'Z'}='Z';
209    
210     nc{'X'}.uniquename='X';
211     nc{'X'}.long_name='longitude';
212     nc{'X'}.gridtype=ncint(0);
213     nc{'X'}.units='degrees_east';
214     nc{'X'}(:) = xi;
215    
216     nc{'Y'}.uniquename='Y';
217     nc{'Y'}.long_name='latitude';
218     nc{'Y'}.gridtype=ncint(0);
219     nc{'Y'}.units='degrees_north';
220     nc{'Y'}(:) = yi;
221    
222     nc{'Z'}.uniquename='Z';
223     nc{'Z'}.long_name='depth';
224     nc{'Z'}.gridtype=ncint(0);
225     nc{'Z'}.units='m';
226     nc{'Z'}(:) = zi;
227    
228     ncid = fil;
229     nc{ncid}={'Z' 'Y' 'X'};
230     nc{ncid}.missing_value = ncdouble(NaN);
231     nc{ncid}.FillValue_ = ncdouble(0.0);
232     nc{ncid}(:,:,:) = permute(C,[3 2 1]);
233     nc{ncid}.units = otab{ifield,5};
234    
235     close(nc);
236     ! ./inprogress.bat
237    
238     end %if 1/0 want to record ?
239     disp(strcat('|--: ',num2str(etime(t0,clock))))
240    
241     else
242     disp(strcat('|--> Skip file (already done):',dirout,sla,filout))
243     end %if %file exist
244    
245     end %for it
246     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% END Loop over time
247     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
248    
249     end %if it
250     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% END Loop over variables to read
251     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  ViewVC Help
Powered by ViewVC 1.1.22