Index: LMDZ5/trunk/libf/bibio/wxios.F90
===================================================================
--- LMDZ5/trunk/libf/bibio/wxios.F90	(revision 1825)
+++ LMDZ5/trunk/libf/bibio/wxios.F90	(revision 1825)
@@ -0,0 +1,424 @@
+! $Id: wxios.F90 $
+#ifdef CPP_XIOS
+MODULE wxios
+    USE xios
+    USE iaxis
+    USE iaxis_attr
+    USE icontext_attr
+    USE idate
+    USE idomain_attr
+    USE ifield_attr
+    USE ifile_attr
+    USE ixml_tree
+
+    !Variables disponibles pendant toute l'execution du programme:
+    
+    INTEGER, SAVE :: g_comm
+    CHARACTER(len=100), SAVE :: g_ctx_name
+    TYPE(xios_context), SAVE :: g_ctx
+!$OMP THREADPRIVATE(g_comm,g_cts_name,g_ctx)
+
+    CONTAINS
+    
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    !   str + i   =>   str_i   !!!!!!!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    
+    SUBROUTINE concat(str, i, str_i) !MAX i = 99
+        CHARACTER(len=*), INTENT(IN) :: str
+        INTEGER, INTENT(IN) :: i
+        CHARACTER(len=100), INTENT(OUT) :: str_i
+        
+        
+        !INT -> CHAR:
+        CHARACTER(len=10) :: num
+        WRITE(num, "(I5)") i
+        str_i = TRIM(ADJUSTL(str//"_"//TRIM(ADJUSTL(num))))
+        
+    END SUBROUTINE concat
+    
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    !   36day => 36d etc     !!!!!!!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    
+    SUBROUTINE reformadate(odate, ndate)
+        CHARACTER(len=*), INTENT(IN) :: odate
+        CHARACTER(len=100), INTENT(OUT) :: ndate
+        
+        INTEGER :: i = 0
+        
+        i = INDEX(odate, "day")
+        IF (i > 0) THEN
+            ndate = odate(1:i-1)//"d"
+        ELSE
+            i = INDEX(odate, "hr")
+            IF (i > 0) THEN
+                ndate = odate(1:i-1)//"h"
+            ELSE
+                ndate = odate
+            END IF
+        END IF
+        
+        !WRITE(*,*) "Xios. ", odate, " => ", ndate
+    END SUBROUTINE reformadate
+    
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    !   ave(X) => average etc     !!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    
+    CHARACTER(len=7) FUNCTION reformaop(op)
+        CHARACTER(len=*), INTENT(IN) :: op
+        
+        INTEGER :: i = 0
+        reformaop = "average"
+        
+        IF (op.EQ."inst(X)") THEN
+            reformaop = "instant"
+        END IF
+        
+        IF (op.EQ."once") THEN
+            reformaop = "once"
+        END IF
+        
+        IF (op.EQ."t_max(X)") THEN
+            reformaop = "maximum"
+        END IF
+        
+        IF (op.EQ."t_min(X)") THEN
+            reformaop = "minimum"
+        END IF
+        
+        !WRITE(*,*) "Xios. ", op, " => ", reformaop
+    END FUNCTION reformaop
+
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Routine d'initialisation      !!!!!!!!!!!!!
+    !     A lancer juste après mpi_init !!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+    SUBROUTINE wxios_init(xios_ctx_name)
+      CHARACTER(len=*), INTENT(IN) :: xios_ctx_name
+        
+      INTEGER :: xios_comm
+        TYPE(xios_context) :: xios_ctx
+      
+        WRITE(*,*) "Xios. Initialization"
+
+        !Lancement de xios:
+        CALL xios_initialize(xios_ctx_name, return_comm = xios_comm )
+        
+        !Initialisation du contexte:
+        CALL xios_context_initialize(xios_ctx_name, xios_comm)
+        CALL xios_get_handle(xios_ctx_name, xios_ctx)    !Récupération
+        CALL xios_set_current_context(xios_ctx)            !Activation
+        
+        !Enregistrement des variables globales:
+        g_comm = xios_comm
+        g_ctx_name = xios_ctx_name
+        g_ctx = xios_ctx
+        
+        WRITE(*,*) "Xios. Current context is ", xios_ctx_name
+    END SUBROUTINE wxios_init
+
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Routine de paramétrisation !!!!!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+    SUBROUTINE wxios_set_cal(pasdetemps, calendrier, annee, mois, jour, heure)
+     !Paramètres:
+     CHARACTER(len=*), INTENT(IN) :: calendrier
+     INTEGER, INTENT(IN) :: annee, mois, jour
+     REAL, INTENT(IN) :: pasdetemps, heure
+     
+     !Variables:
+     CHARACTER(len=80) :: abort_message
+     CHARACTER(len=19) :: date
+     INTEGER :: njour = 1
+     
+     !Variables pour xios:
+     TYPE(xios_time) :: mdtime
+     !REAL(kind = 8) :: year=0, month=0, day=0, hour=0, minute=0, second=0
+     
+        mdtime = xios_time(0, 0, 0, 0, 0, pasdetemps)
+
+        !Réglage du calendrier:
+        SELECT CASE (calendrier)
+            CASE('earth_360d')
+                CALL xios_set_context_attr_hdl(g_ctx, calendar_type= "D360")
+                WRITE(*,*) 'Xios. Calendrier terrestre a 360 jours/an'
+            CASE('earth_365d')
+                CALL xios_set_context_attr_hdl(g_ctx, calendar_type= "NoLeap")
+                WRITE(*,*) 'Xios. Calendrier terrestre a 365 jours/an'
+            CASE('earth_366d')
+                CALL xios_set_context_attr_hdl(g_ctx, calendar_type= "Gregorian")
+                WRITE(*,*) 'Xios. Calendrier gregorien'
+            CASE DEFAULT
+                abort_message = 'Xios. Mauvais choix de calendrier'
+                CALL abort_gcm('Gcm:Xios',abort_message,1)
+        END SELECT
+        
+        !Formatage de la date de départ:
+        WRITE(date, "(i4.4,'-',i2.2,'-',i2.2,' 00:00:00')") annee, mois, jour
+        
+        WRITE(*,*) "Xios. Initial time: ", date
+        
+        CALL xios_set_context_attr_hdl(g_ctx, start_date= date)
+        
+        !Et enfin,le pas de temps:
+        CALL xios_set_timestep(mdtime)
+        WRITE(*,*) "Xios. ts=",mdtime
+    END SUBROUTINE wxios_set_cal
+
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Pour initialiser un domaine !!!!!!!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    SUBROUTINE wxios_domain_param(dom_id, is_sequential, iim, jjm, io_lat, io_lon)
+         
+        CHARACTER (len=*), INTENT(IN) :: dom_id
+        LOGICAL, INTENT(IN) :: is_sequential
+        INTEGER, INTENT(IN) :: iim, jjm
+        REAL, DIMENSION(:) :: io_lat, io_lon
+        
+        
+        TYPE(xios_domain) :: dom
+        INTEGER :: ni, nj, ni_glo, nj_glo, ibegin, iend, jbegin, jend
+        LOGICAl :: boool
+        
+        ni_glo = iim
+        nj_glo = jjm
+        ni = iim
+        nj = jjm
+        ibegin = 1
+        jbegin = 1
+        iend = ibegin + ni - 1
+        jend = jbegin + nj - 1
+        
+        !On récupère le handle:
+        CALL xios_get_domain_handle(dom_id, dom)
+        
+        WRITE(*,*) "Xios. ni:",iim," ni_glo:", iim, " nj:", jjm, " nj_glo:", jjm
+        WRITE(*,*) "Xios. Size lon:", SIZE(io_lon), " lat:", SIZE(io_lat)
+        
+        !On parametrise le domaine:
+        !IF (is_sequential) THEN
+            CALL xios_set_domain_attr_hdl(dom, ni_glo=iim, ibegin=1, ni=iim,&
+            & nj_glo=jjm, jbegin=1,nj=jjm,&
+            & lonvalue=io_lon(ibegin:iend), latvalue=io_lat(jbegin:jend))
+        !END IF
+         CALL xios_is_defined_domain_attr_hdl(dom,ni_glo=boool)
+        !Vérification:
+        IF (xios_is_valid_domain(dom_id)) THEN
+            WRITE(*,*) "Xios. Domain initialized: ", dom_id, boool
+        ELSE
+            WRITE(*,*) "Xios. Invalid domain: ", dom_id
+        END IF
+    END SUBROUTINE wxios_domain_param
+    
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Pour déclarer un axe vertical !!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    SUBROUTINE wxios_add_vaxis(axisgroup_id, axis_file_id, axis_size, axis_value)
+        CHARACTER (len=*), INTENT(IN) :: axisgroup_id
+        INTEGER, INTENT(IN) :: axis_file_id, axis_size
+        REAL, DIMENSION(axis_size), INTENT(IN) :: axis_value
+        
+        TYPE(xios_axisgroup) :: axgroup
+        TYPE(xios_axis) :: ax
+        CHARACTER(len=100) :: axis_id
+        
+        
+        !Préparation du nom de l'axe:
+        CALL concat(axisgroup_id, axis_file_id, axis_id)
+        
+        !On récupère le groupe d'axes qui va bien:
+        CALL xios_get_axisgroup_handle(axisgroup_id, axgroup)
+        
+        !On ajoute l'axe correspondant à ce fichier:
+        CALL xios_add_axis(axgroup, ax, axis_id)
+        
+        !Et on le parametrise:
+        CALL xios_set_axis_attr_hdl(ax, size=axis_size, value=axis_value)
+        
+        !Vérification:
+        IF (xios_is_valid_axis(axis_id)) THEN
+            WRITE(*,*) "Xios. Axis created: ", axis_id
+        ELSE
+            WRITE(*,*) "Xios. Invalid axis: ", axis_id
+        END IF
+
+    END SUBROUTINE wxios_add_vaxis
+    
+    
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Pour déclarer un fichier  !!!!!!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    SUBROUTINE wxios_add_file(fname, ffreq, flvl)
+        CHARACTER(len=*), INTENT(IN) :: fname
+        CHARACTER(len=*), INTENT(IN) :: ffreq
+        INTEGER, INTENT(IN) :: flvl
+        
+        TYPE(xios_file) :: x_file
+        TYPE(xios_filegroup) :: x_fg
+        CHARACTER(len=100) :: nffreq
+        
+        !On créé le noeud:
+        CALL xios_get_filegroup_handle("defile", x_fg)
+        CALL xios_add_file(x_fg, x_file, "X"//fname)
+        
+        !On reformate la fréquence:
+        CALL reformadate(ffreq, nffreq)
+        
+        !On configure:
+        CALL xios_set_file_attr_hdl(x_file, name="X"//fname,&
+                output_freq=TRIM(ADJUSTL(nffreq)), output_level=flvl, enabled=.TRUE.)
+        
+        IF (xios_is_valid_file("X"//fname)) THEN
+            WRITE(*,*) "Xios. New file: ", "X"//fname
+            WRITE(*,*) "Xios. output_freq=",TRIM(ADJUSTL(nffreq)),"; output_lvl=",flvl
+        ELSE
+            WRITE(*,*) "Xios. Error, invalid file: ", "X"//fname
+            WRITE(*,*) "Xios. output_freq=",TRIM(ADJUSTL(nffreq)),"; output_lvl=",flvl
+        END IF
+    END SUBROUTINE wxios_add_file
+    
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Pour créer un champ      !!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    SUBROUTINE wxios_add_field(fieldname, fieldgroup, fieldlongname, fieldunit)
+        USE netcdf
+        
+        CHARACTER(len=*), INTENT(IN) :: fieldname
+        TYPE(xios_fieldgroup), INTENT(IN) :: fieldgroup
+        CHARACTER(len=*), INTENT(IN) :: fieldlongname
+        CHARACTER(len=*), INTENT(IN) :: fieldunit
+        
+        TYPE(xios_field) :: field
+        CHARACTER(len=10) :: newunit
+        REAL(KIND=8) :: def
+        
+        !La valeur par défaut des champs non définis:
+        def = nf90_fill_real
+        
+        IF (fieldunit .EQ. " ") THEN
+            newunit = "-"
+        ELSE
+            newunit = fieldunit
+        ENDIF
+        
+        !On ajoute le champ:
+        CALL xios_add_field(fieldgroup, field, fieldname)
+        !WRITE(*,*) "Xios. ",fieldname,fieldgroup, fieldlongname, fieldunit
+        
+        !On rentre ses paramètres:
+        CALL xios_set_field_attr_hdl(field, standard_name=fieldlongname, unit=newunit, default_value=def)
+        WRITE(*,*) "Xios. Champ ", fieldname, "cree:"
+        WRITE(*,*) "Xios. long_name=",fieldlongname,"; unit=",newunit,";  default_value=",nf90_fill_real
+
+    END SUBROUTINE wxios_add_field
+    
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    ! Pour déclarer un champ      !!!!!!!!!!!!!!!
+    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+    SUBROUTINE wxios_add_field_to_file(fieldname, fdim, fid, fname, fieldlongname, fieldunit, field_level, op)
+        CHARACTER(len=*), INTENT(IN) :: fieldname
+        INTEGER, INTENT(IN)          :: fdim, fid
+        CHARACTER(len=*), INTENT(IN) :: fname
+        CHARACTER(len=*), INTENT(IN) :: fieldlongname
+        CHARACTER(len=*), INTENT(IN) :: fieldunit
+        INTEGER, INTENT(IN)          :: field_level
+        CHARACTER(len=*), INTENT(IN) :: op
+        
+        CHARACTER(len=100) :: axis_id
+        CHARACTER(len=100) :: operation
+        TYPE(xios_file) :: f
+        TYPE(xios_field) :: field
+        TYPE(xios_fieldgroup) :: fieldgroup
+        
+        
+        !Préparation du nom de l'axe:
+        CALL concat("presnivs", fid, axis_id)
+        
+        !on prépare le nom de l'opération:
+        operation = reformaop(op)
+        
+        
+        
+        !On selectionne le bon groupe de champs:
+        IF (fdim.EQ.2) THEN
+            CALL xios_get_fieldgroup_handle("fields_2D", fieldgroup)
+        ELSE
+          CALL xios_get_fieldgroup_handle("fields_3D", fieldgroup)
+        ENDIF
+        
+        !On regarde si le champ à déjà été créé ou non:
+        IF (xios_is_valid_field(fieldname)) THEN
+            WRITE(*,*) "Xios. Champ ", fieldname, "existe"
+        ELSE
+            WRITE(*,*) "Xios. Champ ", fieldname, "nexiste pas"
+            
+            !On le créé:
+            CALL wxios_add_field(fieldname,  fieldgroup, fieldlongname, fieldunit)
+            IF (xios_is_valid_field(fieldname)) THEN
+                WRITE(*,*) "Xios. Champ ", fieldname, "cree"
+            ENDIF
+        ENDIF
+        
+        !On ajoute le champ:
+        CALL xios_get_file_handle("X"//fname, f)
+        CALL xios_add_fieldtofile(f, field)
+        
+        
+        !L'operation, sa frequence:
+        CALL xios_set_field_attr_hdl(field, field_ref=fieldname, operation=TRIM(ADJUSTL(operation)), freq_op="1ts", prec=4)
+
+        
+        !On rentre ses paramètres:
+        CALL xios_set_field_attr_hdl(field, level=field_level, enabled=.TRUE.)
+        
+        IF (fdim.EQ.2) THEN
+            !Si c'est un champ 2D:
+            WRITE(*,*) "Xios. Champ 2D ", fieldname, " de ", "X"//fname ," configure:"
+            WRITE (*,*) "Xios. op=", TRIM(ADJUSTL(operation))
+            WRITE(*,*) "Xios. freq_op=1ts","; lvl=",field_level
+        ELSE
+            !Si 3D :
+            !On ajoute l'axe vertical qui va bien:
+            CALL xios_set_field_attr_hdl(field, axis_ref=axis_id)
+            
+            WRITE(*,*) "Xios. Champ 3D ", fieldname, " de ", "X"//fname, "configure:"
+            WRITE(*,*) "Xios. freq_op=1ts","; lvl=",field_level
+            WRITE(*,*) "Xios. axe=",axis_id
+        END IF
+        
+    END SUBROUTINE wxios_add_field_to_file
+    
+    SUBROUTINE wxios_update_calendar(ito)
+        INTEGER, INTENT(IN) :: ito
+        CALL xios_update_calendar(ito)
+    END SUBROUTINE wxios_update_calendar
+    
+    SUBROUTINE wxios_write_2D(fieldname, fdata)
+        CHARACTER(len=*), INTENT(IN) :: fieldname
+        REAL, DIMENSION(:,:), INTENT(IN) :: fdata
+        
+        CALL xios_send_field(fieldname, fdata)
+    END SUBROUTINE wxios_write_2D
+    
+    SUBROUTINE wxios_write_3D(fieldname, fdata)
+        CHARACTER(len=*), INTENT(IN) :: fieldname
+        REAL, DIMENSION(:,:,:), INTENT(IN) :: fdata
+        
+        CALL xios_send_field(fieldname, fdata)
+    END SUBROUTINE wxios_write_3D
+    
+    SUBROUTINE wxios_closedef()
+        CALL xios_close_context_definition()
+        CALL xios_update_calendar(0)
+    END SUBROUTINE wxios_closedef
+    
+    SUBROUTINE wxios_close()
+        CALL xios_context_finalize()
+         CALL xios_finalize()
+     END SUBROUTINE wxios_close
+END MODULE wxios
+#endif
Index: LMDZ5/trunk/libf/dyn3d/abort_gcm.F
===================================================================
--- LMDZ5/trunk/libf/dyn3d/abort_gcm.F	(revision 1823)
+++ LMDZ5/trunk/libf/dyn3d/abort_gcm.F	(revision 1825)
@@ -12,4 +12,10 @@
       USE ioipsl_getincom
 #endif
+
+#ifdef CPP_XIOS
+    ! ug Pour les sorties XIOS
+      USE wxios
+#endif
+
 #include "iniprint.h"
  
@@ -27,4 +33,10 @@
 
       write(lunout,*) 'in abort_gcm'
+
+#ifdef CPP_XIOS
+    !Fermeture propre de XIOS
+      CALL wxios_close()
+#endif
+
 #ifdef CPP_IOIPSL
       call histclo
Index: LMDZ5/trunk/libf/dyn3d/gcm.F
===================================================================
--- LMDZ5/trunk/libf/dyn3d/gcm.F	(revision 1823)
+++ LMDZ5/trunk/libf/dyn3d/gcm.F	(revision 1825)
@@ -11,4 +11,10 @@
 ! if not using IOIPSL, we still need to use (a local version of) getin
       USE ioipsl_getincom
+#endif
+
+
+#ifdef CPP_XIOS
+    ! ug Pour les sorties XIOS
+	USE wxios
 #endif
 
@@ -179,4 +185,13 @@
 !      CALL defrun( 99, .TRUE. , clesphy0 )
 !#endif
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! Initialisation de XIOS
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#ifdef CPP_XIOS
+	CALL wxios_init("LMDZ")
+#endif
+
 
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Index: LMDZ5/trunk/libf/dyn3dpar/gcm.F
===================================================================
--- LMDZ5/trunk/libf/dyn3dpar/gcm.F	(revision 1823)
+++ LMDZ5/trunk/libf/dyn3dpar/gcm.F	(revision 1825)
@@ -8,4 +8,10 @@
 #ifdef CPP_IOIPSL
       USE IOIPSL
+#endif
+
+
+#ifdef CPP_XIOS
+    ! ug Pour les sorties XIOS
+	USE wxios
 #endif
 
@@ -212,4 +218,12 @@
       call InitComgeomphy
 c$OMP END PARALLEL 
+#endif
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! Initialisation de XIOS
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#ifdef CPP_XIOS
+	CALL wxios_init("LMDZ")
 #endif
 
Index: LMDZ5/trunk/libf/dyn3dpar/leapfrog_p.F
===================================================================
--- LMDZ5/trunk/libf/dyn3dpar/leapfrog_p.F	(revision 1823)
+++ LMDZ5/trunk/libf/dyn3dpar/leapfrog_p.F	(revision 1825)
@@ -22,4 +22,8 @@
        USE control_mod
 
+#ifdef CPP_XIOS
+    ! ug Pour les sorties XIOS
+	USE wxios
+#endif
       IMPLICIT NONE
 
@@ -1369,4 +1373,9 @@
 
 c$OMP MASTER
+
+#ifdef CPP_XIOS
+    !Fermeture propre de XIOS
+      CALL wxios_close()
+#endif
               call fin_getparam
               call finalize_parallel
Index: LMDZ5/trunk/libf/phylmd/iophy.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/iophy.F90	(revision 1823)
+++ LMDZ5/trunk/libf/phylmd/iophy.F90	(revision 1825)
@@ -5,4 +5,8 @@
 
   USE phys_output_var_mod
+
+#ifdef CPP_XIOS
+  USE wxios
+#endif
 
 ! abd  REAL,private,allocatable,DIMENSION(:),save :: io_lat
@@ -22,5 +26,5 @@
 
   INTERFACE histbeg_phy_all
-    MODULE PROCEDURE histbeg_phy,histbeg_phy_points
+    MODULE PROCEDURE histbeg_phy,histbeg_phyxios,histbeg_phy_points
   END INTERFACE
 
@@ -40,4 +44,5 @@
   USE mod_grid_phy_lmdz
   USE ioipsl
+  
   IMPLICIT NONE
   INCLUDE 'dimensions.h'   
@@ -89,5 +94,8 @@
     CALL flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
                       'APPLE',phys_domain_id)
-
+#ifdef CPP_XIOS
+    !On initialise le domaine xios, maintenant que tout est connu:
+    CALL wxios_domain_param("dom_glo", is_sequential, iim, jjm+1, io_lat, io_lon)
+#endif
 !$OMP END MASTER
       
@@ -135,4 +143,41 @@
       
   end SUBROUTINE init_iophy
+
+ SUBROUTINE histbeg_phyxios(name,itau0,zjulian,dtime,ffreq,lev,nhori,nid_day)
+  USE dimphy
+  USE mod_phys_lmdz_para
+  use ioipsl
+  use write_field
+  IMPLICIT NONE
+  include 'dimensions.h'
+    
+    character*(*), INTENT(IN) :: name
+    integer, INTENT(IN) :: itau0
+    REAL,INTENT(IN) :: zjulian
+    REAL,INTENT(IN) :: dtime
+    character(LEN=*), INTENT(IN) :: ffreq
+    INTEGER,INTENT(IN) :: lev
+    integer,intent(out) :: nhori
+    integer,intent(out) :: nid_day
+
+!$OMP MASTER    
+    if (is_sequential) then
+      call histbeg(name,iim,io_lon, jj_nb,io_lat(jj_begin:jj_end), &
+                   1,iim,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day)
+    else
+      call histbeg(name,iim,io_lon, jj_nb,io_lat(jj_begin:jj_end), &
+                   1,iim,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day,phys_domain_id)
+    endif
+
+#ifdef CPP_XIOS
+    ! ug OMP en chantier...
+    IF((.NOT. is_using_mpi) .OR. is_mpi_root) THEN
+        ! ug Création du fichier
+        CALL wxios_add_file(name, ffreq, lev)
+    END IF
+#endif
+!$OMP END MASTER
+  
+  END SUBROUTINE histbeg_phyxios
   
   SUBROUTINE histbeg_phy(name,itau0,zjulian,dtime,nhori,nid_day)
@@ -159,7 +204,9 @@
                    1,iim,1,jj_nb,itau0, zjulian, dtime, nhori, nid_day,phys_domain_id)
     endif
+
 !$OMP END MASTER
   
   END SUBROUTINE histbeg_phy
+
 
   SUBROUTINE histbeg_phy_points(rlon,rlat,pim,tabij,ipt,jpt, &
@@ -487,4 +534,9 @@
 
     IF(.NOT.clef_stations(iff)) THEN  
+#ifdef CPP_XIOS
+        CALL wxios_add_field_to_file(var%name, 2, nid_files(iff), phys_out_filenames(iff), &
+        var%description, var%unit, var%flag(iff), typeecrit)
+#endif
+
        IF ( var%flag(iff)<=lev_files(iff) ) THEN
           CALL histdef (nid_files(iff), var%name, var%description, var%unit, &
@@ -550,4 +602,9 @@
 
     IF(.NOT.clef_stations(iff)) THEN
+#ifdef CPP_XIOS
+        CALL wxios_add_field_to_file(var%name, 3, nid_files(iff), phys_out_filenames(iff), &
+        var%description, var%unit, var%flag(iff), typeecrit)
+#endif
+
        IF ( var%flag(iff)<=lev_files(iff) ) THEN
           CALL histdef (nid_files(iff), var%name, var%description, var%unit, &
@@ -734,6 +791,7 @@
 
 #ifdef CPP_XIOS
-!  USE WXIOS
+  USE wxios
 #endif
+
 
   IMPLICIT NONE
@@ -794,7 +852,7 @@
                         CALL histwrite(nid_files(iff),var%name,itau_iophy,Field2d,iim*jj_nb,index2d)
 #ifdef CPP_XIOS
-!                        IF (iff .EQ. 1) THEN
-!                              CALL wxios_write_2D(var%name, Field2d)
-!                        ENDIF
+                        IF (iff == iff_beg) THEN
+                              CALL wxios_write_2D(var%name, Field2d)
+                        ENDIF
 #endif
                   ELSE 
@@ -887,8 +945,9 @@
                         ALLOCATE(fieldok(iim*jj_nb,nlev))
                         CALL histwrite(nid_files(iff),var%name,itau_iophy,Field3d,iim*jj_nb*nlev,index3d)
+
 #ifdef CPP_XIOS
-!                        IF (iff .EQ. 1) THEN
-!                              CALL wxios_write_3D(var%name, Field3d(:,:,1:klev))
-!                        ENDIF
+                        IF (iff == 1) THEN
+                              CALL wxios_write_3D(var%name, Field3d(:,:,1:klev))
+                        ENDIF
 #endif
                         
Index: LMDZ5/trunk/libf/phylmd/phys_output_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/phys_output_mod.F90	(revision 1823)
+++ LMDZ5/trunk/libf/phylmd/phys_output_mod.F90	(revision 1825)
@@ -42,4 +42,9 @@
     USE aero_mod, only : naero_spc,name_aero
     USE phys_output_ctrlout_mod
+
+#ifdef CPP_XIOS
+    ! ug Pour les sorties XIOS
+    USE wxios
+#endif
 
     IMPLICIT NONE
@@ -98,5 +103,4 @@
     CHARACTER(LEN=3)                      :: ctetaSTD(nbteta)
     REAL, DIMENSION(nfiles)               :: ecrit_files
-    CHARACTER(LEN=20), DIMENSION(nfiles)  :: phys_out_filenames
     INTEGER, DIMENSION(iim*jjmp1)         ::  ndex2d
     INTEGER, DIMENSION(iim*jjmp1*klev)    :: ndex3d
@@ -117,4 +121,10 @@
     REAL, DIMENSION(nfiles), SAVE     :: phys_out_latmin        = (/    -90.,    -90.,    -90.,     -90.,    -90.,    -90. /)
     REAL, DIMENSION(nfiles), SAVE     :: phys_out_latmax        = (/     90.,     90.,     90.,     90.,     90.,     90. /)
+
+#ifdef CPP_XIOS
+    ! ug Variables utilisées pour récupérer le calendrier pour xios
+    INTEGER :: x_an, x_mois, x_jour
+    REAL :: x_heure
+#endif
 
     WRITE(lunout,*) 'Debut phys_output_mod.F90'
@@ -209,4 +219,12 @@
     WRITE(lunout,*)'phys_out_filelevels=',lev_files
 
+#ifdef CPP_XIOS
+    ! ug Réglage du calendrier xios
+    !Temps julian => an, mois, jour, heure
+    CALL ymds2ju(annee_ref, 1, day_ref, 0.0, zjulian)
+    CALL ju2ymds(zjulian, x_an, x_mois, x_jour, x_heure)
+    CALL wxios_set_cal(dtime, calend, x_an, x_mois, x_jour, x_heure)
+#endif
+
 !!!!!!!!!!!!!!!!!!!!!!! Boucle sur les fichiers !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     ! Appel de histbeg et histvert pour creer le fichier et les niveaux verticaux !!
@@ -257,5 +275,4 @@
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
           IF (phys_out_regfkey(iff)) then
-
              imin_ins=1
              imax_ins=iim
@@ -297,5 +314,6 @@
                   itau_phy,zjulian,dtime,nhorim(iff),nid_files(iff))
           else
-             CALL histbeg_phy(phys_out_filenames(iff),itau_phy,zjulian,dtime,nhorim(iff),nid_files(iff))
+             CALL histbeg_phy_all(phys_out_filenames(iff),itau_phy,zjulian,&
+                 dtime,chtimestep(iff),lev_files(iff),nhorim(iff),nid_files(iff))
           endif
 
@@ -329,4 +347,11 @@
           !                 1,preff,nvertp0(iff))
 
+#ifdef CPP_XIOS
+    ! ug déclaration des axes verticaux de chaque fichier:
+    CALL wxios_add_vaxis("presnivs", nid_files(iff), levmax(iff) - levmin(iff) + 1, presnivs(levmin(iff):levmax(iff)))
+    CALL wxios_add_vaxis("Ahyb", nid_files(iff), levmax(iff) - levmin(iff) + 1, Ahyb)
+    CALL wxios_add_vaxis("Bhyb", nid_files(iff), levmax(iff) - levmin(iff) + 1, Bhyb)
+    CALL wxios_add_vaxis("Ahyb", nid_files(iff), levmax(iff) - levmin(iff) + 1, Alt)
+#endif 
 
       IF (nqtot>=3) THEN
Index: LMDZ5/trunk/libf/phylmd/phys_output_var_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/phys_output_var_mod.F90	(revision 1823)
+++ LMDZ5/trunk/libf/phylmd/phys_output_var_mod.F90	(revision 1825)
@@ -41,4 +41,6 @@
       CHARACTER(LEN=20), DIMENSION(nfiles), SAVE  :: type_ecri_files, phys_out_filetypes
 !$OMP THREADPRIVATE(type_ecri_files, phys_out_filetypes)
+    CHARACTER(LEN=20), DIMENSION(nfiles), SAVE  :: phys_out_filenames
+!$OMP THREADPRIVATE(phys_out_filenames)
 
  ! swaero_diag : flag indicates if it is necessary to do calculation for some aerosol diagnostics
Index: LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90	(revision 1823)
+++ LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90	(revision 1825)
@@ -39,4 +39,11 @@
     USE write_field_phy
     USE iophy
+    USE mod_phys_lmdz_para
+
+#ifdef CPP_XIOS
+    ! ug Pour les sorties XIOS
+	USE wxios
+    USE xios
+#endif
 
     IMPLICIT NONE
@@ -80,4 +87,10 @@
      ! On le donne à iophy pour que les histwrite y aient accès:
      CALL set_itau_iophy(itau_w)
+
+    ! ug OMP en chantier...
+    !IF(is_using_mpi .AND. .NOT. is_mpi_root) THEN
+       ! vars_defined=.TRUE.
+    !END IF
+
     IF(.NOT.vars_defined) THEN
         iinitend = 2
@@ -88,4 +101,9 @@
 ! ug la boucle qui suit ne sert qu'une fois, pour l'initialisation, sinon il n'y a toujours qu'un seul passage:
 DO iinit=1, iinitend
+#ifdef CPP_XIOS
+IF (vars_defined) THEN
+     CALL wxios_update_calendar(itau_w)
+END IF
+#endif
 ! On procède à l'écriture ou à la définition des nombreuses variables:
 !!! Champs 1D !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -993,4 +1011,8 @@
                 ENDIF ! clef_files
             ENDDO !  iff
+#ifdef CPP_XIOS
+            !On finalise l'initialisation:
+            CALL wxios_closedef()
+#endif
 !$OMP END MASTER
 !$OMP BARRIER
