source: LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/cosp/cosp_output_write_mod.F90 @ 3191

Last change on this file since 3191 was 3191, checked in by idelkadi, 6 years ago

Correction diagnostique de sortie (Parasol).

File size: 33.1 KB
Line 
1!!!! Abderrahmane Idelkadi aout 2013 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2! Module pour definir (au 1er appel) et ecrire les variables dans les fichiers de sortie cosp
3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4   MODULE cosp_output_write_mod
5 
6   USE cosp_output_mod
7 
8   INTEGER, SAVE  :: itau_iocosp
9!$OMP THREADPRIVATE(itau_iocosp)
10   INTEGER, save        :: Nlevout, Ncolout
11!$OMP THREADPRIVATE(Nlevout, Ncolout)
12
13!  INTERFACE histwrite_cosp
14!    MODULE PROCEDURE histwrite2d_cosp,histwrite3d_cosp
15!  END INTERFACE
16
17   CONTAINS
18
19  SUBROUTINE cosp_output_write(Nlevlmdz, Npoints, Ncolumns, itap, dtime, freq_COSP, missing_cosp, &
20                               cfg, gbx, vgrid, sglidar, sgradar, stlidar, stradar, &
21                               isccp, misr, modis)
22
23    USE ioipsl
24    USE time_phylmdz_mod, ONLY: itau_phy, start_time, day_step_phy
25    USE print_control_mod, ONLY: lunout,prt_level
26
27#ifdef CPP_XIOS
28    USE wxios, only: wxios_closedef
29    USE xios, only: xios_update_calendar, xios_field_is_active
30#endif
31
32!!! Variables d'entree
33  integer               :: itap, Nlevlmdz, Ncolumns, Npoints
34  real                  :: freq_COSP, dtime, missing_val, missing_cosp
35  type(cosp_config)     :: cfg     ! Control outputs
36  type(cosp_gridbox)    :: gbx     ! Gridbox information. Input for COSP
37  type(cosp_sglidar)    :: sglidar ! Output from lidar simulator
38  type(cosp_sgradar)    :: sgradar ! Output from radar simulator
39  type(cosp_isccp)      :: isccp   ! Output from ISCCP simulator
40  type(cosp_lidarstats) :: stlidar ! Summary statistics from lidar simulator
41  type(cosp_radarstats) :: stradar
42  type(cosp_misr)       :: misr    ! Output from MISR
43  type(cosp_modis)      :: modis   ! Outputs from Modis
44  type(cosp_vgrid)      :: vgrid   ! Information on vertical grid of stats
45
46!!! Variables locales
47  integer               :: icl
48  logical               :: ok_sync
49  integer               :: itau_wcosp
50  real, dimension(Npoints,PARASOL_NREFL) :: parasolcrefl, Ncref
51
52#ifdef CPP_XIOS
53  missing_val=missing_cosp
54#else
55  missing_val=0.
56#endif
57
58  Nlevout = vgrid%Nlvgrid
59  Ncolout = Ncolumns
60
61! A refaire
62       itau_wcosp = itau_phy + itap + start_time * day_step_phy
63        if (prt_level >= 10) then
64             WRITE(lunout,*)'itau_wcosp, itap, start_time, day_step_phy =', &
65                             itau_wcosp, itap, start_time, day_step_phy
66        endif
67
68! On le donne a  cosp_output_write_mod pour que les histwrite y aient acces:
69       CALL set_itau_iocosp(itau_wcosp)
70        if (prt_level >= 10) then
71              WRITE(lunout,*)'itau_iocosp =',itau_iocosp
72        endif
73
74    ok_sync = .TRUE.
75   
76!DO iinit=1, iinitend
77! AI sept 2014 cette boucle supprimee
78! On n'ecrit pas quand itap=1 (cosp)
79
80   if (prt_level >= 10) then
81         WRITE(lunout,*)'DO iinit=1, iinitend ',iinitend
82   endif
83
84!!#ifdef CPP_XIOS
85! !$OMP MASTER
86!IF (cosp_varsdefined) THEN
87!   if (prt_level >= 10) then
88!         WRITE(lunout,*)'Apell xios_update_calendar cosp_varsdefined iinitend ', &
89!                         cosp_varsdefined,iinitend
90!   endif
91!    CALL xios_update_calendar(itau_wcosp)
92!ENDIF
93!  !$OMP END MASTER
94!  !$OMP BARRIER
95!!#endif
96
97!!!! Sorties Calipso
98 if (cfg%Llidar_sim) then
99! Pb des valeurs indefinies, on les met a 0
100! A refaire proprement
101!  do k = 1,Nlevout
102!     do ip = 1,Npoints
103!     if(stlidar%lidarcld(ip,k).eq.R_UNDEF)then
104!      stlidar%lidarcld(ip,k)=missing_val
105!     endif
106!     if(stlidar%proftemp(ip,k).eq.R_UNDEF)then !TIBO
107!      stlidar%proftemp(ip,k)=missing_val       !TIBO
108!     endif                                     !TIBO
109!     enddo
110
111!     do ii= 1,Ncolumns                               !TIBO
112!      do ip = 1,Npoints                              !TIBO
113!!       if(stlidar%profSR(ip,ii,k).eq.R_UNDEF)then    !TIBO
114!!        stlidar%profSR(ip,ii,k)=missing_val          !TIBO
115!       if(stlidar%profSR(ip,k,ii).eq.R_UNDEF)then    !TIBO2
116!        stlidar%profSR(ip,k,ii)=missing_val          !TIBO2
117!       endif                                         !TIBO
118!      enddo                                          !TIBO
119!     enddo                                           !TIBO
120!  enddo
121
122!  do ip = 1,Npoints
123!   do k = 1,Nlevlmdz
124!     if(sglidar%beta_mol(ip,k).eq.R_UNDEF)then
125!      sglidar%beta_mol(ip,k)=missing_val
126!     endif
127
128!     do ii= 1,Ncolumns
129!       if(sglidar%beta_tot(ip,ii,k).eq.R_UNDEF)then
130!        sglidar%beta_tot(ip,ii,k)=missing_val
131!       endif
132!     enddo
133
134!    enddo    !k = 1,Nlevlmdz
135!   enddo     !ip = 1,Npoints
136
137!   do k = 1,LIDAR_NCAT
138!    do ip = 1,Npoints
139!     if(stlidar%cldlayer(ip,k).eq.R_UNDEF)then
140!       stlidar%cldlayer(ip,k)=missing_val
141!     endif
142!    enddo
143!   enddo
144
145!   do k = 1,LIDAR_NTYPE                       !OPAQ
146!    do ip = 1,Npoints                         !OPAQ
147!     if(stlidar%cldtype(ip,k).eq.R_UNDEF)then !OPAQ
148!       stlidar%cldtype(ip,k)=missing_val      !OPAQ
149!     endif                                    !OPAQ
150!    enddo                                     !OPAQ
151!   enddo                                      !OPAQ
152 
153!!! AI 02 2018
154! Traitement missing_val
155   where(stlidar%lidarcld == R_UNDEF) stlidar%lidarcld = missing_val
156   where(stlidar%proftemp == R_UNDEF) stlidar%proftemp = missing_val   !TIBO 
157   where(stlidar%profSR == R_UNDEF) stlidar%profSR = missing_val       !TIBO2
158   where(sglidar%beta_mol == R_UNDEF) sglidar%beta_mol = missing_val 
159   where(sglidar%beta_tot == R_UNDEF) sglidar%beta_tot = missing_val
160   where(stlidar%cldlayer == R_UNDEF) stlidar%cldlayer = missing_val
161   where(stlidar%cldtype == R_UNDEF) stlidar%cldtype = missing_val     !OPAQ
162   where(stlidar%cfad_sr == R_UNDEF) stlidar%cfad_sr = missing_val
163! AI 11 / 2015
164   where(stlidar%parasolrefl == R_UNDEF) stlidar%parasolrefl = missing_val
165   where(stlidar%lidarcldtmp == R_UNDEF) stlidar%lidarcldtmp = missing_val
166   where(stlidar%cldlayerphase == R_UNDEF) stlidar%cldlayerphase = missing_val
167   where(stlidar%lidarcldphase == R_UNDEF) stlidar%lidarcldphase = missing_val
168   where(stlidar%lidarcldtype == R_UNDEF) stlidar%lidarcldtype = missing_val   !OPAQ
169   where(stlidar%lidarcldtmp == R_UNDEF) stlidar%lidarcldtmp = missing_val
170 
171!   print*,'Appel histwrite2d_cosp'
172   CALL histwrite2d_cosp(o_cllcalipso,stlidar%cldlayer(:,1))
173   CALL histwrite2d_cosp(o_clhcalipso,stlidar%cldlayer(:,3))
174   CALL histwrite2d_cosp(o_clmcalipso,stlidar%cldlayer(:,2))
175   CALL histwrite2d_cosp(o_cltcalipso,stlidar%cldlayer(:,4))
176   CALL histwrite3d_cosp(o_clcalipso,stlidar%lidarcld,nvert)
177   CALL histwrite3d_cosp(o_clcalipsotmp,stlidar%lidarcldtmp(:,:,1),nverttemp)
178
179   CALL histwrite2d_cosp(o_cllcalipsoice,stlidar%cldlayerphase(:,1,1))
180   CALL histwrite2d_cosp(o_clhcalipsoice,stlidar%cldlayerphase(:,3,1))
181   CALL histwrite2d_cosp(o_clmcalipsoice,stlidar%cldlayerphase(:,2,1))
182   CALL histwrite2d_cosp(o_cltcalipsoice,stlidar%cldlayerphase(:,4,1))
183   CALL histwrite3d_cosp(o_clcalipsoice,stlidar%lidarcldphase(:,:,1),nvert)
184   CALL histwrite3d_cosp(o_clcalipsotmpice,stlidar%lidarcldtmp(:,:,2),nverttemp)
185
186   CALL histwrite2d_cosp(o_cllcalipsoliq,stlidar%cldlayerphase(:,1,2))
187   CALL histwrite2d_cosp(o_clhcalipsoliq,stlidar%cldlayerphase(:,3,2))
188   CALL histwrite2d_cosp(o_clmcalipsoliq,stlidar%cldlayerphase(:,2,2))
189   CALL histwrite2d_cosp(o_cltcalipsoliq,stlidar%cldlayerphase(:,4,2))
190   CALL histwrite3d_cosp(o_clcalipsoliq,stlidar%lidarcldphase(:,:,2),nvert)
191   CALL histwrite3d_cosp(o_clcalipsotmpliq,stlidar%lidarcldtmp(:,:,3),nverttemp)
192
193   CALL histwrite2d_cosp(o_cllcalipsoun,stlidar%cldlayerphase(:,1,3))
194   CALL histwrite2d_cosp(o_clhcalipsoun,stlidar%cldlayerphase(:,3,3))
195   CALL histwrite2d_cosp(o_clmcalipsoun,stlidar%cldlayerphase(:,2,3))
196   CALL histwrite2d_cosp(o_cltcalipsoun,stlidar%cldlayerphase(:,4,3))
197   CALL histwrite3d_cosp(o_clcalipsoun,stlidar%lidarcldphase(:,:,3),nvert)
198   CALL histwrite3d_cosp(o_clcalipsotmpun,stlidar%lidarcldtmp(:,:,4),nverttemp)
199
200   CALL histwrite2d_cosp(o_clopaquecalipso,stlidar%cldtype(:,1))               !OPAQ
201   CALL histwrite2d_cosp(o_clthincalipso,stlidar%cldtype(:,2))                 !OPAQ
202   CALL histwrite2d_cosp(o_clzopaquecalipso,stlidar%cldtype(:,3))              !OPAQ
203
204   CALL histwrite3d_cosp(o_clcalipsoopaque,stlidar%lidarcldtype(:,:,1),nvert)  !OPAQ
205   CALL histwrite3d_cosp(o_clcalipsothin,stlidar%lidarcldtype(:,:,2),nvert)    !OPAQ
206   CALL histwrite3d_cosp(o_clcalipsozopaque,stlidar%lidarcldtype(:,:,3),nvert) !OPAQ
207   CALL histwrite3d_cosp(o_clcalipsoopacity,stlidar%lidarcldtype(:,:,4),nvert) !OPAQ
208
209   CALL histwrite3d_cosp(o_proftemp,stlidar%proftemp,nvert)                    !TIBO
210
211#ifdef CPP_XIOS
212   CALL histwrite4d_cosp(o_cfad_lidarsr532,stlidar%cfad_sr)
213   CALL histwrite4d_cosp(o_profSR,stlidar%profSR)                              !TIBO
214#else
215   do icl=1,SR_BINS
216      CALL histwrite3d_cosp(o_cfad_lidarsr532,stlidar%cfad_sr(:,icl,:),nvert,icl)
217   enddo
218   do icl=1,Ncolumns                                                              !TIBO
219      CALL histwrite3d_cosp(o_profSR,stlidar%profSR(:,icl,:),nvert,icl)           !TIBO
220   enddo                                                                          !TIBO
221#endif
222   CALL histwrite3d_cosp(o_parasol_refl,stlidar%parasolrefl,nvertp)
223
224   do k=1,PARASOL_NREFL
225    do ip=1, Npoints
226     if (stlidar%cldlayer(ip,4).gt.0.01.and.stlidar%parasolrefl(ip,k).ne.missing_val) then
227       parasolcrefl(ip,k)=(stlidar%parasolrefl(ip,k)-0.03*(1.-stlidar%cldlayer(ip,4)))/ &
228                            stlidar%cldlayer(ip,4)
229        Ncref(ip,k) = 1.
230     else
231        parasolcrefl(ip,k)=missing_val
232        Ncref(ip,k) = 0.
233     endif
234    enddo
235   
236   enddo
237   CALL histwrite3d_cosp(o_Ncrefl,Ncref,nvertp)
238   CALL histwrite3d_cosp(o_parasol_crefl,parasolcrefl,nvertp)
239
240#ifdef CPP_XIOS
241   CALL histwrite4d_cosp(o_atb532,sglidar%beta_tot)
242#else
243   do icl=1,Ncolumns
244      CALL histwrite3d_cosp(o_atb532,sglidar%beta_tot(:,icl,:),nvertmcosp,icl)
245   enddo
246#endif
247
248   CALL histwrite3d_cosp(o_beta_mol532,sglidar%beta_mol,nvertmcosp)
249 endif !Lidar
250
251!!! Sorties Cloudsat
252 if (cfg%Lradar_sim) then
253
254   where(stradar%cfad_ze == R_UNDEF) stradar%cfad_ze = missing_val
255#ifdef CPP_XIOS
256   CALL histwrite4d_cosp(o_dbze94,sgradar%Ze_tot)
257   CALL histwrite4d_cosp(o_cfadDbze94,stradar%cfad_ze)
258#else
259   do icl=1,Ncolumns
260      CALL histwrite3d_cosp(o_dbze94,sgradar%Ze_tot(:,icl,:),nvertmcosp,icl)
261   enddo
262   do icl=1,DBZE_BINS
263    CALL histwrite3d_cosp(o_cfadDbze94,stradar%cfad_ze(:,icl,:),nvert,icl)
264   enddo
265#endif
266 endif
267
268!!! Sorties combinees Cloudsat et Calipso
269 if (cfg%Llidar_sim .and. cfg%Lradar_sim) then
270   where(stradar%lidar_only_freq_cloud == R_UNDEF) &
271                           stradar%lidar_only_freq_cloud = missing_val
272   CALL histwrite3d_cosp(o_clcalipso2,stradar%lidar_only_freq_cloud,nvert)
273   where(stradar%radar_lidar_tcc == R_UNDEF) &
274                           stradar%radar_lidar_tcc = missing_val
275   CALL histwrite2d_cosp(o_cltlidarradar,stradar%radar_lidar_tcc)
276 endif
277
278!!! Sorties Isccp
279 if (cfg%Lisccp_sim) then
280! Traitement des valeurs indefinies
281!   do ip = 1,Npoints
282!    if(isccp%totalcldarea(ip).eq.R_UNDEF)then
283!      isccp%totalcldarea(ip)=missing_val
284!    endif
285!    if(isccp%meanptop(ip).eq.R_UNDEF)then
286!      isccp%meanptop(ip)=missing_val
287!    endif
288!    if(isccp%meantaucld(ip).eq.R_UNDEF)then
289!      isccp%meantaucld(ip)=missing_val
290!    endif
291!    if(isccp%meanalbedocld(ip).eq.R_UNDEF)then
292!     isccp%meanalbedocld(ip)=missing_val
293!    endif
294!    if(isccp%meantb(ip).eq.R_UNDEF)then
295!     isccp%meantb(ip)=missing_val
296!    endif
297!    if(isccp%meantbclr(ip).eq.R_UNDEF)then
298!       isccp%meantbclr(ip)=missing_val
299!    endif
300
301!    do k=1,7
302!     do ii=1,7
303!     if(isccp%fq_isccp(ip,ii,k).eq.R_UNDEF)then
304!      isccp%fq_isccp(ip,ii,k)=missing_val
305!     endif
306!     enddo
307!    enddo
308
309!    do ii=1,Ncolumns
310!     if(isccp%boxtau(ip,ii).eq.R_UNDEF)then
311!       isccp%boxtau(ip,ii)=missing_val
312!     endif
313!    enddo
314
315!    do ii=1,Ncolumns
316!     if(isccp%boxptop(ip,ii).eq.R_UNDEF)then
317!      isccp%boxptop(ip,ii)=missing_val
318!     endif
319!    enddo
320!   enddo
321  where(isccp%totalcldarea == R_UNDEF) isccp%totalcldarea = missing_val
322  where(isccp%meanptop == R_UNDEF) isccp%meanptop = missing_val
323  where(isccp%meantaucld == R_UNDEF) isccp%meantaucld = missing_val
324  where(isccp%meanalbedocld == R_UNDEF) isccp%meanalbedocld = missing_val
325  where(isccp%meantb == R_UNDEF) isccp%meantb = missing_val
326  where(isccp%meantbclr == R_UNDEF) isccp%meantbclr = missing_val
327  where(isccp%fq_isccp == R_UNDEF) isccp%fq_isccp = missing_val
328  where(isccp%boxtau == R_UNDEF) isccp%boxtau = missing_val
329  where(isccp%boxptop == R_UNDEF) isccp%boxptop = missing_val
330
331   CALL histwrite2d_cosp(o_sunlit,gbx%sunlit)
332#ifdef CPP_XIOS
333   CALL histwrite4d_cosp(o_clisccp2,isccp%fq_isccp)
334#else
335   do icl=1,7
336   CALL histwrite3d_cosp(o_clisccp2,isccp%fq_isccp(:,icl,:),nvertisccp,icl)
337   enddo
338#endif
339   CALL histwrite3d_cosp(o_boxtauisccp,isccp%boxtau,nvertcol)
340   CALL histwrite3d_cosp(o_boxptopisccp,isccp%boxptop,nvertcol)
341   CALL histwrite2d_cosp(o_tclisccp,isccp%totalcldarea)
342   CALL histwrite2d_cosp(o_ctpisccp,isccp%meanptop)
343   CALL histwrite2d_cosp(o_tauisccp,isccp%meantaucld)
344   CALL histwrite2d_cosp(o_albisccp,isccp%meanalbedocld)
345   CALL histwrite2d_cosp(o_meantbisccp,isccp%meantb)
346   CALL histwrite2d_cosp(o_meantbclrisccp,isccp%meantbclr)
347 endif ! Isccp
348
349!!! MISR simulator
350 if (cfg%Lmisr_sim) then
351!   do ip=1,Npoints
352!     do ii=1,7
353!       do k=1,MISR_N_CTH
354!        if(misr%fq_MISR(ip,ii,k).eq.R_UNDEF)then
355!            misr%fq_MISR(ip,ii,k)=missing_val
356!        endif
357!       enddo
358!     enddo
359!   enddo
360   where(misr%fq_MISR == R_UNDEF) misr%fq_MISR = missing_val
361
362#ifdef CPP_XIOS
363   CALL histwrite4d_cosp(o_clMISR,misr%fq_MISR)
364#else
365   do icl=1,7
366      CALL histwrite3d_cosp(o_clMISR,misr%fq_MISR(:,icl,:),nvertmisr,icl)
367   enddo
368#endif
369 endif
370
371!!! Modis simulator
372 if (cfg%Lmodis_sim) then
373  where(modis%Cloud_Fraction_Low_Mean == R_UNDEF) &
374        modis%Cloud_Fraction_Low_Mean = missing_val
375  where(modis%Cloud_Fraction_High_Mean == R_UNDEF) &
376        modis%Cloud_Fraction_High_Mean = missing_val
377  where(modis%Cloud_Fraction_Mid_Mean == R_UNDEF) &
378        modis%Cloud_Fraction_Mid_Mean = missing_val
379  where(modis%Cloud_Fraction_Total_Mean == R_UNDEF) &
380        modis%Cloud_Fraction_Total_Mean = missing_val
381  where(modis%Cloud_Fraction_Water_Mean == R_UNDEF) &
382        modis%Cloud_Fraction_Water_Mean = missing_val
383  where(modis%Cloud_Fraction_Ice_Mean == R_UNDEF) &
384        modis%Cloud_Fraction_Ice_Mean = missing_val
385  where(modis%Optical_Thickness_Total_Mean == R_UNDEF) &
386        modis%Optical_Thickness_Total_Mean = missing_val
387  where(modis%Optical_Thickness_Water_Mean == R_UNDEF) &
388        modis%Optical_Thickness_Water_Mean = missing_val
389  where(modis%Optical_Thickness_Ice_Mean == R_UNDEF) &
390        modis%Optical_Thickness_Ice_Mean = missing_val
391  where(modis%Cloud_Particle_Size_Water_Mean == R_UNDEF) &
392        modis%Cloud_Particle_Size_Water_Mean = missing_val
393  where(modis%Cloud_Particle_Size_Ice_Mean == R_UNDEF) &
394        modis%Cloud_Particle_Size_Ice_Mean = missing_val
395  where(modis%Cloud_Top_Pressure_Total_Mean == R_UNDEF) &
396        modis%Cloud_Top_Pressure_Total_Mean = missing_val
397  where(modis%Liquid_Water_Path_Mean == R_UNDEF) &
398        modis%Liquid_Water_Path_Mean = missing_val
399  where(modis%Ice_Water_Path_Mean == R_UNDEF) &
400        modis%Ice_Water_Path_Mean = missing_val
401
402!  de ip=1,Npoints
403!    if(modis%Cloud_Fraction_Low_Mean(ip).eq.R_UNDEF)then
404!      modis%Cloud_Fraction_Low_Mean(ip)=missing_val
405!    endif
406!    if(modis%Cloud_Fraction_High_Mean(ip).eq.R_UNDEF)then
407!       modis%Cloud_Fraction_High_Mean(ip)=missing_val
408!    endif
409!    if(modis%Cloud_Fraction_Mid_Mean(ip).eq.R_UNDEF)then
410!       modis%Cloud_Fraction_Mid_Mean(ip)=missing_val
411!    endif
412!    if(modis%Cloud_Fraction_Total_Mean(ip).eq.R_UNDEF)then
413!       modis%Cloud_Fraction_Total_Mean(ip)=missing_val
414!    endif
415!    if(modis%Cloud_Fraction_Water_Mean(ip).eq.R_UNDEF)then
416!       modis%Cloud_Fraction_Water_Mean(ip)=missing_val
417!    endif
418!    if(modis%Cloud_Fraction_Ice_Mean(ip).eq.R_UNDEF)then
419!       modis%Cloud_Fraction_Ice_Mean(ip)=missing_val
420!    endif
421!    if(modis%Optical_Thickness_Total_Mean(ip).eq.R_UNDEF)then
422!       modis%Optical_Thickness_Total_Mean(ip)=missing_val
423!    endif
424!    if(modis%Optical_Thickness_Water_Mean(ip).eq.R_UNDEF)then
425!       modis%Optical_Thickness_Water_Mean(ip)=missing_val
426!    endif
427!    if(modis%Optical_Thickness_Ice_Mean(ip).eq.R_UNDEF)then
428!       modis%Optical_Thickness_Ice_Mean(ip)=missing_val
429!    endif
430!    if(modis%Cloud_Particle_Size_Water_Mean(ip).eq.R_UNDEF)then
431!       modis%Cloud_Particle_Size_Water_Mean(ip)=missing_val
432!    endif
433!    if(modis%Cloud_Particle_Size_Ice_Mean(ip).eq.R_UNDEF)then
434!       modis%Cloud_Particle_Size_Ice_Mean(ip)=missing_val
435!    endif
436!    if(modis%Cloud_Top_Pressure_Total_Mean(ip).eq.R_UNDEF)then
437!       modis%Cloud_Top_Pressure_Total_Mean(ip)=missing_val
438!    endif
439!    if(modis%Liquid_Water_Path_Mean(ip).eq.R_UNDEF)then
440!       modis%Liquid_Water_Path_Mean(ip)=missing_val
441!    endif
442!    if(modis%Ice_Water_Path_Mean(ip).eq.R_UNDEF)then
443!       modis%Ice_Water_Path_Mean(ip)=missing_val
444!    endif
445!  enddo
446
447    where(modis%Optical_Thickness_Total_LogMean == R_UNDEF) &
448          modis%Optical_Thickness_Total_LogMean = missing_val
449           
450    where(modis%Optical_Thickness_Water_LogMean == R_UNDEF) &
451          modis%Optical_Thickness_Water_LogMean = missing_val
452
453    where(modis%Optical_Thickness_Ice_LogMean == R_UNDEF) &
454          modis%Optical_Thickness_Ice_LogMean = missing_val
455   
456   CALL histwrite2d_cosp(o_cllmodis,modis%Cloud_Fraction_Low_Mean)
457   CALL histwrite2d_cosp(o_clhmodis,modis%Cloud_Fraction_High_Mean)
458   CALL histwrite2d_cosp(o_clmmodis,modis%Cloud_Fraction_Mid_Mean)
459   CALL histwrite2d_cosp(o_cltmodis,modis%Cloud_Fraction_Total_Mean)
460   CALL histwrite2d_cosp(o_clwmodis,modis%Cloud_Fraction_Water_Mean)
461   CALL histwrite2d_cosp(o_climodis,modis%Cloud_Fraction_Ice_Mean)
462   CALL histwrite2d_cosp(o_tautmodis,modis%Optical_Thickness_Total_Mean)
463   CALL histwrite2d_cosp(o_tauwmodis,modis%Optical_Thickness_Water_Mean)
464   CALL histwrite2d_cosp(o_tauimodis,modis%Optical_Thickness_Ice_Mean)
465   CALL histwrite2d_cosp(o_tautlogmodis,modis%Optical_Thickness_Total_LogMean) 
466   CALL histwrite2d_cosp(o_tauwlogmodis,modis%Optical_Thickness_Water_LogMean)
467   CALL histwrite2d_cosp(o_tauilogmodis,modis%Optical_Thickness_Ice_LogMean)
468   CALL histwrite2d_cosp(o_reffclwmodis,modis%Cloud_Particle_Size_Water_Mean)
469   CALL histwrite2d_cosp(o_reffclimodis,modis%Cloud_Particle_Size_Ice_Mean)
470   CALL histwrite2d_cosp(o_pctmodis,modis%Cloud_Top_Pressure_Total_Mean)
471   CALL histwrite2d_cosp(o_lwpmodis,modis%Liquid_Water_Path_Mean)
472   CALL histwrite2d_cosp(o_iwpmodis,modis%Ice_Water_Path_Mean)
473
474!   do ip=1,Npoints
475!     do ii=1,7
476!       do k=1,7
477!       if(modis%Optical_Thickness_vs_Cloud_Top_Pressure(ip,ii,k).eq.R_UNDEF)then
478!          modis%Optical_Thickness_vs_Cloud_Top_Pressure(ip,ii,k)=missing_val
479!        endif
480!       enddo
481!     enddo
482!    enddo
483    where(modis%Optical_Thickness_vs_Cloud_Top_Pressure == R_UNDEF) &
484          modis%Optical_Thickness_vs_Cloud_Top_Pressure = missing_val
485
486#ifdef CPP_XIOS
487   CALL histwrite4d_cosp(o_clmodis,modis%Optical_Thickness_vs_Cloud_Top_Pressure)
488#else
489   do icl=1,7
490   CALL histwrite3d_cosp(o_clmodis, &
491     modis%Optical_Thickness_vs_Cloud_Top_Pressure(:,icl,:),nvertisccp,icl)           
492   enddo
493#endif
494
495    where(modis%Optical_Thickness_vs_ReffIce == R_UNDEF) &
496          modis%Optical_Thickness_vs_ReffIce = missing_val
497
498    where(modis%Optical_Thickness_vs_ReffLiq == R_UNDEF) &
499          modis%Optical_Thickness_vs_ReffLiq = missing_val
500
501#ifdef CPP_XIOS
502    CALL histwrite4d_cosp(o_crimodis,modis%Optical_Thickness_vs_ReffIce)
503    CALL histwrite4d_cosp(o_crlmodis,modis%Optical_Thickness_vs_ReffLiq)
504#else
505    do icl=1,7
506   CALL histwrite3d_cosp(o_crimodis, &
507     modis%Optical_Thickness_vs_ReffIce(:,icl,:),nvertReffIce,icl)
508   CALL histwrite3d_cosp(o_crlmodis, &
509     modis%Optical_Thickness_vs_ReffLiq(:,icl,:),nvertReffLiq,icl)
510    enddo
511#endif
512 endif
513
514 IF(.NOT.cosp_varsdefined) THEN
515!$OMP MASTER
516#ifndef CPP_IOIPSL_NO_OUTPUT
517            DO iff=1,3
518                IF (cosp_outfilekeys(iff)) THEN
519                  CALL histend(cosp_nidfiles(iff))
520                ENDIF ! cosp_outfilekeys
521            ENDDO !  iff
522#endif
523! Fermeture dans phys_output_write
524!#ifdef CPP_XIOS
525            !On finalise l'initialisation:
526            !CALL wxios_closedef()
527!#endif
528
529!$OMP END MASTER
530!$OMP BARRIER
531            cosp_varsdefined = .TRUE.
532 END IF
533
534    IF(cosp_varsdefined) THEN
535! On synchronise les fichiers pour IOIPSL
536#ifndef CPP_IOIPSL_NO_OUTPUT
537!$OMP MASTER
538     DO iff=1,3
539         IF (ok_sync .AND. cosp_outfilekeys(iff)) THEN
540             CALL histsync(cosp_nidfiles(iff))
541         ENDIF
542     END DO
543!$OMP END MASTER
544#endif
545    ENDIF  !cosp_varsdefined
546
547    END SUBROUTINE cosp_output_write
548
549! ug Routine pour definir itau_iocosp depuis cosp_output_write_mod:
550  SUBROUTINE set_itau_iocosp(ito)
551      IMPLICIT NONE
552      INTEGER, INTENT(IN) :: ito
553      itau_iocosp = ito
554  END SUBROUTINE
555
556  SUBROUTINE histdef2d_cosp (iff,var)
557
558    USE ioipsl
559    USE dimphy
560    use iophy
561    USE mod_phys_lmdz_para
562    USE mod_grid_phy_lmdz, ONLY: nbp_lon
563    USE print_control_mod, ONLY: lunout,prt_level
564#ifdef CPP_XIOS
565  USE wxios
566#endif
567
568    IMPLICIT NONE
569
570    INCLUDE "clesphys.h"
571
572    INTEGER                          :: iff
573    TYPE(ctrl_outcosp)               :: var
574
575    REAL zstophym
576    CHARACTER(LEN=20) :: typeecrit
577
578    ! ug On récupère le type écrit de la structure:
579    !       Assez moche, Ã|  refaire si meilleure méthode...
580    IF (INDEX(var%cosp_typeecrit(iff), "once") > 0) THEN
581       typeecrit = 'once'
582    ELSE IF(INDEX(var%cosp_typeecrit(iff), "t_min") > 0) THEN
583       typeecrit = 't_min(X)'
584    ELSE IF(INDEX(var%cosp_typeecrit(iff), "t_max") > 0) THEN
585       typeecrit = 't_max(X)'
586    ELSE IF(INDEX(var%cosp_typeecrit(iff), "inst") > 0) THEN
587       typeecrit = 'inst(X)'
588    ELSE
589       typeecrit = cosp_outfiletypes(iff)
590    ENDIF
591
592    IF (typeecrit=='inst(X)'.OR.typeecrit=='once') THEN
593       zstophym=zoutm_cosp(iff)
594    ELSE
595       zstophym=zdtimemoy_cosp
596    ENDIF
597
598#ifdef CPP_XIOS
599     IF (.not. ok_all_xml) then
600       IF ( var%cles(iff) ) THEN
601         if (prt_level >= 10) then
602              WRITE(lunout,*)'Appel wxios_add_field_to_file var%name =',var%name
603         endif
604        CALL wxios_add_field_to_file(var%name, 2, cosp_nidfiles(iff), cosp_outfilenames(iff), &
605                                     var%description, var%unit, 1, typeecrit)
606       ENDIF
607     ENDIF
608#endif
609
610#ifndef CPP_IOIPSL_NO_OUTPUT
611       IF ( var%cles(iff) ) THEN
612          CALL histdef (cosp_nidfiles(iff), var%name, var%description, var%unit, &
613               nbp_lon,jj_nb,nhoricosp(iff), 1,1,1, -99, 32, &
614               typeecrit, zstophym,zoutm_cosp(iff))
615       ENDIF
616#endif
617
618  END SUBROUTINE histdef2d_cosp
619
620 SUBROUTINE histdef3d_cosp (iff,var,nvertsave,ncols)
621    USE ioipsl
622    USE dimphy
623    use iophy
624    USE mod_phys_lmdz_para
625    USE mod_grid_phy_lmdz, ONLY: nbp_lon
626    USE print_control_mod, ONLY: lunout,prt_level
627
628#ifdef CPP_XIOS
629  USE wxios
630#endif
631
632
633    IMPLICIT NONE
634
635    INCLUDE "clesphys.h"
636
637    INTEGER                        :: iff, klevs
638    INTEGER, INTENT(IN), OPTIONAL  :: ncols ! ug RUSTINE POUR LES variables 4D
639    INTEGER, INTENT(IN)           :: nvertsave
640    TYPE(ctrl_outcosp)             :: var
641
642    REAL zstophym
643    CHARACTER(LEN=20) :: typeecrit, nomi
644    CHARACTER(LEN=20) :: nom
645    character(len=2) :: str2
646    CHARACTER(len=20) :: nam_axvert
647
648! Axe vertical
649      IF (nvertsave.eq.nvertp(iff)) THEN
650          klevs=PARASOL_NREFL
651          nam_axvert="sza"
652      ELSE IF (nvertsave.eq.nvertisccp(iff)) THEN
653          klevs=7
654          nam_axvert="pressure2"
655      ELSE IF (nvertsave.eq.nvertcol(iff)) THEN
656          klevs=Ncolout
657          nam_axvert="column"
658      ELSE IF (nvertsave.eq.nverttemp(iff)) THEN
659          klevs=LIDAR_NTEMP
660          nam_axvert="temp"
661      ELSE IF (nvertsave.eq.nvertmisr(iff)) THEN
662          klevs=MISR_N_CTH
663          nam_axvert="cth16"
664      ELSE IF (nvertsave.eq.nvertReffIce(iff)) THEN
665          klevs= numMODISReffIceBins
666          nam_axvert="ReffIce"
667      ELSE IF (nvertsave.eq.nvertReffLiq(iff)) THEN
668          klevs= numMODISReffLiqBins
669          nam_axvert="ReffLiq"
670      ELSE
671           klevs=Nlevout
672           nam_axvert="presnivs"
673      ENDIF
674
675! ug RUSTINE POUR LES Champs 4D
676      IF (PRESENT(ncols)) THEN
677               write(str2,'(i2.2)')ncols
678               nomi=var%name
679               nom="c"//str2//"_"//nomi
680      ELSE
681               nom=var%name
682      END IF
683
684    ! ug On récupère le type écrit de la structure:
685    !       Assez moche, Ã|  refaire si meilleure méthode...
686    IF (INDEX(var%cosp_typeecrit(iff), "once") > 0) THEN
687       typeecrit = 'once'
688    ELSE IF(INDEX(var%cosp_typeecrit(iff), "t_min") > 0) THEN
689       typeecrit = 't_min(X)'
690    ELSE IF(INDEX(var%cosp_typeecrit(iff), "t_max") > 0) THEN
691       typeecrit = 't_max(X)'
692    ELSE IF(INDEX(var%cosp_typeecrit(iff), "inst") > 0) THEN
693       typeecrit = 'inst(X)'
694    ELSE
695       typeecrit = cosp_outfiletypes(iff)
696    ENDIF
697
698    IF (typeecrit=='inst(X)'.OR.typeecrit=='once') THEN
699       zstophym=zoutm_cosp(iff)
700    ELSE
701       zstophym=zdtimemoy_cosp
702    ENDIF
703
704#ifdef CPP_XIOS
705      IF (.not. ok_all_xml) then
706        IF ( var%cles(iff) ) THEN
707          if (prt_level >= 10) then
708              WRITE(lunout,*)'Appel wxios_add_field_to_file 3d nom variable nam_axvert = ',nom, nam_axvert
709          endif
710          CALL wxios_add_field_to_file(nom, 3, cosp_nidfiles(iff), cosp_outfilenames(iff), &
711                                       var%description, var%unit, 1, typeecrit, nam_axvert)
712        ENDIF
713      ENDIF
714#endif
715
716#ifndef CPP_IOIPSL_NO_OUTPUT
717       IF ( var%cles(iff) ) THEN
718          CALL histdef (cosp_nidfiles(iff), nom, var%description, var%unit, &
719               nbp_lon, jj_nb, nhoricosp(iff), klevs, 1, &
720               klevs, nvertsave, 32, typeecrit, &
721               zstophym, zoutm_cosp(iff))
722       ENDIF
723#endif
724
725  END SUBROUTINE histdef3d_cosp
726
727 SUBROUTINE histwrite2d_cosp(var,field)
728  USE dimphy
729  USE mod_phys_lmdz_para
730  USE ioipsl
731  use iophy
732  USE mod_grid_phy_lmdz, ONLY: nbp_lon
733  USE print_control_mod, ONLY: lunout,prt_level
734
735#ifdef CPP_XIOS
736  USE xios, only: xios_send_field
737#endif
738
739  IMPLICIT NONE
740  INCLUDE 'clesphys.h'
741
742    TYPE(ctrl_outcosp), INTENT(IN) :: var
743    REAL, DIMENSION(:), INTENT(IN) :: field
744
745    INTEGER :: iff
746
747    REAL,DIMENSION(klon_mpi) :: buffer_omp
748    INTEGER, allocatable, DIMENSION(:) :: index2d
749    REAL :: Field2d(nbp_lon,jj_nb)
750    CHARACTER(LEN=20) ::  nomi, nom
751    character(len=2) :: str2
752    LOGICAL, SAVE  :: firstx
753!$OMP THREADPRIVATE(firstx)
754
755    IF (prt_level >= 9) WRITE(lunout,*)'Begin histrwrite2d ',var%name
756
757  ! On regarde si on est dans la phase de définition ou d'écriture:
758  IF(.NOT.cosp_varsdefined) THEN
759!$OMP MASTER
760      !Si phase de définition.... on définit
761      CALL conf_cospoutputs(var%name,var%cles)
762      DO iff=1, 3
763         IF (cosp_outfilekeys(iff)) THEN
764            CALL histdef2d_cosp(iff, var)
765         ENDIF
766      ENDDO
767!$OMP END MASTER
768  ELSE
769    !Et sinon on.... écrit
770    IF (SIZE(field)/=klon) &
771  CALL abort_physic('iophy::histwrite2d_cosp','Field first DIMENSION not equal to klon',1)
772
773    CALL Gather_omp(field,buffer_omp)
774!$OMP MASTER
775    CALL grid1Dto2D_mpi(buffer_omp,Field2d)
776
777! La boucle sur les fichiers:
778      firstx=.true.
779      DO iff=1, 3
780           IF (var%cles(iff) .AND. cosp_outfilekeys(iff)) THEN
781                ALLOCATE(index2d(nbp_lon*jj_nb))
782#ifndef CPP_IOIPSL_NO_OUTPUT
783        CALL histwrite(cosp_nidfiles(iff),var%name,itau_iocosp,Field2d,nbp_lon*jj_nb,index2d)
784#endif
785                deallocate(index2d)
786#ifdef CPP_XIOS
787              IF (.not. ok_all_xml) then
788                 if (firstx) then
789                  if (prt_level >= 10) then
790                    WRITE(lunout,*)'xios_send_field variable ',var%name
791                  endif
792                  CALL xios_send_field(var%name, Field2d)
793                   firstx=.false.
794                 endif
795              ENDIF
796#endif
797           ENDIF
798      ENDDO
799
800#ifdef CPP_XIOS
801      IF (ok_all_xml) THEN
802        if (prt_level >= 1) then
803              WRITE(lunout,*)'xios_send_field variable ',var%name
804        endif
805       CALL xios_send_field(var%name, Field2d)
806      ENDIF
807#endif
808
809!$OMP END MASTER   
810  ENDIF ! vars_defined
811  IF (prt_level >= 9) WRITE(lunout,*)'End histrwrite2d_cosp ',var%name
812  END SUBROUTINE histwrite2d_cosp
813
814! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE
815! AI sept 2013
816  SUBROUTINE histwrite3d_cosp(var, field, nverts, ncols)
817  USE dimphy
818  USE mod_phys_lmdz_para
819  USE ioipsl
820  use iophy
821  USE mod_grid_phy_lmdz, ONLY: nbp_lon
822  USE print_control_mod, ONLY: lunout,prt_level
823
824#ifdef CPP_XIOS
825  USE xios, only: xios_send_field
826#endif
827
828
829  IMPLICIT NONE
830  INCLUDE 'clesphys.h'
831
832    TYPE(ctrl_outcosp), INTENT(IN)    :: var
833    REAL, DIMENSION(:,:), INTENT(IN)  :: field ! --> field(klon,:)
834    INTEGER, INTENT(IN), OPTIONAL     :: ncols ! ug RUSTINE POUR LES Champs 4D.....
835    INTEGER, DIMENSION(3), INTENT(IN) :: nverts
836
837    INTEGER :: iff, k
838
839    REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp
840    REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2))
841    INTEGER :: ip, n, nlev
842    INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d
843    CHARACTER(LEN=20) ::  nomi, nom
844    character(len=2) :: str2
845    LOGICAL, SAVE  :: firstx
846!$OMP THREADPRIVATE(firstx)
847
848  IF (prt_level >= 9) write(lunout,*)'Begin histrwrite3d ',var%name
849
850! ug RUSTINE POUR LES STD LEVS.....
851      IF (PRESENT(ncols)) THEN
852              write(str2,'(i2.2)')ncols
853              nomi=var%name
854              nom="c"//str2//"_"//nomi
855      ELSE
856               nom=var%name
857      END IF
858  ! On regarde si on est dans la phase de définition ou d'écriture:
859  IF(.NOT.cosp_varsdefined) THEN
860      !Si phase de définition.... on définit
861!$OMP MASTER
862      CALL conf_cospoutputs(var%name,var%cles)
863      DO iff=1, 3
864        IF (cosp_outfilekeys(iff)) THEN
865          CALL histdef3d_cosp(iff, var, nverts(iff), ncols)
866        ENDIF
867      ENDDO
868!$OMP END MASTER
869  ELSE
870    !Et sinon on.... écrit
871    IF (SIZE(field,1)/=klon) &
872   CALL abort_physic('iophy::histwrite3d','Field first DIMENSION not equal to klon',1)                                 
873    nlev=SIZE(field,2)
874
875
876    CALL Gather_omp(field,buffer_omp)
877!$OMP MASTER
878    CALL grid1Dto2D_mpi(buffer_omp,field3d)
879
880! BOUCLE SUR LES FICHIERS
881     firstx=.true.
882     DO iff=1, 3
883        IF (var%cles(iff) .AND. cosp_outfilekeys(iff)) THEN
884           ALLOCATE(index3d(nbp_lon*jj_nb*nlev))
885#ifndef CPP_IOIPSL_NO_OUTPUT
886    CALL histwrite(cosp_nidfiles(iff),nom,itau_iocosp,Field3d,nbp_lon*jj_nb*nlev,index3d)
887#endif
888
889#ifdef CPP_XIOS
890          IF (.not. ok_all_xml) then
891           IF (firstx) THEN
892               CALL xios_send_field(nom, Field3d(:,:,1:nlev))
893               IF (prt_level >= 9) WRITE(lunout,*)'xios_send_field ',var%name
894               firstx=.FALSE.
895           ENDIF
896          ENDIF
897#endif
898         deallocate(index3d)
899        ENDIF
900      ENDDO
901#ifdef CPP_XIOS
902    IF (ok_all_xml) THEN
903     CALL xios_send_field(nom, Field3d(:,:,1:nlev))
904     IF (prt_level >= 1) WRITE(lunout,*)'xios_send_field ',var%name
905    ENDIF
906#endif
907
908!$OMP END MASTER   
909  ENDIF ! vars_defined
910  IF (prt_level >= 9) write(lunout,*)'End histrwrite3d_cosp ',nom
911  END SUBROUTINE histwrite3d_cosp
912
913! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE
914! AI sept 2013
915  SUBROUTINE histwrite4d_cosp(var, field)
916  USE dimphy
917  USE mod_phys_lmdz_para
918  USE ioipsl
919  use iophy
920  USE mod_grid_phy_lmdz, ONLY: nbp_lon
921  USE print_control_mod, ONLY: lunout,prt_level
922
923#ifdef CPP_XIOS
924  USE xios, only: xios_send_field
925#endif
926
927
928  IMPLICIT NONE
929  INCLUDE 'clesphys.h'
930
931    TYPE(ctrl_outcosp), INTENT(IN)    :: var
932    REAL, DIMENSION(:,:,:), INTENT(IN)  :: field ! --> field(klon,:)
933
934    INTEGER :: iff, k
935
936    REAL,DIMENSION(klon_mpi,SIZE(field,2),SIZE(field,3)) :: buffer_omp
937    REAL :: field4d(nbp_lon,jj_nb,SIZE(field,2),SIZE(field,3))
938    INTEGER :: ip, n, nlev, nlev2
939    INTEGER, ALLOCATABLE, DIMENSION(:) :: index4d
940    CHARACTER(LEN=20) ::  nomi, nom
941
942  IF (prt_level >= 9) write(lunout,*)'Begin histrwrite4d ',var%name
943
944  IF(cosp_varsdefined) THEN
945    !Et sinon on.... écrit
946    IF (SIZE(field,1)/=klon) &
947   CALL abort_physic('iophy::histwrite3d','Field first DIMENSION not equal to klon',1)           
948
949    nlev=SIZE(field,2)
950    nlev2=SIZE(field,3)
951    CALL Gather_omp(field,buffer_omp)
952!$OMP MASTER
953    CALL grid1Dto2D_mpi(buffer_omp,field4d)
954
955#ifdef CPP_XIOS
956    IF (ok_all_xml) THEN
957     CALL xios_send_field(var%name, Field4d(:,:,1:nlev,1:nlev2))
958     IF (prt_level >= 1) WRITE(lunout,*)'xios_send_field ',var%name
959    ENDIF
960#endif
961
962!$OMP END MASTER   
963  ENDIF ! vars_defined
964  IF (prt_level >= 9) write(lunout,*)'End histrwrite4d_cosp ',nom
965  END SUBROUTINE histwrite4d_cosp
966
967  SUBROUTINE conf_cospoutputs(nam_var,cles_var)
968!!! Lecture des noms et cles de sortie des variables dans config.def
969    !   en utilisant les routines getin de IOIPSL 
970    use ioipsl
971    USE print_control_mod, ONLY: lunout,prt_level
972
973    IMPLICIT NONE
974
975   CHARACTER(LEN=20)               :: nam_var, nnam_var
976   LOGICAL, DIMENSION(3)           :: cles_var
977
978! Lecture dans config.def ou output.def de cles_var et name_var
979    CALL getin('cles_'//nam_var,cles_var)
980    CALL getin('name_'//nam_var,nam_var)
981    IF(prt_level>10) WRITE(lunout,*)'nam_var cles_var ',nam_var,cles_var(:)
982
983  END SUBROUTINE conf_cospoutputs
984
985 END MODULE cosp_output_write_mod
Note: See TracBrowser for help on using the repository browser.