source: LMDZ6/trunk/libf/phylmd/iophy.F90 @ 5503

Last change on this file since 5503 was 5483, checked in by evignon, 2 weeks ago

ajout de omp_threadprivate manquants

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