source: trunk/RESULTATS/eof_NCEP_an.m @ 25

Last change on this file since 25 was 25, checked in by jmignot, 15 years ago

homogeneisation case noms programmes & sorties

File size: 11.7 KB
Line 
1%EOF_NCEP_AN 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% module
18% ======
19%
20% ``eof_NCEP_an``
21%
22% DESCRIPTION
23% ===========
24%
25% ``eof_NCEP_an`` lit les fichiers
26% ``../DONNEES/lsmask_tropatl_PacandMedblancs.mat``
27% et ``../DONNEES/skt.mon.tropatl.mat``.
28%
29% ``eof_NCEP_an`` calcule ++blabla++
30%
31% ``eof_NCEP_an`` sauvegarde dans ``../DONNEES/eof_SSTan_tropAlt30N-20S.mat``.
32%
33% Ces fichiers sont lus par ``regandsignif_seriestemporelles.m_``.
34%
35% ``eof_NCEP_an`` affiche trois figures :
36%  - ++
37%  - ++
38%  - valeurs propres de la matrice de covariance
39%
40% ``eof_NCEP_an`` sauve ces images dans ``./eof_SSTan_tropAlt30N-20S++_[123].eps``.
41%
42% ++
43%
44% EXAMPLES
45% ========
46%
47% ::
48%
49% >> addpath('../PROGRAMMES/')
50% >> tpacpandreg_startup
51% >> eof_NCEP_an
52%
53% SEE ALSO
54% ========
55%
56% tpacpandreg_startup.m_
57%
58% .. _tpacpandreg_startup.m : tpacpandreg_startup.m.html
59%
60% initfig.m_
61%
62% .. _initfig.m : initfig.m.html
63%
64% regandsignif_seriestemporelles.m_
65%
66% .. _regandsignif_seriestemporelles.m : regandsignif_seriestemporelles.m.html
67%
68% whorldmap.m_
69%
70% .. _whorldmap.m : whorldmap.m.html
71%
72% TODO
73% ====
74%
75% improve description
76%
77% tester la branche NetCDF
78%
79% sous octave, triangle bizarre dans la dernière barre du graphique valeurs
80% propres.
81%
82% EVOLUTIONS
83% ==========
84%
85% $Id$
86%
87% - fplod 2009-08-25T10:40:16Z aedon.locean-ipsl.upmc.fr (Darwin)
88%
89%    * modif commentaires liée au renommage
90%
91% - jmignot 2009-08-25
92%
93%   * RESULTATS/Reg_seriestemporelles.m renommé en
94%     RESULTATS/regandsignif_seriestemporelles.m pour éviter confusion
95%     avec PROGRAMMES/Reg_seriestemporelles.m
96%   * chgt de noms de fichiers : ``EOF_ devient ``eof_``
97
98% - fplod 2009-08-21T15:04:16Z aedon.locean-ipsl.upmc.fr (Darwin)
99%
100%   * as octave save default format is ASCII and no default extension
101%     while matlab save default format is MAT v5 mat-file (little endian) and
102%     default extension is ``.mat``, write more precise save instruction
103%   * add header
104%   * répertoire de données relatifs au répertoire courant
105%   * suppression de ``clear all`` présent dans ``tpacpandreg_startup.m``
106%   * contournement pb octave pour ``contourf`` :
107%     Dans le fil de discussion [Pkg-octave-devel] Bug#492223: octave3.0: contourf only accepts vector X and Y if same+++,
108%     je comprends que j'ai affaire à un bug de octave 3.0 (donc à surveiller
109%     pour les prochaines versions) qui ne veut pas faire de contourf si les
110%     variables X et Y n'ont pas la même dimension et c'est le cas ici
111%     (lat = 42x1, lon= 70x1 vue avec size).
112%     http://lists.alioth.debian.org/pipermail/pkg-octave-devel/2008-July/004672.html
113%   * sauvegarde des figures
114%   * replace file radical ``EOF_SSTmens_tropAtl`` by ``EOF_SSTan_tropAtl``
115%
116%-
117
118
119%%
120N=4; %nb d'EOF a tracer
121
122nomfic='eof_SSTan_tropAtl'
123% mettre 'eof_SSTan_tropAtl' quand on travaille en moyennes annuelles. Ce
124% fichier sera rappele dans les programme de regression lineaire
125%%
126%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
127%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
128%%%%              CHARGEMENT ET PREPARATION DES DONNEES
129%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
130
131nannees=60;
132   
133repertoire=[ '..' filesep 'DONNEES' filesep ] % a adapter a chaque cas: chemin d acces aux donnees
134
135% Mask
136%-----
137file='lsmask_tropatl_PacandMedblancs.mat'
138   load([repertoire file]);
139  ny=size(mask,1); nx=size(mask,2); % dimensions spatiales des tableaux
140
141% Data
142%--------
143  %SI .MAT
144  repertoire2=[repertoire 'MAT' filesep] % a adapter a chaque cas: chemin d acces aux donnees
145  file=['skt.mon.tropatl.mat']
146  load([repertoire2 file]); % chargement des donnees
147
148   
149  %SI NETCDF
150  %repertoire2=[repertoire 'NETCDF' filesep]% a adapter a chaque cas: chemin d acces aux donnees
151  % file=['skt.mon.tropatl.nc']
152  % f=netcdf([repertoire file],'nowrite');
153  % tab=f{'skt'}(:,:,:);
154 
155
156   tab=permute(tab,[2 3 1]);% permutation des dimensions pour organiser le tableau sous la forme [lat lon temps]
157
158
159%---------------------------------------------------
160%  MANIPULATIONS TEMPORELLES: MOYENNE ET ANOMALIES
161%---------------------------------------------------
162
163% Construction de moyennes annuelles
164%---------------------------------------------------
165tab=reshape(tab,size(tab,1),size(tab,2),12,nannees);
166tab=squeeze(mean(tab,3));
167
168%  Construction des anomalies: on soustrait en chque point la moyenne temporelle totale
169%--------------------------------------------------------------------------
170tab_mean=squeeze(mean(tab,3)); tab_mean=repmat(tab_mean,[1 1 size(tab,3)]);
171anom=tab-tab_mean;
172ntemp=size(anom,3);
173
174%-------------------------------------------------------------
175%  MANIPULATIONS SPATIALES: PONDERATION, ZOOM GEOGRAPHIQUE
176%-------------------------------------------------------------
177
178% Pondération
179%----------------
180%Si on veut éventuellement attribuer un poids différent aux différents
181%points spatiaux, on le fait ici.
182
183% Préparation du zoom géographique: sur le masque, j'identifie les points
184% supplémentaires que je veux éliminer pour le calcul (critère en longitude
185% et/ou latitude par exemple)
186%---------------------------------------------------------------------
187limite_latS=-20; %limite du domaine d'etuade en latitude
188limite_latN=30; %limite du domaine d'etuade en latitude
189lat2D=repmat(lat,[1 size(mask,2)]);
190mask(lat2D>limite_latN&mask==0)=4;
191mask(lat2D<limite_latS&mask==0)=4;
192clear lat2D
193
194% Application du masque terre/mer pour pouvoir ensuite enlever les points de terre: on ne veut
195% travailler que sur l'océan
196%---------------------------------------------------------------------
197mask3D=repmat(mask,[1 1 size(tab,3)]);
198tab(mask3D~=0)=NaN;
199
200%  Elimination des points NaN
201%--------------------------------
202anom=reshape(anom,ny*nx,size(anom,3));
203maskr=reshape(mask,ny*nx,1);
204pt_val=find(maskr==0);
205Z=zeros(length(pt_val),ntemp);
206Z=anom(pt_val,:);
207%
208%%
209%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
210%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
211%%%                DECOMPOSITION EN COMPOSANTES PRINCIPALES
212%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
213
214%%%      CALCUL DE LA MATRICE DE COVARIANCE ET DIAGONALISATION
215
216% Z est donc une matrice N(points spatiaux) x M(points temporels) de
217% moyenne temporelle nulle sur laquelle on va faire l'analyse en EOF
218
219% matrice de covariance:
220  C = Z * Z';
221%  eval(['save ' repertoire 'MatCov_SST_tropAtl' num2str(limite_latN) 'N' num2str(limite_latS) 'S.asc C -ascii'])
222 
223% diagonalisation 
224  [E,Lambda] = eig(C);
225   % Lambda est la matrice diagonale des valeurs propres et E la matrice dont les colonnes sont les vecteurs propres correspondants. 
226   % Soit Z*E = E*Lambda
227   % Les vecteurs propres sont appelés les EOF. Chaque EOF peut être considéré comme une carte de l'espace physique.   
228
229   
230 %%
231 %%%% calcul de la matrice donnant les pourcentages de variance
232Lambda = diag(Lambda);
233pctg_var = round(Lambda / sum(Lambda) * 1000) / 10;
234
235 
236 %On definit les composantes principales de Q comme la decomposition du signal decrit par Q sur les EOF E.
237
238   P = Z' * E;
239   
240%%   
241%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
242%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
243 %%%             RECONSTRUCTION DES CARTES PHYSIQUES ET NORMALISATION DES
244 %%%             COMPOSANTES PRINCIPALES
245%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
246
247%initialisation des tableaux de stockage finaux
248TABEOF=zeros(ny,nx,N); %TABLEAU FINAL DES CARTES PHYSIQUES
249PC=zeros(ntemp,N);    %TABLEAU FINAL DES COMPOSANTES PRINCIPALES
250p_var=zeros(N,1);    %TABLEAU FINAL DES COMPOSANTES PRINCIPALES
251
252% boucle sur les differentes EOF pour reconstruire les cartes, normaliser
253% et enregistrer dans le tableau final
254for  i=1:1:N
255
256  disp(strcat('normalisation, projection et trace de l eof',num2str(i)))
257
258  pc = normalisation(P(:,end-i+1));
259  %
260  tabeof_temp=E(:,end-i+1);
261  tabeof=NaN+zeros(ny*nx,1);
262  tabeof(pt_val)=tabeof_temp;
263  tabeof=reshape(tabeof,ny,nx);
264  %remarque: autre facon de calculer le tabeof:
265  %  tabeof=projection(pc,Q'); tabeof=reshape(tabeof,ny,nx);
266
267      %%% enregistrement
268  TABEOF(:,:,i)=tabeof;
269  PC(:,i)=pc;
270  p_var(i)=pctg_var(end-i+1);
271
272end;
273
274fullfilename=[repertoire nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S.mat'];
275if (run_octave == 0)
276 save(fullfilename,'TABEOF','PC','p_var','lon','lat','mask','-v7');
277else
278 save('-v7',fullfilename,'TABEOF','PC','p_var','lon','lat','mask');
279end
280clear fullfilename;
281
282
283 %%               TRACE
284close all
285%parametres geographiques des graphes
286  geo=[-100 20 -30 30]; %[lonmin lonmax latmin latmax];
287  yti=[-30:10:30]; xti=[-100:30:20]; %labels de latitude et de longitude
288%niveaux de couleurs
289  lev=[-2:.02:2];
290  clip_lev=[-0.06 0.06]
291
292figure(1);
293initfig;
294figure(2);
295initfig;
296
297for i=1:4
298   
299   %subplot(4,2,2*i-1)
300   ifigure=1;
301   figure(ifigure);
302   subplot(2,2,i)
303   if (run_octave == 0)
304    x=lon;
305    y=lat;
306   else
307    [x,y]=meshgrid(lon,lat);
308   end
309   z=squeeze(TABEOF(:,:,i));
310   contourf(x,y,z,lev);
311   caxis(clip_lev)
312   hold on
313   whorldmap
314   % limites geographies et labels de longitude et de latitude
315  ylim([geo(3) geo(4)])
316  xlim([geo(1) geo(2)])
317  set(gca, 'Xtick', xti, 'Ytick', yti)
318   if (run_octave == 0)
319    [longstr, latstr] = contlab(xti, yti);
320    set(gca, 'Xticklabel', longstr, 'Yticklabel', latstr)
321   end;
322  xlabel('longitude')
323  ylabel('latitude')
324
325   %titre de la figure
326   title([num2str(p_var(i)) '%'])
327
328  %barre de couleur
329  if (run_octave == 0)
330    hpal=jet(100); %carte des couleurs: du bleu au rouge par defaut.
331    pos1=get(gca,'Position')
332    pos=[pos1(1) pos1(2)-.075 pos1(3) .013];
333    colorbartype(pos,lev,1,clip_lev,hpal,0);
334    title('degC')
335  else
336    colorbar('East')
337  end;
338 
339   % sauvegarde de la figure
340   printer='eps';
341   print_printer=['-d', printer];
342   fullfilename=['.' filesep nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S_' , num2str(ifigure) '.' printer];
343   print(print_printer,fullfilename);
344   clear fullfilename;
345   clear printer;
346   
347   %subplot(4,2,2*i)
348   ifigure=2;
349   figure(ifigure);
350   subplot(2,2,i)
351   plot(PC(:,i),'x-')
352   title(['composante principale correspondante (normalisée)'])
353   hold on
354   plot([1 ntemp],[0 0],'k')
355   xlim([1 ntemp])
356   xlabel('mois')
357
358   % sauvegarde de la figure
359   printer='eps';
360   print_printer=['-d', printer];
361   fullfilename=['.' filesep nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S_' , num2str(ifigure) '.' printer];
362   print(print_printer,fullfilename);
363   clear fullfilename;
364   clear printer;
365
366end;
367
368
369% Graphe pourcentages de variance expliqué
370ifigure=3;
371figure(ifigure);
372bar(flipud(pctg_var))
373xlim([0 10])
374title('valeurs propres de la matrice de covariance')
375ylabel('% de variance expliqué')
376xlabel('indice du vecteur propre')
377
378% sauvegarde de la figure
379printer='eps';
380print_printer=['-d', printer];
381fullfilename=['.' filesep nomfic num2str(limite_latN) 'N' num2str(limite_latS) 'S_' , num2str(ifigure) '.' printer];
382print(print_printer,fullfilename);
383clear fullfilename;
384clear printer;
385
Note: See TracBrowser for help on using the repository browser.