source: LMDZ6/trunk/libf/phylmd/calcul_STDlev.h @ 5746

Last change on this file since 5746 was 5685, checked in by fhourdin, 6 weeks ago

Correction/nettoyage sorties en pression

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.3 KB
Line 
1!
2! $Header$
3!
4!-------------------------------------------------------------------
5! Interpolation sur des niveaux de pression.
6!
7! Enchainement des operations en prenant pour exemple la temperature
8!
9! 1. CALL ini_undefSTD :
10!  On met les champs cumules à 0 si
11!  if mod(itap,nint(freq_outnmc(n)/phys_tstep))==1 
12!          tnondef(i, k, n) = 0.
13!          tsumstd(i, k, n) = 0.
14!
15! 2. Ensuite : 
16!   on interpole les champs sur les niveaux STD de pression
17!   a chaque pas de temps de la physique avec plevel_new
18!   t_seri -> tlevSTD
19!
20! 3. CALL undefSTD : 
21!   On ajoute les champs à la moyenne tous les frec_calnmc
22!      pas de temps
23!   IF (mod(itap,nint(freq_calnmc(n)/phys_tstep))==0) THEN
24!         IF (tlevstd(i,k)==missing_val) THEN
25!           tnondef(i, k, n) = tnondef(i, k, n) + 1.
26!         ELSE IF (tlevstd(i,k)/=missing_val) THEN
27!           tsumstd(i, k, n) = tsumstd(i, k, n) + tlevstd(i, k)
28!
29! 4. CALL moy_undefSTD
30!    On normalise à freq_outnmc, avant de reinitialiser plus haut dans ini_undef
31!    IF mod(itap,nint(freq_outnmc(n)/phys_tstep))==0
32!         tsumstd(i, k, n) = tsumstd(i, k, n)/(freq_moynmc(n)-tnondef(i,k,n))
33!
34! 5. Intrpolation des flux (pourquoi pas avec 2 ?)
35!
36! 6. Choix entre instantanné et moyenne en temps
37!     twriteSTD(:,:,1)=tsumSTD(:,:,1)
38!     twriteSTD(:,:,3)=tlevSTD(:,:)
39! 
40!  Premiere série de modifications (2025/05/07, FH) :
41!   - Fait en sorte que freq_outnmc=ecrit_files
42!   - Mis tous les USE avec ONLY dans *undefSTD.f90
43!   - Utilie ecrit_files comme frequence de sortie freq_outnmc
44!   - Nettoye la lecture des freq_outnmc et freq_calnmc dans conf_phys
45!   - Passe les dimensionnement de certaines variables de 3 à 10
46!     nombre de fichiers par défaut. En gros nout=nfiles
47! 
48!  Proposition de modifications :
49!   - Ne plus calculer l'interpolation à tous les pas de temps
50!      mais seulement à la fréquence freq_calcnmc
51!   - Mettre le call ini_undefSTD juste avant undef_STD et moy_undefSTD
52!   - Enlever ecrit_files(7) = freq_outNMC(1) dans phys_output_mod
53!   - Enlever les vieux controles de fichiers dans conf_phys
54!   - enlever les dimensionnement à 10 en dur
55!   - Enlever toute chaine de caractère NMC dans le modèle.
56!
57!-------------------------------------------------------------------
58
59!IM on initialise les variables
60!
61!       missing_val=nf90_fill_real
62!
63
64! On peut à terme utiliser directement ecrit_files (le nom est moins
65! bien choisi ...
66
67       !print*,'STDSTD ecrit_files ',ecrit_files(1:4)
68       freq_outnmc(:)=ecrit_files(:)
69       freq_calnmc(:)=pdtphys
70
71       IF (.not. ok_all_xml) then
72        CALL ini_undefSTD(itap)
73       ENDIF
74!
75!-------------------------------------------------------c
76! positionnement de l'argument logique a .false.        c
77! pour ne pas recalculer deux fois la meme chose !      c
78! a cet effet un appel a plevel_new a ete deplace       c
79! a la fin de la serie d'appels                         c
80! la boucle 'DO k=1, nlevSTD' a ete internalisee        c
81! dans plevel_new, d'ou la creation de cette routine... c
82!-------------------------------------------------------c
83!
84        CALL plevel_new(klon,klev,nlevSTD,.true.,pplay,rlevSTD, &
85                    t_seri,tlevSTD)
86        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
87                   u_seri,ulevSTD)
88        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
89                   v_seri,vlevSTD)
90!
91
92!
93        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
94                   zphi/RG,philevSTD)
95        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
96                   qx(:,:,ivap),qlevSTD)
97        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
98                   zx_rh*100.,rhlevSTD)
99!
100        DO l=1, klev
101         DO i=1, klon
102          zx_tmp_fi3d(i,l)=u_seri(i,l)*v_seri(i,l)
103         ENDDO !i
104        ENDDO !l
105        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
106                   zx_tmp_fi3d,uvSTD)
107!
108        DO l=1, klev
109         DO i=1, klon
110          zx_tmp_fi3d(i,l)=v_seri(i,l)*q_seri(i,l)
111         ENDDO !i
112        ENDDO !l
113        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
114                   zx_tmp_fi3d,vqSTD)
115!
116        DO l=1, klev
117         DO i=1, klon
118          zx_tmp_fi3d(i,l)=v_seri(i,l)*t_seri(i,l)
119         ENDDO !i
120        ENDDO !l
121        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
122                   zx_tmp_fi3d,vTSTD)
123!
124        DO l=1, klev
125         DO i=1, klon
126          zx_tmp_fi3d(i,l)=omega(i,l)*qx(i,l,ivap)
127         ENDDO !i
128        ENDDO !l
129        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
130                   zx_tmp_fi3d,wqSTD)
131!
132        DO l=1, klev
133         DO i=1, klon
134          zx_tmp_fi3d(i,l)=v_seri(i,l)*zphi(i,l)/RG
135         ENDDO !i
136        ENDDO !l
137        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
138                   zx_tmp_fi3d,vphiSTD)
139!
140        DO l=1, klev
141         DO i=1, klon
142          zx_tmp_fi3d(i,l)=omega(i,l)*t_seri(i,l)
143         ENDDO !i
144        ENDDO !l
145        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
146                   zx_tmp_fi3d,wTSTD)
147!
148        DO l=1, klev
149         DO i=1, klon
150          zx_tmp_fi3d(i,l)=u_seri(i,l)*u_seri(i,l)
151         ENDDO !i
152        ENDDO !l
153        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
154                   zx_tmp_fi3d,u2STD)
155!
156        DO l=1, klev
157         DO i=1, klon
158          zx_tmp_fi3d(i,l)=v_seri(i,l)*v_seri(i,l)
159         ENDDO !i
160        ENDDO !l
161        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
162                   zx_tmp_fi3d,v2STD)
163!
164        DO l=1, klev
165         DO i=1, klon
166          zx_tmp_fi3d(i,l)=t_seri(i,l)*t_seri(i,l)
167         ENDDO !i
168        ENDDO !l
169        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
170                   zx_tmp_fi3d,T2STD)
171
172!
173      zx_tmp_fi3d(:,:)=wo(:,:,1) * dobson_u * 1e3 / zmasse / rmo3 * rmd
174        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
175                   zx_tmp_fi3d,O3STD)
176!
177      if (read_climoz == 2) THEN
178      zx_tmp_fi3d(:,:)=wo(:,:,2) * dobson_u * 1e3 / zmasse / rmo3 * rmd
179        CALL plevel_new(klon,klev,nlevSTD,.false.,pplay,rlevSTD, &
180                   zx_tmp_fi3d,O3daySTD)
181      endif
182!
183        DO l=1, klev
184        DO i=1, klon
185         zx_tmp_fi3d(i,l)=paprs(i,l)
186        ENDDO !i
187        ENDDO !l
188        CALL plevel_new(klon,klev,nlevSTD,.true.,zx_tmp_fi3d,rlevSTD, &
189                   omega,wlevSTD)
190!
191!IM on somme les valeurs toutes les freq_calNMC secondes
192!IM on moyenne a la fin du mois, du jour ou toutes les 6h
193!
194       IF (.not. ok_all_xml) then
195        CALL undefSTD(itap, read_climoz)
196        CALL moy_undefSTD(itap)
197       ENDIF
198!
199       CALL plevel(klon,klev,.true.,pplay,50000., &
200                    zphi/RG,geo500)
201
202!IM on interpole a chaque pas de temps le SWup(clr) et SWdn(clr) a 200 hPa
203!
204      CALL plevel(klon,klevp1,.true.,paprs,20000., &
205           swdn0,SWdn200clr)
206      CALL plevel(klon,klevp1,.false.,paprs,20000., &
207           swdn,SWdn200)
208      CALL plevel(klon,klevp1,.false.,paprs,20000., &
209           swup0,SWup200clr)
210      CALL plevel(klon,klevp1,.false.,paprs,20000., &
211           swup,SWup200)
212!
213      CALL plevel(klon,klevp1,.false.,paprs,20000., &
214           lwdn0,LWdn200clr)
215      CALL plevel(klon,klevp1,.false.,paprs,20000., &
216           lwdn,LWdn200)
217      CALL plevel(klon,klevp1,.false.,paprs,20000., &
218           lwup0,LWup200clr)
219      CALL plevel(klon,klevp1,.false.,paprs,20000., &
220           lwup,LWup200)
221!
222      do n=1,nout
223         !print*,'STDSTD n nout',n,nout,clef_files(n)
224         if (clef_files(n)) then
225             if (type_ecri(n)=='ave(X)') then
226                 !print*,'STDSTD fichier ave(X), n=',n
227                 twriteSTD(:,:,n)=tsumSTD(:,:,n)
228                 qwriteSTD(:,:,n)=qsumSTD(:,:,n)
229                 rhwriteSTD(:,:,n)=rhsumSTD(:,:,n)
230                 phiwriteSTD(:,:,n)=phisumSTD(:,:,n)
231                 uwriteSTD(:,:,n)=usumSTD(:,:,n)
232                 vwriteSTD(:,:,n)=vsumSTD(:,:,n)
233                 wwriteSTD(:,:,n)=wsumSTD(:,:,n)
234             else
235                 !print*,'STDSTD fichier autre, n=',n,type_ecri(n)
236                 twriteSTD(:,:,n)=tlevSTD(:,:)
237                 qwriteSTD(:,:,n)=qlevSTD(:,:)
238                 rhwriteSTD(:,:,n)=rhlevSTD(:,:)
239                 phiwriteSTD(:,:,n)=philevSTD(:,:)
240                 uwriteSTD(:,:,n)=ulevSTD(:,:)
241                 vwriteSTD(:,:,n)=vlevSTD(:,:)
242                 wwriteSTD(:,:,n)=wlevSTD(:,:)
243             endif
244         endif
245      enddo
246
247!IM for NMC files
248      DO n=1, nlevSTD3
249       DO k=1, nlevSTD
250        if(rlevSTD3(n).EQ.rlevSTD(k)) THEN
251         twriteSTD3(:,n)=tlevSTD(:,k)
252         qwriteSTD3(:,n)=qlevSTD(:,k)
253         rhwriteSTD3(:,n)=rhlevSTD(:,k)
254         phiwriteSTD3(:,n)=philevSTD(:,k)
255         uwriteSTD3(:,n)=ulevSTD(:,k)
256         vwriteSTD3(:,n)=vlevSTD(:,k)
257         wwriteSTD3(:,n)=wlevSTD(:,k)
258        endif !rlevSTD3(n).EQ.rlevSTD(k)
259       ENDDO
260      ENDDO
261!
262      DO n=1, nlevSTD8
263       DO k=1, nlevSTD
264        if(rlevSTD8(n).EQ.rlevSTD(k)) THEN
265         tnondefSTD8(:,n)=tnondef(:,k,2)
266         twriteSTD8(:,n)=tsumSTD(:,k,2)
267         qwriteSTD8(:,n)=qsumSTD(:,k,2)
268         rhwriteSTD8(:,n)=rhsumSTD(:,k,2)
269         phiwriteSTD8(:,n)=phisumSTD(:,k,2)
270         uwriteSTD8(:,n)=usumSTD(:,k,2)
271         vwriteSTD8(:,n)=vsumSTD(:,k,2)
272         wwriteSTD8(:,n)=wsumSTD(:,k,2)
273        endif !rlevSTD8(n).EQ.rlevSTD(k)
274       ENDDO
275      ENDDO
Note: See TracBrowser for help on using the repository browser.