source: CONFIG_DEVT/LMDZOR_V6.2_work_ENSEMBLES/modeles/LMDZ/libf/phylmd/iophy.F90 @ 5491

Last change on this file since 5491 was 5491, checked in by ymipsl, 3 years ago

Add new ensemble dimension for LMDZ physics

YM

File size: 52.1 KB
Line 
1!
2! $Id: iophy.F90 3488 2019-04-26 11:41:36Z fairhead $
3!
4MODULE iophy
5
6! abd  REAL,private,allocatable,DIMENSION(:),save :: io_lat
7! abd  REAL,private,allocatable,DIMENSION(:),save :: io_lon
8  REAL,ALLOCATABLE,DIMENSION(:),SAVE :: io_lat
9  REAL,ALLOCATABLE,DIMENSION(:),SAVE :: io_lon
10  INTEGER, SAVE :: phys_domain_id
11  INTEGER, SAVE :: npstn
12  INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: nptabij
13  INTEGER, SAVE :: itau_iophy
14  LOGICAL :: check_dim = .false.
15
16!$OMP THREADPRIVATE(itau_iophy)
17
18#ifdef CPP_XIOS
19  INTERFACE histwrite_phy
20    MODULE PROCEDURE histwrite2d_phy,histwrite3d_phy,histwrite2d_phy_old,histwrite3d_phy_old,histwrite2d_xios,histwrite3d_xios,histwrite0d_xios
21  END INTERFACE
22#else
23  INTERFACE histwrite_phy
24    MODULE PROCEDURE histwrite2d_phy,histwrite3d_phy,histwrite2d_phy_old,histwrite3d_phy_old
25  END INTERFACE
26#endif
27
28  INTERFACE histbeg_phy_all
29    MODULE PROCEDURE histbeg_phy,histbeg_phyxios,histbeg_phy_points
30  END INTERFACE
31
32
33CONTAINS
34
35! ug Routine pour définir itau_iophy depuis phys_output_write_mod:
36  SUBROUTINE set_itau_iophy(ito)
37    IMPLICIT NONE
38    INTEGER, INTENT(IN) :: ito
39    itau_iophy = ito
40  END SUBROUTINE
41
42  SUBROUTINE init_iophy_new(rlat,rlon)
43
44    USE dimphy, ONLY: klon
45    USE mod_phys_lmdz_para, ONLY: gather, bcast, &
46                                  jj_nb, jj_begin, jj_end, ii_begin, ii_end, &
47                                  mpi_size, mpi_rank, klon_mpi, &
48                                is_sequential, is_south_pole_dyn
49  USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo, grid_type, unstructured
50  USE print_control_mod, ONLY: prt_level,lunout 
51#ifdef CPP_IOIPSL
52    USE ioipsl, ONLY: flio_dom_set
53#endif
54#ifdef CPP_XIOS
55  use wxios, ONLY: wxios_domain_param, wxios_domain_param_unstructured, wxios_context_init, wxios_ensemble_param
56#endif
57    IMPLICIT NONE
58    REAL,DIMENSION(klon),INTENT(IN) :: rlon
59    REAL,DIMENSION(klon),INTENT(IN) :: rlat
60
61    REAL,DIMENSION(klon_glo)        :: rlat_glo
62    REAL,DIMENSION(klon_glo)        :: rlon_glo
63   
64    INTEGER,DIMENSION(2) :: ddid
65    INTEGER,DIMENSION(2) :: dsg
66    INTEGER,DIMENSION(2) :: dsl
67    INTEGER,DIMENSION(2) :: dpf
68    INTEGER,DIMENSION(2) :: dpl
69    INTEGER,DIMENSION(2) :: dhs
70    INTEGER,DIMENSION(2) :: dhe 
71    INTEGER :: i   
72    INTEGER :: data_ibegin, data_iend
73
74#ifdef CPP_XIOS
75      CALL wxios_context_init
76#endif
77   
78
79    IF (grid_type==unstructured) THEN
80   
81#ifdef CPP_XIOS
82      CALL wxios_domain_param_unstructured("dom_glo")
83#endif
84
85    ELSE
86
87      CALL gather(rlat,rlat_glo)
88      CALL bcast(rlat_glo)
89      CALL gather(rlon,rlon_glo)
90      CALL bcast(rlon_glo)
91   
92!$OMP MASTER 
93    ALLOCATE(io_lat(nbp_lat))
94    IF (klon_glo == 1) THEN
95      io_lat(1)=rlat_glo(1)
96    ELSE
97      io_lat(1)=rlat_glo(1)
98      io_lat(nbp_lat)=rlat_glo(klon_glo)
99      DO i=2,nbp_lat-1
100        io_lat(i)=rlat_glo(2+(i-2)*nbp_lon)
101      ENDDO
102    ENDIF
103
104    ALLOCATE(io_lon(nbp_lon))
105    IF (klon_glo == 1) THEN
106      io_lon(1)=rlon_glo(1)
107    ELSE
108      io_lon(1:nbp_lon)=rlon_glo(2:nbp_lon+1)
109    ENDIF
110
111!! (I) dtnb   : total number of domains
112!! (I) dnb    : domain number
113!! (I) did(:) : distributed dimensions identifiers
114!!              (up to 5 dimensions are supported)
115!! (I) dsg(:) : total number of points for each dimension
116!! (I) dsl(:) : local number of points for each dimension
117!! (I) dpf(:) : position of first local point for each dimension
118!! (I) dpl(:) : position of last local point for each dimension
119!! (I) dhs(:) : start halo size for each dimension
120!! (I) dhe(:) : end halo size for each dimension
121!! (C) cdnm   : Model domain definition name.
122!!              The names actually supported are :
123!!              "BOX", "APPLE", "ORANGE".
124!!              These names are case insensitive.
125
126    ddid=(/ 1,2 /)
127    dsg=(/ nbp_lon, nbp_lat /)
128    dsl=(/ nbp_lon, jj_nb /)
129    dpf=(/ 1,jj_begin /)
130    dpl=(/ nbp_lon, jj_end /)
131    dhs=(/ ii_begin-1,0 /)
132    IF (mpi_rank==mpi_size-1) THEN
133      dhe=(/0,0/)
134    ELSE
135      dhe=(/ nbp_lon-ii_end,0 /) 
136    ENDIF
137
138#ifndef CPP_IOIPSL_NO_OUTPUT   
139    CALL flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
140                      'APPLE',phys_domain_id)
141#endif
142#ifdef CPP_XIOS
143      ! Set values for the mask:
144      IF (mpi_rank == 0) THEN
145          data_ibegin = 0
146      ELSE
147          data_ibegin = ii_begin - 1
148      END IF
149
150      IF (mpi_rank == mpi_size-1) THEN
151          data_iend = nbp_lon
152      ELSE
153          data_iend = ii_end + 1
154      END IF
155
156      IF (prt_level>=10) THEN
157        write(lunout,*) "init_iophy_new: mpirank=",mpi_rank," iibegin=",ii_begin , " ii_end=",ii_end," jjbegin=",jj_begin," jj_nb=",jj_nb," jj_end=",jj_end
158        write(lunout,*) "init_iophy_new: mpirank=",mpi_rank," nbp_lon=",nbp_lon," nbp_lat=",nbp_lat
159        write(lunout,*) "init_iophy_new: mpirank=",mpi_rank," data_ibegin=",data_ibegin," data_iend=",data_iend
160        write(lunout,*) "init_iophy_new: mpirank=",mpi_rank," data_ibegin=",data_ibegin," data_iend=",data_iend
161        write(lunout,*) "init_iophy_new: mpirank=",mpi_rank," is_south_pole_dyn=",is_south_pole_dyn
162      ENDIF
163
164      ! Initialize the XIOS domain coreesponding to this process:
165#endif
166!$OMP END MASTER
167
168#ifdef CPP_XIOS   
169        CALL wxios_domain_param("dom_glo")
170#endif
171     
172    ENDIF
173     
174    CALL wxios_ensemble_param
175     
176  END SUBROUTINE init_iophy_new
177
178
179  SUBROUTINE init_iophy(lat,lon)
180
181    USE mod_phys_lmdz_para, ONLY: jj_begin, jj_end, ii_begin, ii_end, jj_nb, &
182                                  mpi_size, mpi_rank 
183    USE ioipsl, ONLY: flio_dom_set
184    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
185
186    IMPLICIT NONE
187
188    REAL,DIMENSION(nbp_lon),INTENT(IN) :: lon
189    REAL,DIMENSION(nbp_lat),INTENT(IN) :: lat
190
191    INTEGER,DIMENSION(2) :: ddid
192    INTEGER,DIMENSION(2) :: dsg
193    INTEGER,DIMENSION(2) :: dsl
194    INTEGER,DIMENSION(2) :: dpf
195    INTEGER,DIMENSION(2) :: dpl
196    INTEGER,DIMENSION(2) :: dhs
197    INTEGER,DIMENSION(2) :: dhe 
198
199!$OMP MASTER 
200    ALLOCATE(io_lat(nbp_lat))
201    io_lat(:)=lat(:)
202    ALLOCATE(io_lon(nbp_lon))
203    io_lon(:)=lon(:)
204   
205    ddid=(/ 1,2 /)
206    dsg=(/ nbp_lon, nbp_lat /)
207    dsl=(/ nbp_lon, jj_nb /)
208    dpf=(/ 1,jj_begin /)
209    dpl=(/ nbp_lon, jj_end /)
210    dhs=(/ ii_begin-1,0 /)
211    IF (mpi_rank==mpi_size-1) THEN
212      dhe=(/0,0/)
213    ELSE
214      dhe=(/ nbp_lon-ii_end,0 /) 
215    ENDIF
216   
217#ifndef CPP_IOIPSL_NO_OUTPUT 
218    call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
219                      'APPLE',phys_domain_id)
220#endif
221!$OMP END MASTER
222     
223  END SUBROUTINE init_iophy
224
225 SUBROUTINE histbeg_phyxios(name,itau0,zjulian,dtime,ffreq,lev,nhori,nid_day)
226!  USE dimphy
227  USE mod_phys_lmdz_para, ONLY: is_sequential, is_using_mpi, is_mpi_root, &
228                                jj_begin, jj_end, jj_nb
229  USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
230  USE ioipsl, ONLY: histbeg
231#ifdef CPP_XIOS
232  USE wxios, ONLY: wxios_add_file
233#endif
234  IMPLICIT NONE
235  INCLUDE 'clesphys.h'
236   
237  CHARACTER*(*), INTENT(IN) :: name
238  INTEGER, INTENT(IN) :: itau0
239  REAL,INTENT(IN) :: zjulian
240  REAL,INTENT(IN) :: dtime
241  CHARACTER(LEN=*), INTENT(IN) :: ffreq
242  INTEGER,INTENT(IN) :: lev
243  INTEGER,INTENT(OUT) :: nhori
244  INTEGER,INTENT(OUT) :: nid_day
245
246!$OMP MASTER   
247  IF (is_sequential) THEN
248    CALL histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &
249                 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day)
250  ELSE
251    CALL histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &
252                 1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day,phys_domain_id)
253  ENDIF
254
255#ifdef CPP_XIOS
256  ! ug OMP en chantier...
257  IF((.NOT. is_using_mpi) .OR. is_mpi_root) THEN
258      ! ug Création du fichier
259    IF (.not. ok_all_xml) THEN
260      CALL wxios_add_file(name, ffreq, lev)
261    ENDIF
262  ENDIF
263#endif
264!$OMP END MASTER
265 
266  END SUBROUTINE histbeg_phyxios
267 
268  SUBROUTINE histbeg_phy(name,itau0,zjulian,dtime,nhori,nid_day)
269
270  USE mod_phys_lmdz_para, ONLY: jj_begin, jj_end, jj_nb, is_sequential
271  USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
272  USE ioipsl, ONLY: histbeg
273
274  IMPLICIT NONE
275   
276    CHARACTER*(*), INTENT(IN) :: name
277    INTEGER, INTENT(IN) :: itau0
278    REAL,INTENT(IN) :: zjulian
279    REAL,INTENT(IN) :: dtime
280    INTEGER,INTENT(OUT) :: nhori
281    INTEGER,INTENT(OUT) :: nid_day
282
283!$OMP MASTER   
284#ifndef CPP_IOIPSL_NO_OUTPUT 
285    IF (is_sequential) THEN
286      CALL histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &
287                   1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day)
288    ELSE
289      CALL histbeg(name,nbp_lon,io_lon, jj_nb,io_lat(jj_begin:jj_end), &
290                   1,nbp_lon,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day,phys_domain_id)
291    ENDIF
292#endif
293!$OMP END MASTER
294 
295  END SUBROUTINE histbeg_phy
296
297
298  SUBROUTINE histbeg_phy_points(rlon,rlat,pim,tabij,ipt,jpt, &
299             plon,plat,plon_bounds,plat_bounds, &
300             nname,itau0,zjulian,dtime,nnhori,nnid_day)
301  USE dimphy, ONLY: klon
302  USE mod_phys_lmdz_para, ONLY: gather, bcast, &
303                                is_sequential, klon_mpi_begin, klon_mpi_end, &
304                                mpi_rank
305  USE mod_grid_phy_lmdz, ONLY: klon_glo, nbp_lon, nbp_lat, grid1dTo2d_glo
306  USE ioipsl, ONLY: histbeg
307
308  IMPLICIT NONE
309
310    REAL,DIMENSION(klon),INTENT(IN) :: rlon
311    REAL,DIMENSION(klon),INTENT(IN) :: rlat
312    INTEGER, INTENT(IN) :: itau0
313    REAL,INTENT(IN) :: zjulian
314    REAL,INTENT(IN) :: dtime
315    INTEGER, INTENT(IN) :: pim
316    INTEGER, intent(out) :: nnhori
317    CHARACTER(len=20), INTENT(IN) :: nname
318    INTEGER, INTENT(OUT) :: nnid_day
319    INTEGER :: i
320    REAL,DIMENSION(klon_glo)        :: rlat_glo
321    REAL,DIMENSION(klon_glo)        :: rlon_glo
322    INTEGER, DIMENSION(pim), INTENT(IN)  :: tabij
323    REAL,DIMENSION(pim), INTENT(IN) :: plat, plon
324    INTEGER,DIMENSION(pim), INTENT(IN) :: ipt, jpt
325    REAL,DIMENSION(pim,2), intent(out) :: plat_bounds, plon_bounds
326
327    INTEGER, SAVE :: tabprocbeg, tabprocend
328!$OMP THREADPRIVATE(tabprocbeg, tabprocend)
329    INTEGER :: ip
330    INTEGER, PARAMETER :: nip=1
331    INTEGER :: npproc
332    REAL, allocatable, DIMENSION(:) :: npplat, npplon
333    REAL, allocatable, DIMENSION(:,:) :: npplat_bounds, npplon_bounds
334    REAL, DIMENSION(nbp_lon,nbp_lat) :: zx_lon, zx_lat
335
336    CALL gather(rlat,rlat_glo)
337    CALL bcast(rlat_glo)
338    CALL gather(rlon,rlon_glo)
339    CALL bcast(rlon_glo)
340
341!$OMP MASTER
342    DO i=1,pim
343
344!    print*,'CFMIP_iophy i tabij lon lat',i,tabij(i),plon(i),plat(i)
345
346     plon_bounds(i,1)=rlon_glo(tabij(i)-1)
347     plon_bounds(i,2)=rlon_glo(tabij(i)+1)
348     IF (plon_bounds(i,2).LE.0..AND.plon_bounds(i,1).GE.0.) THEN
349      IF (rlon_glo(tabij(i)).GE.0.) THEN
350       plon_bounds(i,2)=-1*plon_bounds(i,2)
351      ENDIF
352     ENDIF
353     IF (plon_bounds(i,2).GE.0..AND.plon_bounds(i,1).LE.0.) THEN
354      IF (rlon_glo(tabij(i)).LE.0.) THEN
355       plon_bounds(i,2)=-1*plon_bounds(i,2)
356      ENDIF
357     ENDIF
358!
359     IF ( tabij(i).LE.nbp_lon) THEN
360      plat_bounds(i,1)=rlat_glo(tabij(i))
361     ELSE
362      plat_bounds(i,1)=rlat_glo(tabij(i)-nbp_lon)
363     ENDIF
364     plat_bounds(i,2)=rlat_glo(tabij(i)+nbp_lon)
365!
366!    print*,'CFMIP_iophy point i lon lon_bds',i,plon_bounds(i,1),rlon_glo(tabij(i)),plon_bounds(i,2)
367!    print*,'CFMIP_iophy point i lat lat_bds',i,plat_bounds(i,1),rlat_glo(tabij(i)),plat_bounds(i,2)
368!
369    ENDDO
370    if (is_sequential) then
371
372     npstn=pim
373     IF(.NOT. ALLOCATED(nptabij)) THEN
374      ALLOCATE(nptabij(pim))
375     ENDIF
376     DO i=1,pim
377      nptabij(i)=tabij(i)
378     ENDDO
379
380       CALL grid1dTo2d_glo(rlon_glo,zx_lon)
381       IF ((nbp_lon*nbp_lat).GT.1) THEN
382       DO i = 1, nbp_lon
383         zx_lon(i,1) = rlon_glo(i+1)
384         zx_lon(i,nbp_lat) = rlon_glo(i+1)
385       ENDDO
386       ENDIF
387       CALL grid1dTo2d_glo(rlat_glo,zx_lat)
388
389    DO i=1,pim
390!    print*,'CFMIP_iophy i tabij lon lat',i,tabij(i),plon(i),plat(i)
391
392     plon_bounds(i,1)=zx_lon(ipt(i)-1,jpt(i))
393     plon_bounds(i,2)=zx_lon(ipt(i)+1,jpt(i))
394
395     IF (ipt(i).EQ.1) THEN
396      plon_bounds(i,1)=zx_lon(nbp_lon,jpt(i))
397      plon_bounds(i,2)=360.+zx_lon(ipt(i)+1,jpt(i))
398     ENDIF
399 
400     IF (ipt(i).EQ.nbp_lon) THEN
401      plon_bounds(i,2)=360.+zx_lon(1,jpt(i))
402     ENDIF
403
404     plat_bounds(i,1)=zx_lat(ipt(i),jpt(i)-1)
405     plat_bounds(i,2)=zx_lat(ipt(i),jpt(i)+1)
406
407     IF (jpt(i).EQ.1) THEN
408      plat_bounds(i,1)=zx_lat(ipt(i),1)+0.001
409      plat_bounds(i,2)=zx_lat(ipt(i),1)-0.001
410     ENDIF
411 
412     IF (jpt(i).EQ.nbp_lat) THEN
413      plat_bounds(i,1)=zx_lat(ipt(i),nbp_lat)+0.001
414      plat_bounds(i,2)=zx_lat(ipt(i),nbp_lat)-0.001
415     ENDIF
416!
417!    print*,'CFMIP_iophy point i lon lon_bds',i,plon_bounds(i,1),rlon(tabij(i)),plon_bounds(i,2)
418!    print*,'CFMIP_iophy point i lat lat_bds',i,plat_bounds(i,1),rlat(tabij(i)),plat_bounds(i,2)
419!
420    ENDDO
421
422#ifndef CPP_IOIPSL_NO_OUTPUT 
423     CALL histbeg(nname,pim,plon,plon_bounds, & 
424                           plat,plat_bounds, &
425                           itau0, zjulian, dtime, nnhori, nnid_day)
426#endif
427    ELSE
428     npproc=0
429     DO ip=1, pim
430      tabprocbeg=klon_mpi_begin
431      tabprocend=klon_mpi_end
432      IF(tabij(ip).GE.tabprocbeg.AND.tabij(ip).LE.tabprocend) THEN
433       npproc=npproc+1
434       npstn=npproc
435      ENDIF
436     ENDDO
437!    print*,'CFMIP_iophy mpi_rank npstn',mpi_rank,npstn
438     IF(.NOT. ALLOCATED(nptabij)) THEN
439      ALLOCATE(nptabij(npstn))
440      ALLOCATE(npplon(npstn), npplat(npstn))
441      ALLOCATE(npplon_bounds(npstn,2), npplat_bounds(npstn,2))
442     ENDIF
443     npproc=0
444     DO ip=1, pim
445      IF(tabij(ip).GE.tabprocbeg.AND.tabij(ip).LE.tabprocend) THEN
446       npproc=npproc+1
447       nptabij(npproc)=tabij(ip)
448!      print*,'mpi_rank npproc ip plon plat tabij=',mpi_rank,npproc,ip, &
449!      plon(ip),plat(ip),tabij(ip)
450       npplon(npproc)=plon(ip)
451       npplat(npproc)=plat(ip)
452       npplon_bounds(npproc,1)=plon_bounds(ip,1)
453       npplon_bounds(npproc,2)=plon_bounds(ip,2)
454       npplat_bounds(npproc,1)=plat_bounds(ip,1)
455       npplat_bounds(npproc,2)=plat_bounds(ip,2)
456!!!
457!!! print qui sert a reordonner les points stations selon l'ordre CFMIP
458!!! ne pas enlever
459        print*,'iophy_mpi rank ip lon lat',mpi_rank,ip,plon(ip),plat(ip)
460!!!
461      ENDIF
462     ENDDO
463#ifndef CPP_IOIPSL_NO_OUTPUT 
464     CALL histbeg(nname,npstn,npplon,npplon_bounds, &
465                            npplat,npplat_bounds, &
466                            itau0,zjulian,dtime,nnhori,nnid_day,phys_domain_id)
467#endif
468    ENDIF
469!$OMP END MASTER
470
471  END SUBROUTINE histbeg_phy_points
472
473
474  SUBROUTINE histdef2d_old (iff,lpoint,flag_var,nomvar,titrevar,unitvar)
475
476    USE ioipsl, ONLY: histdef
477    USE mod_phys_lmdz_para, ONLY: jj_nb, is_master
478    USE phys_output_var_mod, ONLY: type_ecri, zoutm, zdtime_moy, lev_files, &
479                                   nid_files, nhorim, swaero_diag, dryaod_diag, nfiles, &
480                                   ok_4xCO2atm
481    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
482    USE aero_mod, ONLY : naero_tot, name_aero_tau
483    USE print_control_mod, ONLY: prt_level,lunout
484
485    IMPLICIT NONE
486
487    INCLUDE "clesphys.h"
488
489    INTEGER                          :: iff
490    INTEGER                          :: naero
491    LOGICAL                          :: lpoint
492    INTEGER, DIMENSION(nfiles)       :: flag_var
493    CHARACTER(LEN=20)                :: nomvar
494    CHARACTER(LEN=*)                 :: titrevar
495    CHARACTER(LEN=*)                 :: unitvar
496
497    REAL zstophym
498
499    IF (type_ecri(iff)=='inst(X)'.OR.type_ecri(iff)=='once') THEN
500       zstophym=zoutm(iff)
501    ELSE
502       zstophym=zdtime_moy
503    ENDIF
504    IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef2d_old for ', nomvar
505    ! Appel a la lecture des noms et niveau d'ecriture des variables dans output.def
506    CALL conf_physoutputs(nomvar,flag_var)
507
508    IF(.NOT.lpoint) THEN 
509       IF ( flag_var(iff)<=lev_files(iff) ) THEN
510          CALL histdef (nid_files(iff),nomvar,titrevar,unitvar, &
511               nbp_lon,jj_nb,nhorim(iff), 1,1,1, -99, 32, &
512               type_ecri(iff), zstophym,zoutm(iff))               
513       ENDIF
514    ELSE
515       IF ( flag_var(iff)<=lev_files(iff) ) THEN
516          CALL histdef (nid_files(iff),nomvar,titrevar,unitvar, &
517               npstn,1,nhorim(iff), 1,1,1, -99, 32, &
518               type_ecri(iff), zstophym,zoutm(iff))               
519       ENDIF
520    ENDIF
521
522    ! Set swaero_diag=true if at least one of the concerned variables are defined
523    IF (nomvar=='topswad' .OR. nomvar=='topswad0' .OR. nomvar=='solswad' .OR. nomvar=='solswad0' .OR. & 
524        nomvar=='toplwad' .OR. nomvar=='toplwad0' .OR. nomvar=='sollwad' .OR. nomvar=='sollwad0' .OR. & 
525        nomvar=='topswai' .OR. nomvar=='solswai' ) THEN
526       IF  ( flag_var(iff)<=lev_files(iff) ) swaero_diag=.TRUE.
527    ENDIF
528
529    ! Set dryaod_diag=true if at least one of the concerned variables are defined
530    IF (nomvar=='dryod550aer') THEN
531      IF  ( flag_var(iff)<=lev_files(iff) ) dryaod_diag=.TRUE.
532    ENDIF
533    DO naero = 1, naero_tot-1
534      IF (nomvar=='dryod550_'//name_aero_tau(naero)) THEN
535        IF  ( flag_var(iff)<=lev_files(iff) ) dryaod_diag=.TRUE.
536      ENDIF
537    ENDDO
538
539    ! Set ok_4xCO2atm=true if at least one of the concerned variables are
540    ! defined
541    IF (nomvar=='rsut4co2'.OR.nomvar=='rlut4co2'.OR.nomvar=='rsutcs4co2' & 
542        .OR. nomvar=='rlutcs4co2'.OR.nomvar=='rsu4co2'.OR.nomvar=='rsucs4co2' &
543        .OR.nomvar=='rsu4co2'.OR.nomvar=='rsucs4co2'.OR.nomvar=='rsd4co2'.OR. &
544        nomvar=='rsdcs4co2'.OR.nomvar=='rlu4co2'.OR.nomvar=='rlucs4co2'.OR.&
545        nomvar=='rld4co2'.OR.nomvar=='rldcs4co2') THEN
546        IF ( flag_var(iff)<=lev_files(iff) ) ok_4xCO2atm=.TRUE.
547    ENDIF
548  END SUBROUTINE histdef2d_old
549
550  SUBROUTINE histdef3d_old (iff,lpoint,flag_var,nomvar,titrevar,unitvar)
551
552    USE ioipsl, ONLY: histdef
553    USE dimphy, ONLY: klev
554    USE mod_phys_lmdz_para, ONLY: jj_nb, is_master
555    USE phys_output_var_mod, ONLY: type_ecri, zoutm, lev_files, nid_files, &
556                                   nhorim, zdtime_moy, levmin, levmax, &
557                                   nvertm, nfiles
558    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
559    USE print_control_mod, ONLY: prt_level,lunout
560    IMPLICIT NONE
561
562    INCLUDE "clesphys.h"
563
564    INTEGER                          :: iff
565    LOGICAL                          :: lpoint
566    INTEGER, DIMENSION(nfiles)       :: flag_var
567    CHARACTER(LEN=20)                 :: nomvar
568    CHARACTER(LEN=*)                 :: titrevar
569    CHARACTER(LEN=*)                 :: unitvar
570
571    REAL zstophym
572
573    ! Appel a la lecture des noms et niveau d'ecriture des variables dans output.def
574    CALL conf_physoutputs(nomvar,flag_var)
575
576    IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef3d_old for ', nomvar
577
578    IF (type_ecri(iff)=='inst(X)'.OR.type_ecri(iff)=='once') THEN
579       zstophym=zoutm(iff)
580    ELSE
581       zstophym=zdtime_moy
582    ENDIF
583
584    IF(.NOT.lpoint) THEN
585       IF ( flag_var(iff)<=lev_files(iff) ) THEN
586          CALL histdef (nid_files(iff), nomvar, titrevar, unitvar, &
587               nbp_lon, jj_nb, nhorim(iff), klev, levmin(iff), &
588               levmax(iff)-levmin(iff)+1, nvertm(iff), 32, type_ecri(iff), &
589               zstophym, zoutm(iff))
590       ENDIF
591    ELSE
592       IF ( flag_var(iff)<=lev_files(iff) ) THEN
593          CALL histdef (nid_files(iff), nomvar, titrevar, unitvar, &
594               npstn,1,nhorim(iff), klev, levmin(iff), &
595               levmax(iff)-levmin(iff)+1, nvertm(iff), 32, &
596               type_ecri(iff), zstophym,zoutm(iff))
597       ENDIF
598    ENDIF
599  END SUBROUTINE histdef3d_old
600
601  SUBROUTINE histdef2d (iff,var)
602
603    USE ioipsl, ONLY: histdef
604    USE mod_phys_lmdz_para, ONLY: jj_nb, is_master
605    USE phys_output_var_mod, ONLY: ctrl_out, type_ecri_files, zoutm, zdtime_moy, &
606                                   clef_stations, phys_out_filenames, lev_files, &
607                                   nid_files, nhorim, swaerofree_diag, swaero_diag, dryaod_diag,&
608                                   ok_4xCO2atm 
609    USE print_control_mod, ONLY: prt_level,lunout 
610    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
611    USE aero_mod, ONLY : naero_tot, name_aero_tau
612#ifdef CPP_XIOS
613    USE wxios, ONLY: wxios_add_field_to_file
614#endif
615    USE print_control_mod, ONLY: prt_level,lunout
616    IMPLICIT NONE
617
618    INCLUDE "clesphys.h"
619
620    INTEGER                          :: iff
621    INTEGER                          :: naero
622    TYPE(ctrl_out)                   :: var
623
624    REAL zstophym
625    CHARACTER(LEN=20) :: typeecrit
626
627    IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef2d for ', var%name
628
629    ! ug On récupÚre le type écrit de la structure:
630    !       Assez moche, à refaire si meilleure méthode...
631    IF (INDEX(var%type_ecrit(iff), "once") > 0) THEN
632       typeecrit = 'once'
633    ELSE IF(INDEX(var%type_ecrit(iff), "t_min") > 0) THEN
634       typeecrit = 't_min(X)'
635    ELSE IF(INDEX(var%type_ecrit(iff), "t_max") > 0) THEN
636       typeecrit = 't_max(X)'
637    ELSE IF(INDEX(var%type_ecrit(iff), "inst") > 0) THEN
638       typeecrit = 'inst(X)'
639    ELSE
640       typeecrit = type_ecri_files(iff)
641    ENDIF
642
643    IF (typeecrit=='inst(X)'.OR.typeecrit=='once') THEN
644       zstophym=zoutm(iff)
645    ELSE
646       zstophym=zdtime_moy
647    ENDIF
648
649    ! Appel a la lecture des noms et niveau d'ecriture des variables dans output.def
650    CALL conf_physoutputs(var%name, var%flag)
651
652    IF(.NOT.clef_stations(iff)) THEN 
653
654#ifdef CPP_XIOS
655      IF (.not. ok_all_xml) THEN
656        IF ( var%flag(iff)<=lev_files(iff) ) THEN
657          CALL wxios_add_field_to_file(var%name, 2, iff, phys_out_filenames(iff), &
658          var%description, var%unit, var%flag(iff), typeecrit)
659          IF (prt_level >= 10) THEN
660            WRITE(lunout,*) 'histdef2d: call wxios_add_field_to_file var%name iff: ', &
661                            trim(var%name),iff
662          ENDIF
663        ENDIF
664      ENDIF
665#endif
666#ifndef CPP_IOIPSL_NO_OUTPUT 
667
668       IF ( var%flag(iff)<=lev_files(iff) ) THEN
669          CALL histdef (nid_files(iff), var%name, var%description, var%unit, &
670               nbp_lon,jj_nb,nhorim(iff), 1,1,1, -99, 32, &
671               typeecrit, zstophym,zoutm(iff))               
672       ENDIF
673    ELSE
674       IF ( var%flag(iff)<=lev_files(iff)) THEN
675          CALL histdef (nid_files(iff), var%name, var%description, var%unit, &
676               npstn,1,nhorim(iff), 1,1,1, -99, 32, &
677               typeecrit, zstophym,zoutm(iff))               
678       ENDIF
679#endif
680    ENDIF
681
682    ! Set swaero_diag=true if at least one of the concerned variables are defined
683    !--OB 30/05/2016 use wider set of variables
684    IF ( var%name=='topswad' .OR. var%name=='topswad0' .OR. var%name=='solswad' .OR. var%name=='solswad0' .OR. &
685         var%name=='topswai' .OR. var%name=='solswai'  .OR. ( iflag_rrtm==1 .AND. (                            &
686         var%name=='toplwad' .OR. var%name=='toplwad0' .OR. var%name=='sollwad' .OR. var%name=='sollwad0' .OR. &
687         var%name=='toplwai' .OR. var%name=='sollwai'  ) ) ) THEN
688       IF  ( var%flag(iff)<=lev_files(iff) ) swaero_diag=.TRUE.
689    ENDIF
690
691    ! Set swaerofree_diag=true if at least one of the concerned variables are defined
692    IF (var%name=='SWupTOAcleanclr' .OR. var%name=='SWupSFCcleanclr' .OR. var%name=='SWdnSFCcleanclr' .OR. & 
693        var%name=='LWupTOAcleanclr' .OR. var%name=='LWdnSFCcleanclr' ) THEN
694       IF  ( var%flag(iff)<=lev_files(iff) ) swaerofree_diag=.TRUE.
695    ENDIF
696
697    ! set dryaod_dry=true if at least one of the concerned variables are defined
698    IF (var%name=='dryod550aer') THEN
699      IF  ( var%flag(iff)<=lev_files(iff) ) dryaod_diag=.TRUE.
700    ENDIF
701    !
702    DO naero = 1, naero_tot-1 
703      IF (var%name=='dryod550_'//name_aero_tau(naero)) THEN
704        IF  ( var%flag(iff)<=lev_files(iff) ) dryaod_diag=.TRUE.
705      ENDIF
706    ENDDO
707    ! Set ok_4xCO2atm=true if at least one of the concerned variables are
708    ! defined
709    IF (var%name=='rsut4co2'.OR.var%name=='rlut4co2'.OR.var%name=='rsutcs4co2' & 
710        .OR. var%name=='rlutcs4co2'.OR.var%name=='rsu4co2'.OR.var%name=='rsucs4co2' &
711        .OR.var%name=='rsu4co2'.OR.var%name=='rsucs4co2'.OR.var%name=='rsd4co2'.OR. &
712        var%name=='rsdcs4co2'.OR.var%name=='rlu4co2'.OR.var%name=='rlucs4co2'.OR.&
713        var%name=='rld4co2'.OR.var%name=='rldcs4co2') THEN
714        IF ( var%flag(iff)<=lev_files(iff) ) ok_4xCO2atm=.TRUE.
715    ENDIF
716  END SUBROUTINE histdef2d
717
718  SUBROUTINE histdef3d (iff,var)
719
720    USE ioipsl, ONLY: histdef
721    USE dimphy, ONLY: klev
722    USE mod_phys_lmdz_para, ONLY: jj_nb, is_master
723    USE phys_output_var_mod, ONLY: ctrl_out, type_ecri_files, zoutm, zdtime_moy, &
724                                   clef_stations, phys_out_filenames, lev_files, &
725                                   nid_files, nhorim, swaerofree_diag, levmin, &
726                                   levmax, nvertm
727    USE print_control_mod, ONLY: prt_level,lunout
728    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
729#ifdef CPP_XIOS
730    USE wxios, ONLY: wxios_add_field_to_file
731#endif
732    USE print_control_mod, ONLY: prt_level,lunout
733    IMPLICIT NONE
734
735    INCLUDE "clesphys.h"
736
737    INTEGER                          :: iff
738    TYPE(ctrl_out)                   :: var
739
740    REAL zstophym
741    CHARACTER(LEN=20) :: typeecrit
742
743    IF (check_dim .AND. is_master) WRITE(lunout,*)'histdef3d for ', var%name
744
745    ! ug On récupÚre le type écrit de la structure:
746    !       Assez moche, à refaire si meilleure méthode...
747    IF (INDEX(var%type_ecrit(iff), "once") > 0) THEN
748       typeecrit = 'once'
749    ELSE IF(INDEX(var%type_ecrit(iff), "t_min") > 0) THEN
750       typeecrit = 't_min(X)'
751    ELSE IF(INDEX(var%type_ecrit(iff), "t_max") > 0) THEN
752       typeecrit = 't_max(X)'
753    ELSE IF(INDEX(var%type_ecrit(iff), "inst") > 0) THEN
754       typeecrit = 'inst(X)'
755    ELSE
756       typeecrit = type_ecri_files(iff)
757    ENDIF
758
759    ! Appel a la lecture des noms et niveau d'ecriture des variables dans output.def
760    CALL conf_physoutputs(var%name,var%flag)
761
762    IF (typeecrit=='inst(X)'.OR.typeecrit=='once') THEN
763       zstophym=zoutm(iff)
764    ELSE
765       zstophym=zdtime_moy
766    ENDIF
767
768    IF(.NOT.clef_stations(iff)) THEN
769
770#ifdef CPP_XIOS
771       IF (.not. ok_all_xml) THEN
772         IF ( var%flag(iff)<=lev_files(iff) ) THEN
773         CALL wxios_add_field_to_file(var%name, 3, iff, phys_out_filenames(iff), &
774         var%description, var%unit, var%flag(iff), typeecrit)
775           IF (prt_level >= 10) THEN
776             WRITE(lunout,*) 'histdef3d: call wxios_add_field_to_file var%name iff: ', &
777                             trim(var%name),iff
778           ENDIF
779         ENDIF
780       ENDIF
781#endif
782#ifndef CPP_IOIPSL_NO_OUTPUT 
783
784       IF ( var%flag(iff)<=lev_files(iff) ) THEN
785          CALL histdef (nid_files(iff), var%name, var%description, var%unit, &
786               nbp_lon, jj_nb, nhorim(iff), klev, levmin(iff), &
787               levmax(iff)-levmin(iff)+1, nvertm(iff), 32, typeecrit, &
788               zstophym, zoutm(iff))
789       ENDIF
790    ELSE
791       IF ( var%flag(iff)<=lev_files(iff)) THEN
792          CALL histdef (nid_files(iff), var%name, var%description, var%unit, &
793               npstn,1,nhorim(iff), klev, levmin(iff), &
794               levmax(iff)-levmin(iff)+1, nvertm(iff), 32, &
795               typeecrit, zstophym,zoutm(iff))
796       ENDIF
797#endif
798    ENDIF
799
800    ! Set swaerofree_diag=true if at least one of the concerned variables are defined
801    IF (var%name=='rsucsaf' .OR. var%name=='rsdcsaf') THEN
802       IF  ( var%flag(iff)<=lev_files(iff) ) swaerofree_diag=.TRUE.
803    ENDIF
804
805  END SUBROUTINE histdef3d
806
807  SUBROUTINE conf_physoutputs(nam_var,flag_var)
808!!! Lecture des noms et niveau de sortie des variables dans output.def
809    !   en utilisant les routines getin de IOIPSL 
810    USE ioipsl, ONLY: getin
811    USE phys_output_var_mod, ONLY: nfiles
812    USE print_control_mod, ONLY: prt_level,lunout
813    IMPLICIT NONE
814
815    CHARACTER(LEN=20)                :: nam_var
816    INTEGER, DIMENSION(nfiles)      :: flag_var
817
818    IF(prt_level>10) WRITE(lunout,*)'Avant getin: nam_var flag_var ',nam_var,flag_var(:)
819    CALL getin('flag_'//nam_var,flag_var)
820    CALL getin('name_'//nam_var,nam_var)
821    IF(prt_level>10) WRITE(lunout,*)'Apres getin: nam_var flag_var ',nam_var,flag_var(:)
822
823  END SUBROUTINE conf_physoutputs
824
825 
826  SUBROUTINE histwrite2d_phy_old(nid,lpoint,name,itau,field)
827
828    USE dimphy, ONLY: klon
829    USE mod_phys_lmdz_para, ONLY: Gather_omp, grid1Dto2D_mpi, &
830                                  is_sequential, klon_mpi_begin, klon_mpi_end, &
831                                  jj_nb, klon_mpi, is_master
832    USE ioipsl, ONLY: histwrite
833    USE print_control_mod, ONLY: prt_level,lunout
834    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
835
836    IMPLICIT NONE
837   
838    INTEGER,INTENT(IN) :: nid
839    LOGICAL,INTENT(IN) :: lpoint 
840    CHARACTER*(*), INTENT(IN) :: name
841    INTEGER, INTENT(IN) :: itau
842    REAL,DIMENSION(:),INTENT(IN) :: field
843    REAL,DIMENSION(klon_mpi) :: buffer_omp
844    INTEGER, allocatable, DIMENSION(:) :: index2d
845    REAL :: Field2d(nbp_lon,jj_nb)
846
847    INTEGER :: ip
848    REAL,ALLOCATABLE,DIMENSION(:) :: fieldok
849
850    IF (size(field)/=klon) CALL abort_physic('iophy::histwrite2d','Field first DIMENSION not equal to klon',1)
851    IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite2d_phy_old for ', name
852
853    CALL Gather_omp(field,buffer_omp)   
854!$OMP MASTER
855    CALL grid1Dto2D_mpi(buffer_omp,Field2d)
856    IF (.NOT.lpoint) THEN
857     ALLOCATE(index2d(nbp_lon*jj_nb))
858     ALLOCATE(fieldok(nbp_lon*jj_nb))
859     IF (prt_level >= 10) write(lunout,*)'Sending ',name,' to IOIPSL'
860     CALL histwrite(nid,name,itau,Field2d,nbp_lon*jj_nb,index2d)
861     IF (prt_level >= 10) write(lunout,*)'Finished sending ',name,' to IOIPSL'
862    ELSE
863     ALLOCATE(fieldok(npstn))
864     ALLOCATE(index2d(npstn))
865
866     IF (is_sequential) THEN
867!     klon_mpi_begin=1
868!     klon_mpi_end=klon
869      DO ip=1, npstn
870       fieldok(ip)=buffer_omp(nptabij(ip))
871      ENDDO
872     ELSE
873      DO ip=1, npstn
874!     print*,'histwrite2d is_sequential npstn ip name nptabij',npstn,ip,name,nptabij(ip)
875       IF(nptabij(ip).GE.klon_mpi_begin.AND. &
876          nptabij(ip).LE.klon_mpi_end) THEN
877         fieldok(ip)=buffer_omp(nptabij(ip)-klon_mpi_begin+1)
878       ENDIF
879      ENDDO
880     ENDIF
881     IF (prt_level >= 10) write(lunout,*)'Sending ',name,' to IOIPSL'
882     CALL histwrite(nid,name,itau,fieldok,npstn,index2d)
883     IF (prt_level >= 10) write(lunout,*)'Finished sending ',name,' to IOIPSL'
884!
885    ENDIF
886    DEALLOCATE(index2d)
887    DEALLOCATE(fieldok)
888!$OMP END MASTER   
889
890 
891  END SUBROUTINE histwrite2d_phy_old
892
893  SUBROUTINE histwrite3d_phy_old(nid,lpoint,name,itau,field)
894
895    USE dimphy, ONLY: klon
896    USE mod_phys_lmdz_para, ONLY: Gather_omp, grid1Dto2D_mpi, &
897                                  is_sequential, klon_mpi_begin, klon_mpi_end, &
898                                  jj_nb, klon_mpi, is_master
899    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
900    USE ioipsl, ONLY: histwrite
901    USE print_control_mod, ONLY: prt_level,lunout
902
903    IMPLICIT NONE
904   
905    INTEGER,INTENT(IN) :: nid
906    LOGICAL,INTENT(IN) :: lpoint
907    CHARACTER*(*), INTENT(IN) :: name
908    INTEGER, INTENT(IN) :: itau
909    REAL,DIMENSION(:,:),INTENT(IN) :: field  ! --> field(klon,:)
910    REAL,DIMENSION(klon_mpi,size(field,2)) :: buffer_omp
911    REAL :: Field3d(nbp_lon,jj_nb,size(field,2))
912    INTEGER :: ip, n, nlev
913    INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d
914    REAL,allocatable, DIMENSION(:,:) :: fieldok
915
916    IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite3d_phy_old for ', name
917
918    IF (size(field,1)/=klon) CALL abort_physic('iophy::histwrite3d','Field first DIMENSION not equal to klon',1)
919    nlev=size(field,2)
920
921    CALL Gather_omp(field,buffer_omp)
922!$OMP MASTER
923    CALL grid1Dto2D_mpi(buffer_omp,field3d)
924    IF (.NOT.lpoint) THEN
925      ALLOCATE(index3d(nbp_lon*jj_nb*nlev))
926      ALLOCATE(fieldok(nbp_lon*jj_nb,nlev))
927      IF (prt_level >= 10) write(lunout,*)'Sending ',name,' to IOIPSL'
928      CALL histwrite(nid,name,itau,Field3d,nbp_lon*jj_nb*nlev,index3d)
929      IF (prt_level >= 10) write(lunout,*)'Finished sending ',name,' to IOIPSL'
930    ELSE
931      nlev=size(field,2)
932      ALLOCATE(index3d(npstn*nlev))
933      ALLOCATE(fieldok(npstn,nlev))
934
935      IF (is_sequential) THEN
936!       klon_mpi_begin=1
937!       klon_mpi_end=klon
938        DO n=1, nlev
939        DO ip=1, npstn
940          fieldok(ip,n)=buffer_omp(nptabij(ip),n)
941        ENDDO
942        ENDDO
943      ELSE
944        DO n=1, nlev
945        DO ip=1, npstn
946          IF(nptabij(ip).GE.klon_mpi_begin.AND. &
947           nptabij(ip).LE.klon_mpi_end) THEN
948           fieldok(ip,n)=buffer_omp(nptabij(ip)-klon_mpi_begin+1,n)
949          ENDIF
950        ENDDO
951        ENDDO
952      ENDIF
953      IF (prt_level >= 10) write(lunout,*)'Sending ',name,' to IOIPSL'
954      CALL histwrite(nid,name,itau,fieldok,npstn*nlev,index3d)
955      IF (prt_level >= 10) write(lunout,*)'Finished sending ',name,' to IOIPSL'
956    ENDIF
957    DEALLOCATE(index3d)
958    DEALLOCATE(fieldok)
959!$OMP END MASTER   
960
961  END SUBROUTINE histwrite3d_phy_old
962
963
964! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE
965  SUBROUTINE histwrite2d_phy(var,field, STD_iff)
966
967  USE mod_phys_lmdz_omp_transfert, ONLY: bcast_omp
968  USE dimphy, ONLY: klon, klev
969  USE mod_phys_lmdz_para, ONLY: gather_omp, grid1dto2d_mpi, &
970                                jj_nb, klon_mpi, klon_mpi_begin, &
971                                klon_mpi_end, is_sequential, is_master
972  USE ioipsl, ONLY: histwrite
973  USE phys_output_var_mod, ONLY: ctrl_out, clef_files, lev_files, &
974                                 nfiles, vars_defined, clef_stations, &
975                                 nid_files, swaerofree_diag, swaero_diag, dryaod_diag, ok_4xCO2atm
976  USE print_control_mod, ONLY: prt_level,lunout
977  USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, unstructured, regular_lonlat
978#ifdef CPP_XIOS
979  USE xios, ONLY: xios_send_field
980#endif
981  USE print_control_mod, ONLY: lunout, prt_level
982
983  IMPLICIT NONE
984  INCLUDE 'clesphys.h'
985
986  TYPE(ctrl_out), INTENT(IN) :: var
987  REAL, DIMENSION(:), INTENT(IN) :: field
988  INTEGER, INTENT(IN), OPTIONAL :: STD_iff ! ug RUSTINE POUR LES STD LEVS.....
989     
990  INTEGER :: iff, iff_beg, iff_end
991  LOGICAL, SAVE  :: firstx
992!$OMP THREADPRIVATE(firstx)
993
994  REAL,DIMENSION(klon_mpi) :: buffer_omp
995  INTEGER, allocatable, DIMENSION(:) :: index2d
996  REAL :: Field2d(nbp_lon,jj_nb)
997
998  INTEGER :: ip
999  REAL, ALLOCATABLE, DIMENSION(:) :: fieldok
1000
1001  IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite2d_phy for ',trim(var%name)
1002
1003  IF (prt_level >= 10) THEN
1004    WRITE(lunout,*)'Begin histwrite2d_phy for ',trim(var%name)
1005  ENDIF
1006
1007! ug RUSTINE POUR LES STD LEVS.....
1008  IF (PRESENT(STD_iff)) THEN
1009        iff_beg = STD_iff
1010        iff_end = STD_iff
1011  ELSE
1012        iff_beg = 1
1013        iff_end = nfiles
1014  ENDIF
1015
1016  ! On regarde si on est dans la phase de définition ou d'écriture:
1017  IF (.NOT.vars_defined) THEN
1018!$OMP MASTER
1019      !Si phase de définition.... on définit
1020      IF (.not. ok_all_xml) THEN
1021      IF (prt_level >= 10) THEN
1022      write(lunout,*)"histwrite2d_phy: .not.vars_defined ; time to define ", &
1023                     trim(var%name)
1024      ENDIF
1025      DO iff=iff_beg, iff_end
1026         IF (clef_files(iff)) THEN
1027            CALL histdef2d(iff, var)
1028         ENDIF
1029      ENDDO
1030      ENDIF
1031!$OMP END MASTER
1032!--broadcasting the flags that have been changed in histdef2d on OMP masters
1033      CALL bcast_omp(swaero_diag)
1034      CALL bcast_omp(swaerofree_diag)
1035      CALL bcast_omp(dryaod_diag)
1036      CALL bcast_omp(ok_4xCO2atm)
1037
1038  ELSE
1039
1040    !Et sinon on.... écrit
1041    IF (SIZE(field)/=klon .AND. SIZE(field)/=klev .AND. SIZE(field)/=klev+1) CALL abort_physic('iophy::histwrite2d_phy','Field first DIMENSION not equal to klon/klev',1)   
1042    IF (prt_level >= 10) THEn
1043      WRITE (lunout,*)"histwrite2d_phy: .not.vars_defined ; time to gather and write ", trim(var%name)
1044    ENDIF
1045   
1046   
1047    IF (SIZE(field) == klon) then
1048        CALL Gather_omp(field,buffer_omp)
1049    ELSE
1050        buffer_omp(:)=0.
1051    ENDIF
1052!$OMP MASTER
1053    IF (grid_type==regular_lonlat) CALL grid1Dto2D_mpi(buffer_omp,Field2d)
1054
1055! La boucle sur les fichiers:
1056      firstx=.true.
1057
1058      IF (ok_all_xml) THEN
1059#ifdef CPP_XIOS
1060          IF (prt_level >= 10) THEN
1061             write(lunout,*)'Dans iophy histwrite2D,var%name ', trim(var%name)                       
1062          ENDIF
1063         
1064          IF (grid_type==regular_lonlat) THEN
1065            IF (SIZE(field) == klon) then
1066              CALL xios_send_field(var%name, Field2d)
1067            ELSE
1068               CALL xios_send_field(var%name, field)
1069            ENDIF
1070          ELSE IF (grid_type==unstructured) THEN
1071            IF (SIZE(field) == klon) then
1072              CALL xios_send_field(var%name, buffer_omp)
1073            ELSE
1074               CALL xios_send_field(var%name, field)
1075            ENDIF
1076
1077          ENDIF
1078          IF (prt_level >= 10) THEN
1079             write(lunout,*)'Dans iophy histwrite2D,var%name apres xios_send ',&
1080                             trim(var%name)                       
1081          ENDIF
1082#else
1083        CALL abort_physic ('iophy','cannot have ok_all_xml = .T. without CPP_XIOS defined' ,1)
1084#endif
1085      ELSE 
1086        DO iff=iff_beg, iff_end
1087            IF (var%flag(iff) <= lev_files(iff) .AND. clef_files(iff)) THEN 
1088
1089#ifdef CPP_XIOS
1090               IF (firstx) THEN
1091                  IF (prt_level >= 10) THEN
1092                     write(lunout,*)'Dans iophy histwrite2D,iff,var%name ',&
1093                                    iff,trim(var%name)                       
1094                     write(lunout,*)"histwrite2d_phy:.NOT.clef_stations(iff)and iff==iff_beg, call xios_send_field"
1095                  ENDIF
1096                  IF (grid_type==regular_lonlat) THEN
1097                    IF (SIZE(field) == klon) then
1098                       CALL xios_send_field(var%name, Field2d)
1099                    ELSE
1100                       CALL xios_send_field(var%name, field)
1101                    ENDIF
1102                  ELSE IF (grid_type==unstructured) THEN
1103                    IF (SIZE(field) == klon) then
1104                      CALL xios_send_field(var%name, buffer_omp)
1105                    ELSE
1106                      CALL xios_send_field(var%name, field)
1107                    ENDIF
1108                  ENDIF
1109
1110                  firstx=.false.
1111               ENDIF
1112#endif
1113
1114                  IF (.NOT.clef_stations(iff)) THEN
1115                        ALLOCATE(index2d(nbp_lon*jj_nb))
1116                        ALLOCATE(fieldok(nbp_lon*jj_nb))
1117#ifndef CPP_IOIPSL_NO_OUTPUT 
1118                        CALL histwrite(nid_files(iff),var%name,itau_iophy,Field2d,nbp_lon*jj_nb,index2d)
1119#endif
1120!#ifdef CPP_XIOS
1121!                        IF (iff == iff_beg) THEN
1122!                          IF (prt_level >= 10) THEN
1123!                            write(lunout,*)"histwrite2d_phy: .NOT.clef_stations(iff) and iff==iff_beg, call xios_send_field"
1124!                          ENDIF
1125!                          CALL xios_send_field(var%name, Field2d)
1126!                        ENDIF
1127!#endif
1128                  ELSE
1129                        ALLOCATE(fieldok(npstn))
1130                        ALLOCATE(index2d(npstn))
1131
1132                        IF (is_sequential) THEN
1133                          DO ip=1, npstn
1134                            fieldok(ip)=buffer_omp(nptabij(ip))
1135                          ENDDO
1136                        ELSE
1137                              DO ip=1, npstn
1138                                write(lunout,*)'histwrite2d_phy is_sequential npstn ip namenptabij',npstn,ip,var%name,nptabij(ip)
1139                                     IF(nptabij(ip).GE.klon_mpi_begin.AND. &
1140                                        nptabij(ip).LE.klon_mpi_end) THEN
1141                                       fieldok(ip)=buffer_omp(nptabij(ip)-klon_mpi_begin+1)
1142                                     ENDIF
1143                              ENDDO
1144                       ENDIF ! of IF (is_sequential)
1145#ifndef CPP_IOIPSL_NO_OUTPUT 
1146                       IF (prt_level >= 10) THEN
1147                         write(lunout,*)"histwrite2d_phy: clef_stations(iff) and iff==iff_beg, call wxios_write_2D"
1148                       ENDIF
1149                       CALL histwrite(nid_files(iff),var%name,itau_iophy,fieldok,npstn,index2d)
1150#endif
1151                  ENDIF ! of IF(.NOT.clef_stations(iff))
1152                 
1153                DEALLOCATE(index2d)
1154                DEALLOCATE(fieldok)
1155            ENDIF !levfiles
1156        ENDDO ! of DO iff=iff_beg, iff_end
1157      ENDIF
1158!$OMP END MASTER   
1159  ENDIF ! vars_defined
1160
1161  IF (prt_level >= 10) WRITE(lunout,*)'End histwrite2d_phy ',trim(var%name)
1162
1163  END SUBROUTINE histwrite2d_phy
1164
1165
1166! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE
1167  SUBROUTINE histwrite3d_phy(var, field, STD_iff)
1168
1169  USE mod_phys_lmdz_omp_transfert, ONLY: bcast_omp
1170  USE dimphy, ONLY: klon, klev
1171  USE mod_phys_lmdz_para, ONLY: gather_omp, grid1dto2d_mpi, &
1172                                jj_nb, klon_mpi, klon_mpi_begin, &
1173                                klon_mpi_end, is_sequential, is_master
1174  USE ioipsl, ONLY: histwrite
1175  USE phys_output_var_mod, ONLY: ctrl_out, clef_files, lev_files, &
1176                                 nfiles, vars_defined, clef_stations, &
1177                                 nid_files, swaerofree_diag
1178  USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, regular_lonlat, unstructured
1179#ifdef CPP_XIOS
1180  USE xios, ONLY: xios_send_field
1181#endif
1182  USE print_control_mod, ONLY: prt_level,lunout
1183
1184  IMPLICIT NONE
1185  INCLUDE 'clesphys.h'
1186
1187  TYPE(ctrl_out), INTENT(IN) :: var
1188  REAL, DIMENSION(:,:), INTENT(IN) :: field ! --> field(klon,:)
1189  INTEGER, INTENT(IN), OPTIONAL :: STD_iff ! ug RUSTINE POUR LES STD LEVS.....
1190     
1191  INTEGER :: iff, iff_beg, iff_end
1192  LOGICAL, SAVE  :: firstx
1193!$OMP THREADPRIVATE(firstx)
1194  REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp
1195  REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2))
1196  INTEGER :: ip, n, nlev, nlevx
1197  INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d
1198  REAL,ALLOCATABLE, DIMENSION(:,:) :: fieldok
1199
1200  IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite3d_phy for ', trim(var%name)
1201
1202  IF (prt_level >= 10) write(lunout,*)'Begin histrwrite3d ',var%name
1203
1204! ug RUSTINE POUR LES STD LEVS.....
1205      IF (PRESENT(STD_iff)) THEN
1206            iff_beg = STD_iff
1207            iff_end = STD_iff
1208      ELSE
1209            iff_beg = 1
1210            iff_end = nfiles
1211      ENDIF
1212
1213  ! On regarde si on est dans la phase de définition ou d'écriture:
1214  IF (.NOT.vars_defined) THEN
1215      !Si phase de définition.... on définit
1216!$OMP MASTER
1217      DO iff=iff_beg, iff_end
1218        IF (clef_files(iff)) THEN
1219          CALL histdef3d(iff, var)
1220        ENDIF
1221      ENDDO
1222!$OMP END MASTER
1223!--broadcasting the flag that have been changed in histdef3d on OMP masters
1224      CALL bcast_omp(swaerofree_diag)
1225  ELSE
1226    !Et sinon on.... écrit
1227
1228    IF (SIZE(field,1)/=klon .AND. SIZE(field,1)/=klev .AND. SIZE(field,1)/=klev+1) CALL abort_physic('iophy::histwrite3d_phy','Field first DIMENSION not equal to klon/klev',1)
1229
1230    nlev=SIZE(field,2)
1231    IF (nlev.EQ.klev+1) THEN
1232        nlevx=klev
1233    ELSE
1234        nlevx=nlev
1235    ENDIF
1236
1237    IF (SIZE(field,1) == klon) then
1238        CALL Gather_omp(field,buffer_omp)
1239    ELSE
1240        buffer_omp(:,:)=0.
1241    ENDIF
1242!$OMP MASTER
1243    IF (grid_type==regular_lonlat) CALL grid1Dto2D_mpi(buffer_omp,field3d)
1244
1245! BOUCLE SUR LES FICHIERS
1246    firstx=.true.
1247
1248    IF (ok_all_xml) THEN
1249#ifdef CPP_XIOS
1250          IF (prt_level >= 10) THEN
1251             write(lunout,*)'Dans iophy histwrite3D,var%name ',&
1252                             trim(var%name)                       
1253          ENDIF
1254          IF (grid_type==regular_lonlat) THEN
1255            IF (SIZE(field,1) == klon) then
1256               CALL xios_send_field(var%name, Field3d(:,:,1:nlevx))
1257            ELSE
1258               CALL xios_send_field(var%name, field)
1259            ENDIF
1260          ELSE IF (grid_type==unstructured) THEN
1261            IF (SIZE(field,1) == klon) then
1262               CALL xios_send_field(var%name, buffer_omp(:,1:nlevx))
1263            ELSE
1264               CALL xios_send_field(var%name, field)
1265            ENDIF
1266        ENDIF
1267
1268#else
1269        CALL abort_physic ('iophy','cannot have ok_all_xml = .T. without CPP_XIOS defined' ,1)
1270#endif
1271    ELSE 
1272
1273      DO iff=iff_beg, iff_end
1274          IF (var%flag(iff) <= lev_files(iff) .AND. clef_files(iff)) THEN
1275#ifdef CPP_XIOS
1276              IF (firstx) THEN
1277                IF (prt_level >= 10) THEN
1278                  write(lunout,*)'Dans iophy, histwrite3D iff nlev klev firstx', &
1279                                  iff,nlev,klev, firstx                       
1280                  write(lunout,*)'histwrite3d_phy: call xios_send_field for ', &
1281                                  trim(var%name), ' with iim jjm nlevx = ', &
1282                                  nbp_lon,jj_nb,nlevx
1283                ENDIF
1284                IF (grid_type==regular_lonlat) THEN
1285                  IF (SIZE(field,1) == klon) then
1286                      CALL xios_send_field(var%name, Field3d(:,:,1:nlevx))
1287                  ELSE
1288                       CALL xios_send_field(var%name, field)
1289                  ENDIF
1290                ELSE IF (grid_type==unstructured) THEN
1291                  IF (SIZE(field,1) == klon) then
1292                     CALL xios_send_field(var%name, buffer_omp(:,1:nlevx))
1293                  ELSE
1294                     CALL xios_send_field(var%name, field)
1295                  ENDIF
1296                ENDIF
1297
1298                firstx=.false.
1299              ENDIF
1300#endif
1301              IF (.NOT.clef_stations(iff)) THEN
1302                        ALLOCATE(index3d(nbp_lon*jj_nb*nlev))
1303                        ALLOCATE(fieldok(nbp_lon*jj_nb,nlev))
1304
1305#ifndef CPP_IOIPSL_NO_OUTPUT 
1306                        CALL histwrite(nid_files(iff),var%name,itau_iophy,Field3d,nbp_lon*jj_nb*nlev,index3d)
1307#endif
1308
1309!#ifdef CPP_XIOS
1310!                        IF (iff == 1) THEN
1311!                              CALL xios_send_field(var%name, Field3d(:,:,1:klev))
1312!                        ENDIF
1313!#endif
1314!                       
1315              ELSE
1316                        nlev=size(field,2)
1317                        ALLOCATE(index3d(npstn*nlev))
1318                        ALLOCATE(fieldok(npstn,nlev))
1319
1320                        IF (is_sequential) THEN
1321                              DO n=1, nlev
1322                                    DO ip=1, npstn
1323                                          fieldok(ip,n)=buffer_omp(nptabij(ip),n)
1324                                    ENDDO
1325                              ENDDO
1326                        ELSE
1327                              DO n=1, nlev
1328                                    DO ip=1, npstn
1329                                                IF(nptabij(ip).GE.klon_mpi_begin.AND. &
1330                                                      nptabij(ip).LE.klon_mpi_end) THEN
1331                                                fieldok(ip,n)=buffer_omp(nptabij(ip)-klon_mpi_begin+1,n)
1332                                          ENDIF
1333                                    ENDDO
1334                              ENDDO
1335                        ENDIF
1336#ifndef CPP_IOIPSL_NO_OUTPUT 
1337                        CALL histwrite(nid_files(iff),var%name,itau_iophy,fieldok,npstn*nlev,index3d)
1338#endif
1339              ENDIF
1340              DEALLOCATE(index3d)
1341              DEALLOCATE(fieldok)
1342          ENDIF
1343      ENDDO
1344    ENDIF
1345!$OMP END MASTER   
1346  ENDIF ! vars_defined
1347
1348  IF (prt_level >= 10) write(lunout,*)'End histrwrite3d ',var%name
1349
1350  END SUBROUTINE histwrite3d_phy
1351 
1352
1353! VERSION DES HISTWRITE DEDIEES AU TOUT-XIOS-XML DEJA UTILISEE DANS PHYDEV
1354#ifdef CPP_XIOS
1355  SUBROUTINE histwrite2d_xios(field_name,field)
1356
1357  USE dimphy, ONLY: klon, klev
1358  USE mod_phys_lmdz_para, ONLY: gather_omp, grid1Dto2D_mpi, &
1359                                is_sequential, klon_mpi_begin, klon_mpi_end, &
1360                                jj_nb, klon_mpi, is_master
1361  USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, unstructured
1362  USE xios, ONLY: xios_send_field
1363  USE print_control_mod, ONLY: prt_level,lunout
1364
1365  IMPLICIT NONE
1366
1367  CHARACTER(LEN=*), INTENT(IN) :: field_name
1368  REAL, DIMENSION(:), INTENT(IN) :: field
1369     
1370  REAL,DIMENSION(klon_mpi) :: buffer_omp
1371  INTEGER, allocatable, DIMENSION(:) :: index2d
1372  REAL :: Field2d(nbp_lon,jj_nb)
1373
1374  INTEGER :: ip
1375  REAL, ALLOCATABLE, DIMENSION(:) :: fieldok
1376
1377  IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite2d_xios for ', field_name
1378
1379  IF (prt_level >= 10) WRITE(lunout,*)'Begin histrwrite2d_xios ',field_name
1380
1381    !Et sinon on.... écrit
1382    IF (SIZE(field)/=klon .AND. SIZE(field)/=klev .AND. SIZE(field)/=klev+1) CALL abort_physic('iophy::histwrite2d_xios','Field first DIMENSION not equal to klon/klev',1)
1383    IF (SIZE(field) == klev .OR. SIZE(field) == klev+1) then
1384!$OMP MASTER
1385
1386        CALL xios_send_field(field_name,field)
1387!$OMP END MASTER   
1388  ELSE
1389        CALL Gather_omp(field,buffer_omp)   
1390!$OMP MASTER
1391
1392      IF (grid_type==unstructured) THEN
1393 
1394        CALL xios_send_field(field_name, buffer_omp)
1395
1396      ELSE
1397
1398        CALL grid1Dto2D_mpi(buffer_omp,Field2d)
1399   
1400!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1401!ATTENTION, STATIONS PAS GEREES !
1402!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1403    !IF(.NOT.clef_stations(iff)) THEN
1404        IF (.TRUE.) THEN
1405   
1406            CALL xios_send_field(field_name, Field2d)
1407   
1408        ELSE
1409            ALLOCATE(fieldok(npstn))
1410            ALLOCATE(index2d(npstn))
1411   
1412            IF (is_sequential) THEN
1413                DO ip=1, npstn
1414                    fieldok(ip)=buffer_omp(nptabij(ip))
1415                ENDDO
1416            ELSE
1417                DO ip=1, npstn
1418                    PRINT*,'histwrite2d_xios is_sequential npstn ip namenptabij',npstn,ip,field_name,nptabij(ip)
1419                    IF(nptabij(ip).GE.klon_mpi_begin.AND. &
1420                    nptabij(ip).LE.klon_mpi_end) THEN
1421                        fieldok(ip)=buffer_omp(nptabij(ip)-klon_mpi_begin+1)
1422                    ENDIF
1423                ENDDO
1424            ENDIF
1425            DEALLOCATE(index2d)
1426            DEALLOCATE(fieldok)
1427   
1428        ENDIF                 
1429      ENDIF
1430!$OMP END MASTER   
1431  ENDIF
1432
1433  IF (prt_level >= 10) WRITE(lunout,*)'End histrwrite2d_xios ',field_name
1434  END SUBROUTINE histwrite2d_xios
1435
1436
1437! ug NOUVELLE VERSION DES WRITE AVEC LA BOUCLE DO RENTREE
1438  SUBROUTINE histwrite3d_xios(field_name, field)
1439
1440  USE dimphy, ONLY: klon, klev
1441  USE mod_phys_lmdz_para, ONLY: gather_omp, grid1Dto2D_mpi, &
1442                                is_sequential, klon_mpi_begin, klon_mpi_end, &
1443                                jj_nb, klon_mpi, is_master
1444  USE xios, ONLY: xios_send_field
1445  USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid_type, unstructured
1446  USE print_control_mod, ONLY: prt_level,lunout
1447
1448  IMPLICIT NONE
1449
1450  CHARACTER(LEN=*), INTENT(IN) :: field_name
1451  REAL, DIMENSION(:,:), INTENT(IN) :: field ! --> field(klon,:)
1452
1453  REAL,DIMENSION(klon_mpi,SIZE(field,2)) :: buffer_omp
1454  REAL :: Field3d(nbp_lon,jj_nb,SIZE(field,2))
1455  INTEGER :: ip, n, nlev
1456  INTEGER, ALLOCATABLE, DIMENSION(:) :: index3d
1457  REAL,ALLOCATABLE, DIMENSION(:,:) :: fieldok
1458
1459  IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite3d_xios for ', field_name
1460
1461  IF (prt_level >= 10) write(lunout,*)'Begin histrwrite3d_xios ',field_name
1462
1463    !Et on.... écrit
1464    IF (SIZE(field,1)/=klon .AND. SIZE(field,1)/=klev .AND. SIZE(field,1)/=klev+1) then
1465      write(lunout,*)' histrwrite3d_xios ', field_name, SIZE(field)
1466      CALL abort_physic('iophy::histwrite3d_xios','Field first DIMENSION not equal to klon/klev',1)
1467    ENDIF
1468   
1469    IF (SIZE(field,1) == klev .OR. SIZE(field,1) == klev+1) then
1470!$OMP MASTER
1471        CALL xios_send_field(field_name,field)
1472!$OMP END MASTER   
1473  ELSE
1474        nlev=SIZE(field,2)
1475
1476
1477        CALL Gather_omp(field,buffer_omp)
1478!$OMP MASTER
1479
1480    IF (grid_type==unstructured) THEN
1481
1482      CALL xios_send_field(field_name, buffer_omp(:,1:nlev))
1483
1484    ELSE
1485        CALL grid1Dto2D_mpi(buffer_omp,field3d)
1486
1487!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1488!ATTENTION, STATIONS PAS GEREES !
1489!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1490    !IF (.NOT.clef_stations(iff)) THEN
1491        IF(.TRUE.)THEN
1492
1493           CALL xios_send_field(field_name, Field3d(:,:,1:nlev))
1494                           
1495        ELSE
1496            nlev=size(field,2)
1497            ALLOCATE(index3d(npstn*nlev))
1498            ALLOCATE(fieldok(npstn,nlev))
1499   
1500            IF (is_sequential) THEN
1501                DO n=1, nlev
1502                    DO ip=1, npstn
1503                        fieldok(ip,n)=buffer_omp(nptabij(ip),n)
1504                    ENDDO
1505                ENDDO
1506            ELSE
1507                DO n=1, nlev
1508                    DO ip=1, npstn
1509                        IF(nptabij(ip).GE.klon_mpi_begin.AND. &
1510                        nptabij(ip).LE.klon_mpi_end) THEN
1511                            fieldok(ip,n)=buffer_omp(nptabij(ip)-klon_mpi_begin+1,n)
1512                        ENDIF
1513                    ENDDO
1514                ENDDO
1515            ENDIF
1516            DEALLOCATE(index3d)
1517            DEALLOCATE(fieldok)
1518        ENDIF
1519      ENDIF
1520!$OMP END MASTER   
1521  ENDIF
1522
1523  IF (prt_level >= 10) write(lunout,*)'End histrwrite3d_xios ',field_name
1524
1525  END SUBROUTINE histwrite3d_xios
1526
1527#ifdef CPP_XIOS
1528  SUBROUTINE histwrite0d_xios(field_name, field)
1529  USE xios, ONLY: xios_send_field
1530  USE mod_phys_lmdz_para, ONLY: is_master
1531  USE print_control_mod, ONLY: prt_level,lunout
1532  IMPLICIT NONE
1533
1534  CHARACTER(LEN=*), INTENT(IN) :: field_name
1535  REAL, INTENT(IN) :: field ! --> scalar
1536
1537  IF (check_dim .AND. is_master) WRITE(lunout,*)'histwrite0d_xios for ', field_name
1538
1539!$OMP MASTER
1540  CALL xios_send_field(field_name, field)
1541!$OMP END MASTER
1542
1543  END SUBROUTINE histwrite0d_xios
1544#endif
1545
1546#endif
1547END MODULE iophy
Note: See TracBrowser for help on using the repository browser.