source: trunk/PROGRAMMES/eof_NCEP_sais.m @ 30

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

ajout avertissement pb contourf octave 3.2.2

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