source: trunk/PROGRAMMES/eof_NCEP_sais.m @ 41

Last change on this file since 41 was 41, checked in by pinsard, 15 years ago

usage of contour instead of contoutf when octave 3.2.2 is running

  • Property svn:keywords set to Id
File size: 13.3 KB
Line 
1%EOF_NCEP_SAIS calcule les EOFs et composantes principales du champs de temperature de surface en moyennes mensuelles climatologiques
2% (12 points temporels)
3%
4% le programme enregistre automatiquement les resultats du calcul
5% (attention: penser a changer le nom du fichier de sortie en cas de
6% modification de parametres du programme: domaine spatial, moyenne
7% temporelle effectuee: annee / mois, etc. parametre "nomfic" ci dessous)
8%
9% le programme permet egalement de visualiser les resultats. Voir le doc
10% .pdf joint pour l'interpretation de cette visualisation.
11%
12% Date: Avril-Mai 2008
13% Auteur: juliette.mignot@locean-ipsl.upmc.fr
14% Contexte Ecole d'ete ENVI-STAT 2008
15
16%+
17%
18% module
19% ======
20%
21% ``eof_NCEP_sais``
22%
23% DESCRIPTION
24% ===========
25%
26% ``eof_NCEP_sais`` lit les fichiers
27% ``../DONNEES/lsmask_tropatl_PacandMedblancs.mat``
28% et ``../DONNEES/skt.mon.tropatl.mat``.
29%
30% ``eof_NCEP_sais`` calcule ++blabla++
31%
32% ``eof_NCEP_sais`` sauvegarde dans
33% ``../DONNEES/eof_SSTmens_tropAtl30N-20S.mat``.
34%
35% Ces fichiers sont lus par ``reg_serietemporelles.m_``\ .
36%
37% ``eof_NCEP_sais`` affiche trois figures :
38%  - ++
39%  - ++
40%  - valeurs propres de la matrice de covariance
41%
42% ``eof_NCEP_sais`` sauve ces images dans
43% ``./eof_SSTmens_tropAtl30N-20S_[123].ps``.
44%
45% ++
46%
47% EXAMPLES
48% ========
49%
50% ::
51%
52% >> tpacpandreg_startup
53% >> eof_NCEP_sais
54%
55% SEE ALSO
56% ========
57%
58% tpacpandreg_startup.m_
59%
60% .. _tpacpandreg_startup.m : tpacpandreg_startup.m.html
61%
62% initfig.m_
63%
64% .. _initfig.m : initfig.m.html
65%
66% reg_seriestemporelles.m_
67%
68% .. _reg_seriestemporelles.m : reg_seriestemporelles.m.html
69%
70% whorldmap.m_
71%
72% .. _whorldmap.m : whorldmap.m.html
73%
74% colorbartype.m_
75%
76% .. _colorbartype.m : colorbartype.m.html
77%
78% contlab.m_
79%
80% .. _contlab.m : contlab.m.html
81%
82% TODO
83% ====
84%
85% improve description
86%
87% tester la branche NetCDF
88%
89% comprendre le pb octave 3.2.2
90%
91%
92% KNOWN PROBLEMS
93% ==============
94%
95% - fplod 2009-09-21T11:57:50Z aedon.locean-ipsl.upmc.fr (Darwin)
96%
97%   * Postcripts affreux sous octave 3.2.2 : tout est tassé dans le coin
98%     bas gauche !
99%
100% EVOLUTIONS
101% ==========
102%
103% $Id$
104%
105% - fplod 2009-09-21T12:06:35Z aedon.locean-ipsl.upmc.fr (Darwin)
106%
107%   * octave 3.2.2 contourf problem is not solved (see KNOWN PROBLEMS) but a
108%     workaround allows (``contour`` instead of ``contourf``) to run this
109%     script till end.
110%
111% - fplod 2009-08-26T16:34:59Z aedon.locean-ipsl.upmc.fr (Darwin)
112%
113%   * pb contourf sous octave 3.2.2
114%
115% - fplod 2009-08-26T11:05:36Z aedon.locean-ipsl.upmc.fr (Darwin)
116%
117%   * remplacement de ``eps`` par ``ps`` pour pouvoir imprimer les figures
118%     produites par ``octave``
119%
120%     Dans le fichier .eps produit par ``octave`` on pouvait lire
121%     ``!PS-Adobe-2.0 EPSF-2.0``.
122%
123%     Aucun message d'erreur n'apparaît suite à la demande d'impression
124%     ``zeus$ lpr -o job-sheets='none' eof_SSTmens_tropAtl30N-20S_1.octave.ps``,
125%     mais aucune feuille ne sort.
126%
127%     Pour info dans le fichier .eps produit par matlab, on pouvait lire
128%     ``%!PS-Adobe-2.0 EPSF-1.2``. Aucun souci d'impression avec ce fichier !
129%
130%     En remplaçant ``eps`` par ``ps``, on n'a plus de souci d'impression.
131%
132% - jmignot 2009-08-25
133%
134%   * suppression d'appel à contlab et colorbartype sous octave
135%
136%
137% - fplod 2009-08-25T10:40:16Z aedon.locean-ipsl.upmc.fr (Darwin)
138%
139%   * modif commentaires liée au dernier chgt de Juliette
140%
141% - jmignot 2009-08-25
142%
143%   * chgt de noms de fichiers : ``EOF_`` devient ``eof_``
144%   * remplacement de ``colorbar`` par ``colorbartype``
145%     parce pas beau ni en matlab ni en octave (dégradé, noir et blanc dans
146%     les .jpg)
147%   * contraintes sur les limites x et y de axes car matlab et octave ne
148%     fixent pas les même limites par défaut
149%   * utisation de ``contlab`` pour ++
150%
151% - fplod 2009-08-21T15:04:16Z aedon.locean-ipsl.upmc.fr (Darwin)
152%
153%   * as octave save default format is ASCII and no default extension
154%     while matlab save default format is MAT v5 mat-file (little endian) and
155%     default extension is ``.mat``, write more precise save instruction
156%
157% - fplod 2009-08-21T12:58:38Z aedon.locean-ipsl.upmc.fr (Darwin)
158%
159%   * add header
160%   * répertoire de données relatifs au répertoire courant
161%   * suppression de ``clear all`` présent dans ``tpacpandreg_startup.m``
162%   * contournement pb octave pour ``contourf`` :
163%     Dans le fil de discussion [Pkg-octave-devel] Bug#492223: octave3.0: contourf only accepts vector X and Y if same+++,
164%     je comprends que j'ai affaire à un bug de octave 3.0 (donc à surveiller
165%     pour les prochaines versions) qui ne veut pas faire de contourf si les
166%     variables X et Y n'ont pas la même dimension et c'est le cas ici
167%     (lat = 42x1, lon= 70x1 vue avec size).
168%     http://lists.alioth.debian.org/pipermail/pkg-octave-devel/2008-July/004672.html
169%   * sauvegarde des figures
170
171%
172%-
173%
174N=4; %nb d'EOF a tracer
175
176nomfic='eof_SSTmens_tropAtl'
177% mettre 'eof_SSTan_tropAtl' quand on travaille en moyennes annuelles. Ce
178% fichier sera rappele dans les programme de regression lineaire
179%%
180%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
181%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
182%%%%              CHARGEMENT ET PREPARATION DES DONNEES
183%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
184
185nannees=60;
186   repertoire=[ '..' filesep 'DONNEES' filesep ] % a adapter a chaque cas: chemin d acces aux donnees
187
188% Mask
189%------
190  file='lsmask_tropatl_PacandMedblancs.mat'
191   load([repertoire file]);
192  ny=size(mask,1); nx=size(mask,2); % dimensions spatiales des tableaux
193
194% Data
195%--------
196  %SI .MAT
197  repertoire2=[repertoire 'MAT' filesep] % a adapter a chaque cas: chemin d acces aux donnees
198  file=['skt.mon.tropatl.mat']
199  load([repertoire2 file]); % chargement des donnees
200
201
202  %SI NETCDF
203  %repertoire2=[repertoire 'NETCDF' filesep]% a adapter a chaque cas: chemin d acces aux donnees
204  % file=['skt.mon.tropatl.nc']
205  % f=netcdf([repertoire file],'nowrite');
206  % tab=f{'skt'}(:,:,:);
207
208
209   tab=permute(tab,[2 3 1]);% permutation des dimensions pour organiser le tableau sous la forme [lat lon temps]
210
211
212%---------------------------------------------------
213%  MANIPULATIONS TEMPORELLES: MOYENNE ET ANOMALIES
214%---------------------------------------------------
215
216% Construction de moyennes mensuelles saisonnieres
217%---------------------------------------------------
218tab=reshape(tab,size(tab,1),size(tab,2),12,nannees);
219tab=squeeze(mean(tab,4));
220
221%  Construction des anomalies: on soustrait en chque point la moyenne temporelle totale
222%--------------------------------------------------------------------------
223tab_mean=squeeze(mean(tab,3)); tab_mean=repmat(tab_mean,[1 1 size(tab,3)]);
224anom=tab-tab_mean;
225ntemp=size(anom,3);
226
227%-------------------------------------------------------------
228%  MANIPULATIONS SPATIALES: PONDERATION, ZOOM GEOGRAPHIQUE
229%-------------------------------------------------------------
230
231% Pondération
232%----------------
233%Si on veut éventuellement attribuer un poids différent aux différents
234%points spatiaux, on le fait ici.
235
236% Préparation du zoom géographique: sur le masque, j'identifie les points
237% supplémentaires que je veux éliminer pour le calcul (critère en longitude
238% et/ou latitude par exemple)
239%---------------------------------------------------------------------
240limite_latS=-20; %limite du domaine d'etuade en latitude
241limite_latN=30; %limite du domaine d'etuade en latitude
242lat2D=repmat(lat,[1 size(mask,2)]);
243mask(lat2D>limite_latN&mask==0)=4;
244mask(lat2D<limite_latS&mask==0)=4;
245clear lat2D
246
247% Application du masque terre/mer pour pouvoir ensuite enlever les points de terre: on ne veut
248% travailler que sur l'océan
249%---------------------------------------------------------------------
250mask3D=repmat(mask,[1 1 size(tab,3)]);
251tab(mask3D~=0)=NaN;
252
253%  Elimination des points NaN
254%--------------------------------
255anom=reshape(anom,ny*nx,size(anom,3));
256maskr=reshape(mask,ny*nx,1);
257pt_val=find(maskr==0);
258Z=zeros(length(pt_val),ntemp);
259Z=anom(pt_val,:);
260%
261%%
262%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
263%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
264%%%                DECOMPOSITION EN COMPOSANTES PRINCIPALES
265%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
266
267%%%      CALCUL DE LA MATRICE DE COVARIANCE ET DIAGONALISATION
268
269% Z est donc une matrice N(points spatiaux) x M(points temporels) de
270% moyenne temporelle nulle sur laquelle on va faire l'analyse en EOF
271
272% matrice de covariance:
273  C = Z * Z';
274%  eval(['save ' repertoire 'MatCov_SST_tropAtl' num2str(limite_latN) 'N' num2str(limite_latS) 'S.asc C -ascii'])
275
276% diagonalisation
277  [E,Lambda] = eig(C);
278   % Lambda est la matrice diagonale des valeurs propres et E la matrice dont les colonnes sont les vecteurs propres correspondants.
279   % Soit Z*E = E*Lambda
280   % Les vecteurs propres sont appelés les EOF. Chaque EOF peut être considéré comme une carte de l'espace physique.
281
282
283 %%
284 %%%% calcul de la matrice donnant les pourcentages de variance
285Lambda = diag(Lambda);
286pctg_var = round(Lambda / sum(Lambda) * 1000) / 10;
287
288
289 %On definit les composantes principales de Q comme la decomposition du signal decrit par Q sur les EOF E.
290
291   P = Z' * E;
292
293%%
294%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
295%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
296 %%%             RECONSTRUCTION DES CARTES PHYSIQUES ET NORMALISATION DES
297 %%%             COMPOSANTES PRINCIPALES
298%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
299
300%initialisation des tableaux de stockage finaux
301TABEOF=zeros(ny,nx,N); %TABLEAU FINAL DES CARTES PHYSIQUES
302PC=zeros(ntemp,N);    %TABLEAU FINAL DES COMPOSANTES PRINCIPALES
303p_var=zeros(N,1);    %TABLEAU FINAL DES COMPOSANTES PRINCIPALES
304
305% boucle sur les differentes EOF pour reconstruire les cartes, normaliser
306% et enregistrer dans le tableau final
307for  i=1:1:N
308
309  disp(strcat('normalisation, projection et trace de l eof',num2str(i)))
310
311  pc = normalisation(P(:,end-i+1));
312  %
313  tabeof_temp=E(:,end-i+1);
314  tabeof=NaN+zeros(ny*nx,1);
315  tabeof(pt_val)=tabeof_temp;
316  tabeof=reshape(tabeof,ny,nx);
317  %remarque: autre facon de calculer le tabeof:
318  %  tabeof=projection(pc,Q'); tabeof=reshape(tabeof,ny,nx);
319
320      %%% enregistrement
321  TABEOF(:,:,i)=tabeof;
322  PC(:,i)=pc;
323  p_var(i)=pctg_var(end-i+1);
324
325end;
326
327fullfilename=[repertoire nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S.mat'];
328if (run_octave == 0)
329 save(fullfilename,'TABEOF','PC','p_var','lon','lat','mask','-v7');
330else
331 save('-v7',fullfilename,'TABEOF','PC','p_var','lon','lat','mask');
332end
333clear fullfilename;
334
335 %%               TRACE
336
337close all
338%parametres geographiques des graphes
339  geo=[-100 20 -30 30]; %[lonmin lonmax latmin latmax];
340  yti=[-30:10:30]; xti=[-100:30:20]; %labels de latitude et de longitude
341%niveaux de couleurs
342  lev=[-2:.02:2];
343  clip_lev=[-0.06 0.06];
344
345figure(1);
346initfig;
347figure(2);
348initfig;
349
350for i=1:4
351
352   %subplot(4,2,2*i-1)
353   ifigure=1;
354   figure(ifigure);
355   subplot(2,2,i)
356   z=squeeze(TABEOF(:,:,i));
357   if (run_octave == 0)
358    x=lon;
359    y=lat;
360    contourf(x,y,z,lev);
361   else
362    [x,y]=meshgrid(lon,lat);
363    switch OCTAVE_VERSION
364     case {'3.0.2','3.0.5'}
365      contourf(x,y,z,lev);
366     case {'3.2.2'}
367      contour(x,y,z,lev);
368     otherwise
369      contourf(x,y,z,lev);
370     end
371   end
372   caxis(clip_lev);
373   hold on
374   whorldmap
375   % limites geographies et labels de longitude et de latitude
376  ylim([geo(3) geo(4)])
377  xlim([geo(1) geo(2)])
378  set(gca, 'Xtick', xti, 'Ytick', yti)
379  if (run_octave == 0)
380    [longstr, latstr] = contlab(xti, yti);
381    set(gca, 'Xticklabel', longstr, 'Yticklabel', latstr)
382  end;
383  xlabel('longitude')
384  ylabel('latitude')
385
386   %titre de la figure
387   title([num2str(p_var(i)) '%'])
388
389  %barre de couleur
390  if (run_octave == 0)
391    hpal=jet(100); %carte des couleurs: du bleu au rouge par defaut.
392    pos1=get(gca,'Position');
393    pos=[pos1(1) pos1(2)-.075 pos1(3) .013];
394    colorbartype(pos,lev,1,clip_lev,hpal,0);
395    title('degC')
396  else
397    %++colorbar('East')
398  end;
399
400   % sauvegarde de la figure
401   printer='ps';
402   print_printer=['-d', printer];
403   fullfilename=['.' filesep nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S_' , num2str(ifigure) '.' printer];
404   print(print_printer,fullfilename);
405   clear fullfilename;
406   clear printer;
407
408   %subplot(4,2,2*i)
409   ifigure=2;
410   figure(ifigure);
411   subplot(2,2,i)
412   plot(PC(:,i),'x-')
413   title(['composante principale correspondante (normalisée)'])
414   hold on
415   plot([1 ntemp],[0 0],'k')
416   xlim([1 ntemp])
417   xlabel('mois')
418   %
419   % sauvegarde de la figure
420   printer='ps';
421   print_printer=['-d', printer];
422   fullfilename=['.' filesep nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S_' , num2str(ifigure) '.' printer];
423   print(print_printer,fullfilename);
424   clear fullfilename;
425   clear printer;
426end;
427
428% Graphe pourcentages de variance expliqué
429ifigure=3;
430figure(ifigure);
431initfig;
432bar(flipud(pctg_var))
433xlim([0 10])
434title('valeurs propres de la matrice de covariance')
435ylabel('% de variance expliqué')
436xlabel('indice du vecteur propre')
437
438% sauvegarde de la figure
439printer='ps';
440print_printer=['-d', printer];
441fullfilename=['.' filesep nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S_' , num2str(ifigure) '.' printer];
442print(print_printer,fullfilename);
443clear fullfilename;
444clear printer;
Note: See TracBrowser for help on using the repository browser.