source: LMDZ6/branches/DYNAMICO-conv/libf/phylmd/iophy.F90 @ 3405

Last change on this file since 3405 was 3356, checked in by Laurent Fairhead, 6 years ago

First attempt at merging with trunk

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