0001 function data = get_MetUM_forcing(Mobj, modelTime, credentials)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 subname = 'get_MetUM_forcing';
0053
0054 global ftbverbose;
0055 if ftbverbose;
0056 fprintf('\nbegin : %s \n', subname)
0057 end
0058
0059
0060 if ~Mobj.have_lonlat
0061 error('Need spherical coordinates to extract the forcing data')
0062 else
0063
0064
0065 [dx, dy] = deal(1, 1);
0066 extents = [min(Mobj.lon(:))-(2*dx), max(Mobj.lon(:))+(2*dx), min(Mobj.lat(:))-dy, max(Mobj.lat(:))+dy];
0067 end
0068
0069 nt = modelTime(end) - modelTime(1);
0070 if nt > 365
0071 error('Can''t (yet) process more than a year at a time.')
0072 end
0073
0074 [yearStart, monthStart, dayStart] = mjulian2greg(modelTime(1));
0075 [yearEnd, monthEnd, dayEnd] = mjulian2greg(modelTime(end));
0076 t = modelTime(1):1/4:modelTime(end);
0077
0078 if yearEnd ~= yearStart
0079 error('Can''t (yet) process across a year boundary.')
0080 end
0081
0082 if yearStart < 2006 || yearEnd > 2012
0083 error('The MetUM repository does not contain data earlier than 2006 and later than 2012')
0084 end
0085
0086
0087
0088
0089
0090 stash = [2, 3, 407, 408, 409, 4222, 9229, 16004];
0091 vars = {'uwnd', 'uwnd', 'vwnd', 'vwnd', 'slp_rho', 'slp_theta', ...
0092 'surface_air_pressure', 'air_sw', 'air_lw', ...
0093 'rhum', 'prate', 'temp_model', 'temp_press'};
0094
0095 ns = length(stash);
0096
0097
0098 site = 'ftp.ceda.ac.uk';
0099 basePath = 'badc/ukmo-um/data/nae/';
0100
0101
0102 remote = ftp(site, credentials(1), credentials(2));
0103
0104
0105
0106 for i = 1:nt * 4
0107
0108 [year, month, day, hour] = mjulian2greg(t(i));
0109
0110
0111 files = cell(0);
0112
0113
0114 if year == 2010
0115 if month < 11 && day < 4
0116
0117 prefix = 'am';
0118 URL = sprintf('%sna/%s/%04d/%02d/%02d', basePath, ...
0119 prefix, ...
0120 year, ...
0121 month, ...
0122 day);
0123 for f = 1:ns
0124 files{f} = sprintf('na%s%04d%02d%02d%02d_%05d_00.pp', ...
0125 prefix, ...
0126 year, ...
0127 month, ...
0128 day, ...
0129 hour, ...
0130 stash(f));
0131 end
0132 elseif month > 11 && day > 3
0133
0134 prefix = 'mn';
0135 URL = sprintf('%sna/%s/%04d/%02d/%02d', basePath, ...
0136 prefix, ...
0137 year, ...
0138 month, ...
0139 day);
0140 files = sprintf('%s_%04d%02d%02d%02d_s00.pp', ...
0141 prefix, ...
0142 year, ...
0143 month, ...
0144 day, ...
0145 hour);
0146 end
0147
0148
0149 elseif year == 2006
0150 if month < 11
0151 if day < 7
0152 error('The MetUM repository does not contain data earlier than 7th November, 2006')
0153 else
0154 prefix = 'am';
0155 URL = sprintf('%sna/%s/%04d/%02d/%02d', basePath, ...
0156 prefix, ...
0157 year, ...
0158 month, ...
0159 day);
0160 for f = 1:ns
0161 files{f} = sprintf('na%s%04d%02d%02d%02d_%05d_00.pp', ...
0162 prefix, ...
0163 year, ...
0164 month, ...
0165 day, ...
0166 hour, ...
0167 stash(f));
0168 end
0169 end
0170 end
0171
0172
0173 elseif year == 2012
0174 if month > 1
0175 error('The MetUM repository does not contain data later than 17th January, 2012')
0176 elseif month == 1
0177 if day > 17
0178 error('The MetUM repository does not contain data later than 17th January, 2012')
0179 else
0180 prefix = 'mn';
0181 URL = sprintf('%sna/%s/%04d/%02d/%02d', basePath, ...
0182 prefix, ...
0183 year, ...
0184 month, ...
0185 day);
0186 files = sprintf('%s_%04d%02d%02d%02d_s00.pp', ...
0187 prefix, ...
0188 year, ...
0189 month, ...
0190 day, ...
0191 hour);
0192 end
0193 end
0194
0195
0196 elseif year < 2010
0197
0198 prefix = 'am';
0199 URL = sprintf('%sna/%s/%04d/%02d/%02d', basePath, ...
0200 prefix, ...
0201 year, ...
0202 month, ...
0203 day);
0204 for f = 1:ns
0205 files{f} = sprintf('na%s%04d%02d%02d%02d_%05d_00.pp', ...
0206 prefix, ...
0207 year, ...
0208 month, ...
0209 day, ...
0210 hour, ...
0211 stash(f));
0212 end
0213
0214
0215 elseif year > 2010
0216
0217 prefix = 'mn';
0218 URL = sprintf('%sna/%s/%04d/%02d/%02d', basePath, ...
0219 prefix, ...
0220 year, ...
0221 month, ...
0222 day);
0223 files = sprintf('%s_%04d%02d%02d%02d_s00.pp', ...
0224 prefix, ...
0225 year, ...
0226 month, ...
0227 day, ...
0228 hour);
0229 end
0230
0231 fprintf('%s: %s\n', URL, files{1})
0232 end
0233
0234
0235 close(remote)
0236
0237 if ftbverbose
0238 fprintf('end : %s \n', subname)
0239 end
0240
0241
0242 function ftpdata = get_badc_data(remote, URL, files)
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255 if ~iscell(files)
0256 error('Provide a cell array of files to download')
0257 end
0258
0259 cd(remote, URL);
0260 nf = length(files);
0261 for i = 1:nf
0262 tmpdata = mget(remote, files{i});
0263 ftpdata.(vars{i}).data =
0264 end
0265
0266
0267 function pp2nc(file, convsh)
0268
0269
0270
0271
0272 if nargin == 1
0273 convsh = '/usr/local/bin/convsh';
0274 end
0275
0276 if exist(file, 'file') ~= 2
0277 error('File %s not found', file)
0278 end
0279
0280 [path, name, ext] = fileparts(file);
0281 out = fullfile(path, [name, '.nc']);
0282
0283 system([convsh, '-i ',