Index: trunk/LMDZ.GENERIC/README
===================================================================
--- trunk/LMDZ.GENERIC/README	(revision 861)
+++ trunk/LMDZ.GENERIC/README	(revision 862)
@@ -858,2 +858,7 @@
 - Fixed a small bug in a diagnostic in the end of calc_rayleigh. Some picky compilers complain.
 - Fixed a small bug with the array noms which is not allocated when tracer is false. But still need in physdem1.
+
+== 10/01/2013 == AS
+Added calls to FH subroutines to output physical fields in parallel. This is under precompiling flags CPP_PARA.
+This allows for LMDZ.UNIVERSAL users to use writediagfi with parallel computations.
+These lines are not compiled by casual users of LMDZ.GENERIC (or users of LMDZ.UNIVERSAL in sequential mode).
Index: trunk/LMDZ.GENERIC/libf/phystd/physiq.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/physiq.F90	(revision 861)
+++ trunk/LMDZ.GENERIC/libf/phystd/physiq.F90	(revision 862)
@@ -1856,4 +1856,8 @@
         IF ( ALLOCATED(coslon)) DEALLOCATE(coslon)
 
+#ifdef CPP_PARA
+        ! close diagfi.nc in parallel
+           call iotd_fin
+#endif
 
       endif
Index: trunk/LMDZ.GENERIC/libf/phystd/writediagfi.F
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/writediagfi.F	(revision 861)
+++ trunk/LMDZ.GENERIC/libf/phystd/writediagfi.F	(revision 862)
@@ -97,4 +97,6 @@
       logical,save :: firstcall=.true.
 
+      integer dimvert
+
 !***************************************************************
 !Sortie des variables au rythme voulu
@@ -108,5 +110,4 @@
 !***************************************************************
 
-#ifndef NOWRITEDIAGFI
 
 ! At very first call, check if there is a "diagfi.def" to use and read it
@@ -150,4 +151,5 @@
       end if
 
+
 ! Initialisation of 'firstnom' and create/open the "diagfi.nc" NetCDF file
 ! ------------------------------------------------------------------------
@@ -165,4 +167,10 @@
          endif
 
+         zitau = -1 ! initialize zitau
+
+#ifdef CPP_PARA
+         !! parallel: we cannot use the usual writediagfi method
+         call iophys_ini
+#else
          ! Create the NetCDF file
          ierr = NF_CREATE(fichnom, NF_CLOBBER, nid)
@@ -187,9 +195,9 @@
          call gr_fi_dyn(1,ngrid,iip1,jjp1,phisfi,phis)
          call iniwrite(nid,day_ini,phis)
-         
-         zitau = -1 ! initialize zitau
+
       else
          ! Open the NetCDF file
          ierr = NF_OPEN(fichnom,NF_WRITE,nid)
+#endif
       endif ! if (firstnom.eq.'1234567890')
 
@@ -214,4 +222,14 @@
 
       if ( MOD(zitau+1,irythme) .eq.0.) then
+
+#ifdef CPP_PARA
+         !! parallel: we cannot use the usual writediagfi method
+         if (dim .eq. 2) then
+             dimvert = 1
+         else if (dim == 3) then
+             dimvert = llm
+         endif
+         call iophys_ecrit(nom,dimvert,titre,unite,px)
+#else
 
 ! Compute/write/extend 'Time' coordinate (date given in days)
@@ -444,9 +462,10 @@
 
         endif ! of if (dim.eq.3) elseif(dim.eq.2)...
+#endif
 
       endif ! of if ( MOD(zitau+1,irythme) .eq.0.)
 
+#ifndef CPP_PARA
       ierr= NF_CLOSE(nid)
-
 #endif
 
Index: trunk/LMDZ.UNIVERSAL/README.aymeric
===================================================================
--- trunk/LMDZ.UNIVERSAL/README.aymeric	(revision 861)
+++ trunk/LMDZ.UNIVERSAL/README.aymeric	(revision 862)
@@ -32,6 +32,6 @@
 
 
-makelmdz_fcm -d 64x48x20 -arch CICLADifort -parallel mpi -p generic -debug -cpp NOWRITEDIAGFI gcm
-makelmdz_fcm -d 64x48x20 -arch CICLADifort -parallel mpi -p generic -cpp NOWRITEDIAGFI gcm
+makelmdz_fcm -d 64x48x20 -arch CICLADifort -parallel mpi -p generic -debug gcm
+makelmdz_fcm -d 64x48x20 -arch CICLADifort -parallel mpi -p generic gcm
 
 
@@ -39,5 +39,5 @@
 makegcm -d 64x48x20 -t 2 gcm
 
-makelmdz_fcm -d 128x96x20 -arch GNOMEp -parallel mpi -p generic -cpp NOWRITEDIAGFI gcm
+makelmdz_fcm -d 128x96x20 -arch GNOMEp -parallel mpi -p generic gcm
 
 
Index: trunk/LMDZ.UNIVERSAL/libf/phygeneric/iophys.F90
===================================================================
--- trunk/LMDZ.UNIVERSAL/libf/phygeneric/iophys.F90	(revision 862)
+++ trunk/LMDZ.UNIVERSAL/libf/phygeneric/iophys.F90	(revision 862)
@@ -0,0 +1,111 @@
+      subroutine iophys_ecrit(nom,lllm,titre,unite,px)
+      USE dimphy
+      USE mod_phys_lmdz_para
+      USE mod_grid_phy_lmdz
+      IMPLICIT NONE
+
+!!
+!! Provided by Frederic Hourdin 01/2013
+!!
+
+
+!  Ecriture de variables diagnostiques au choix dans la physique 
+!  dans un fichier NetCDF nomme  'diagfi'. Ces variables peuvent etre
+!  3d (ex : temperature), 2d (ex : temperature de surface), ou
+!  0d (pour un scalaire qui ne depend que du temps : ex : la longitude
+!  solaire)
+!  (ou encore 1d, dans le cas de testphys1d, pour sortir une colonne)
+!  La periode d'ecriture est donnee par 
+!  "ecritphy " regle dans le fichier de controle de run :  run.def
+!
+!    writediagfi peut etre appele de n'importe quelle subroutine
+!    de la physique, plusieurs fois. L'initialisation et la creation du
+!    fichier se fait au tout premier appel.
+!
+! WARNING : les variables dynamique (u,v,t,q,ps)
+!  sauvees par writediagfi avec une
+! date donnee sont legerement differentes que dans le fichier histoire car 
+! on ne leur a pas encore ajoute de la dissipation et de la physique !!!
+! IL est  RECOMMANDE d'ajouter les tendance physique a ces variables
+! avant l'ecriture dans diagfi (cf. physiq.F)
+!  
+! Modifs: Aug.2010 Ehouarn: enforce outputs to be real*4
+!
+!  parametres (input) :
+!  ----------
+!      unit : unite logique du fichier de sortie (toujours la meme)
+!      nom  : nom de la variable a sortir (chaine de caracteres)
+!      titre: titre de la variable (chaine de caracteres)
+!      unite : unite de la variable (chaine de caracteres)
+!      px : variable a sortir (real 0, 1, 2, ou 3d)
+!
+!=================================================================
+
+#include "dimensions.h"
+#include "paramet.h"
+#include "netcdf.inc"
+#include "iotd.h"
+
+
+! Arguments on input:
+      integer lllm
+      character (len=*) :: nom,titre,unite
+      integer imjmax
+      parameter (imjmax=100000)
+      real px(klon_omp,lllm)
+      real xglo(klon_glo,lllm)
+      real zx(iim,jjp1,lllm)
+
+
+      CALL Gather(px,xglo)
+!$OMP MASTER
+      IF (is_mpi_root) THEN       
+        CALL Grid1Dto2D_glo(xglo,zx)
+        call iotd_ecrit(nom,lllm,titre,unite,zx) !! AS: correction. this must be in the loop.
+      ENDIF
+!$OMP END MASTER
+
+      return
+      end
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      SUBROUTINE iophys_ini
+      USE mod_phys_lmdz_para
+
+      IMPLICIT NONE
+
+!=======================================================================
+!
+!   Auteur:  L. Fairhead  ,  P. Le Van, Y. Wanherdrick, F. Forget
+!   -------
+!
+!   Objet:
+!   ------
+!
+!   'Initialize' the diagfi.nc file: write down dimensions as well
+!   as time-independent fields (e.g: geopotential, mesh area, ...)
+!
+!=======================================================================
+!-----------------------------------------------------------------------
+!   Declarations:
+!   -------------
+
+#include "dimensions.h"
+#include "paramet.h"
+#include "comgeom.h"
+#include "comvert.h"
+
+real pi
+
+!   Arguments:
+!   ----------
+
+!$OMP MASTER
+    IF (is_mpi_root) THEN       
+pi=2.*asin(1.)
+call iotd_ini('diagfi.nc ', &
+iim,jjp1,llm,rlonv(1:iim)*180./pi,rlatu*180./pi,presnivs)
+    ENDIF
+!$OMP END MASTER
+
+      END
Index: trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd.h
===================================================================
--- trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd.h	(revision 862)
+++ trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd.h	(revision 862)
@@ -0,0 +1,5 @@
+      integer imax,jmax,lmax,nid
+      INTEGER dim_coord(4)
+      real iotd_ts
+
+      common/ecritd_c/imax,jmax,lmax,nid,dim_coord,iotd_ts
Index: trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_ecrit.F90
===================================================================
--- trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_ecrit.F90	(revision 862)
+++ trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_ecrit.F90	(revision 862)
@@ -0,0 +1,199 @@
+      subroutine iotd_ecrit(nom,llm,titre,unite,px)
+
+!!
+!! Provided by Frederic Hourdin 01/2013
+!!
+
+
+
+
+!  Ecriture de variables diagnostiques au choix dans la physique 
+!  dans un fichier NetCDF nomme  'diagfi'. Ces variables peuvent etre
+!  3d (ex : temperature), 2d (ex : temperature de surface), ou
+!  0d (pour un scalaire qui ne depend que du temps : ex : la longitude
+!  solaire)
+!  (ou encore 1d, dans le cas de testphys1d, pour sortir une colonne)
+!  La periode d'ecriture est donnee par 
+!  "ecritphy " regle dans le fichier de controle de run :  run.def
+!
+!    writediagfi peut etre appele de n'importe quelle subroutine
+!    de la physique, plusieurs fois. L'initialisation et la creation du
+!    fichier se fait au tout premier appel.
+!
+! WARNING : les variables dynamique (u,v,t,q,ps)
+!  sauvees par writediagfi avec une
+! date donnee sont legerement differentes que dans le fichier histoire car 
+! on ne leur a pas encore ajoute de la dissipation et de la physique !!!
+! IL est  RECOMMANDE d'ajouter les tendance physique a ces variables
+! avant l'ecriture dans diagfi (cf. physiq.F)
+!  
+! Modifs: Aug.2010 Ehouarn: enforce outputs to be real*4
+!
+!  parametres (input) :
+!  ----------
+!      unit : unite logique du fichier de sortie (toujours la meme)
+!      nom  : nom de la variable a sortir (chaine de caracteres)
+!      titre: titre de la variable (chaine de caracteres)
+!      unite : unite de la variable (chaine de caracteres)
+!      px : variable a sortir (real 0, 1, 2, ou 3d)
+!
+!=================================================================
+ 
+      implicit none
+
+! Commons
+
+#include "netcdf.inc"
+#include "iotd.h"
+
+
+! Arguments on input:
+      integer llm
+      character (len=*) :: nom,titre,unite
+      integer imjmax
+      parameter (imjmax=100000)
+      real px(imjmax*llm)
+
+! Local variables:
+
+      real*4 date
+      real*4 zx(imjmax*llm)
+
+
+      integer ierr,ndim,dim_cc(4)
+      integer iq
+      integer i,j,l
+
+      integer zitau
+      character firstnom*20
+      SAVE firstnom
+      SAVE zitau
+      SAVE date
+      data firstnom /'1234567890'/
+      data zitau /0/
+
+! Ajouts
+      integer, save :: ntime=0
+      integer :: idim,varid
+      character (len =50):: fichnom
+      integer, dimension(4) :: id
+      integer, dimension(4) :: edges,corner
+      
+
+!***************************************************************
+! Initialisation of 'firstnom' and create/open the "diagfi.nc" NetCDF file
+! ------------------------------------------------------------------------
+! (Au tout premier appel de la subroutine durant le run.)
+
+
+!--------------------------------------------------------
+! Write the variables to output file if it's time to do so
+!--------------------------------------------------------
+
+
+! Compute/write/extend 'Time' coordinate (date given in days)
+! (done every "first call" (at given time level) to writediagfi)
+! Note: date is incremented as 1 step ahead of physics time
+!--------------------------------------------------------
+
+        zx(1:imax*jmax*llm)=px(1:imax*jmax*llm)
+        if (firstnom =='1234567890') then
+            firstnom=nom
+        endif
+
+!      print*,'nom ',nom,firstnom
+
+!! Quand on tombe sur la premiere variable on ajoute un pas de temps
+        if (nom.eq.firstnom) then
+        ! We have identified a "first call" (at given date)
+
+           ntime=ntime+1 ! increment # of stored time steps
+
+!!          print*,'ntime ',ntime
+           date=ntime
+!          date= float (zitau +1)/float (day_step)
+
+           ! compute corresponding date (in days and fractions thereof)
+           ! Get NetCDF ID of 'Time' variable
+
+           ierr=NF_SYNC(nid)
+
+           ierr= NF_INQ_VARID(nid,"Time",varid)
+           ! Write (append) the new date to the 'Time' array
+
+
+           ierr= NF_PUT_VARA_REAL(nid,varid,ntime,1,date)
+
+        !  print*,'date ',date,ierr,nid
+        !print*,'IOTD Date ,varid,nid,ntime,date',varid,nid,ntime,date
+
+           if (ierr.ne.NF_NOERR) then
+              write(*,*) "***** PUT_VAR matter in writediagfi_nc"
+              write(*,*) "***** with time"
+              write(*,*) 'ierr=', ierr   
+              stop
+           endif
+
+!          write(6,*)'WRITEDIAGFI: date= ', date
+        end if ! of if (nom.eq.firstnom)
+
+
+!Case of a 3D variable
+!---------------------
+        if (llm==lmax) then
+           ndim=4
+           corner(1)=1
+           corner(2)=1
+           corner(3)=1
+           corner(4)=ntime
+           edges(1)=imax
+           edges(2)=jmax
+           edges(3)=llm
+           edges(4)=1
+           dim_cc=dim_coord
+
+
+!Case of a 2D variable
+!---------------------
+
+        else if (llm==1) then
+           ndim=3
+           corner(1)=1
+           corner(2)=1
+           corner(3)=ntime
+           corner(4)=1
+           edges(1)=imax
+           edges(2)=jmax
+           edges(3)=1
+           edges(4)=1
+           dim_cc(1:2)=dim_coord(1:2)
+           dim_cc(3)=dim_coord(4)
+
+        endif ! of if llm=1 ou llm
+
+! AU premier pas de temps, on crée les variables
+!-----------------------------------------------
+
+      if (ntime==1) then
+          ierr = NF_REDEF (nid)
+          ierr = NF_DEF_VAR(nid,nom,NF_FLOAT,ndim,dim_cc,varid)
+          print*,'DEF ',nom,nid,varid
+          ierr = NF_ENDDEF(nid)
+      else
+         ierr= NF_INQ_VARID(nid,nom,varid)
+          print*,'INQ ',nom,nid,varid
+! Commandes pour recuperer automatiquement les coordonnees
+!             ierr= NF_INQ_DIMID(nid,"longitude",id(1))
+      endif
+
+
+      ierr= NF_PUT_VARA_REAL(nid,varid,corner,edges,zx)
+
+      if (ierr.ne.NF_NOERR) then
+           write(*,*) "***** PUT_VAR problem in writediagfi"
+           write(*,*) "***** with ",nom
+           write(*,*) 'ierr=', ierr
+      endif 
+
+
+      end
Index: trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_fin.F90
===================================================================
--- trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_fin.F90	(revision 862)
+++ trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_fin.F90	(revision 862)
@@ -0,0 +1,35 @@
+      SUBROUTINE iotd_fin
+      IMPLICIT NONE
+
+!!
+!! Provided by Frederic Hourdin 01/2013
+!!
+
+
+
+!=======================================================================
+!
+!   Auteur:  L. Fairhead  ,  P. Le Van, Y. Wanherdrick, F. Forget
+!   -------
+!
+!   Objet:
+!   ------
+!
+!   'Initialize' the diagfi.nc file: write down dimensions as well
+!   as time-independent fields (e.g: geopotential, mesh area, ...)
+!
+!=======================================================================
+!-----------------------------------------------------------------------
+!   Declarations:
+!   -------------
+
+#include "netcdf.inc"
+#include "iotd.h"
+      integer ierr
+
+!   Arguments:
+!   ----------
+
+      ierr=NF_close(nid)
+
+      END
Index: trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_ini.F90
===================================================================
--- trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_ini.F90	(revision 862)
+++ trunk/LMDZ.UNIVERSAL/libf/phygeneric/iotd_ini.F90	(revision 862)
@@ -0,0 +1,123 @@
+      SUBROUTINE iotd_ini(fichnom,iim,jjm,llm,prlonv,prlatu,pcoordv)
+      IMPLICIT NONE
+
+!!
+!! Provided by Frederic Hourdin 01/2013
+!!
+
+!=======================================================================
+!
+!   Auteur:  L. Fairhead  ,  P. Le Van, Y. Wanherdrick, F. Forget
+!   -------
+!
+!   Objet:
+!   ------
+!
+!   'Initialize' the diagfi.nc file: write down dimensions as well
+!   as time-independent fields (e.g: geopotential, mesh area, ...)
+!
+!=======================================================================
+!-----------------------------------------------------------------------
+!   Declarations:
+!   -------------
+
+#include "netcdf.inc"
+#include "iotd.h"
+
+!   Arguments:
+!   ----------
+
+      integer iim,jjm,llm
+      real prlonv(iim),prlatu(jjm),pcoordv(llm),timestep
+      INTEGER id_FOCE
+
+      integer corner(4),edges(4),ndim
+      real  px(1000)
+      character (len=10) :: nom
+
+!   Local:
+!   ------
+      INTEGER ierr
+
+      integer :: nvarid
+      integer, dimension(2) :: id  
+      integer :: varid
+
+      character*10 fichnom
+      real*4 rlonv(iim),rlatu(jjm),coordv(llm)
+
+      real pi
+
+      print*,'INIIO prlonv ',prlonv
+      imax=iim
+      jmax=jjm
+      lmax=llm
+
+      rlonv=prlonv
+      rlatu=prlatu
+      coordv=pcoordv
+
+!-----------------------------------------------------------------------
+
+
+      pi=2.*asin(1.)
+
+! Define dimensions
+    
+         ! Create the NetCDF file
+         ierr=NF_CREATE(fichnom, NF_CLOBBER, nid)
+         ! Define the 'Time' dimension
+         ierr=nf_def_dim(nid,"Time",NF_UNLIMITED,dim_coord(4))
+         ! Define the 'Time' variable
+         ierr=NF_DEF_VAR(nid, "Time", NF_FLOAT, 1, dim_coord(4),varid)
+!        ! Add a long_name attribute
+!        ierr=NF_PUT_ATT_TEXT(nid, varid, "long_name",4,"Time")
+!        ! Add a units attribute
+         ierr=NF_PUT_ATT_TEXT(nid, varid,'units',29,"days since 0000-00-0 00:00:00")
+         ! Switch out of NetCDF Define mode
+
+      ierr=NF_DEF_DIM(nid, "longitude", iim, dim_coord(1))
+      ierr=NF_DEF_DIM(nid, "latitude", jjm, dim_coord(2))
+      ierr=NF_DEF_DIM(nid, "altitude", llm, dim_coord(3))
+
+
+      ierr=NF_ENDDEF(nid)
+
+!
+!  Contol parameters for this run
+! --------------------------
+
+      ierr=NF_REDEF(nid)
+      ierr=NF_DEF_VAR(nid,"longitude", NF_FLOAT, 1, dim_coord(1),nvarid)
+!     ierr=NF_PUT_ATT_TEXT(nid,nvarid,"long_name", 14,
+!    .      "East longitude")
+!     ierr=NF_PUT_ATT_TEXT(nid,nvarid,'units',12,"degrees_east")
+      ierr=NF_ENDDEF(nid)
+      ierr=NF_PUT_VAR_REAL(nid,nvarid,rlonv)
+       print*,ierr
+
+! --------------------------
+      ierr=NF_REDEF(nid)
+      ierr=NF_DEF_VAR(nid, "latitude", NF_FLOAT, 1, dim_coord(2),nvarid)
+!     ierr=NF_PUT_ATT_TEXT(nid,nvarid,'units',13,"degrees_north")
+!     ierr=NF_PUT_ATT_TEXT(nid,nvarid,"long_name", 14,"North latitude")
+      ierr=NF_ENDDEF(nid)
+      ierr=NF_PUT_VAR_REAL(nid,nvarid,rlatu)
+!
+! --------------------------
+      ierr=NF_REDEF(nid)
+      ierr=NF_DEF_VAR(nid, "altitude", NF_FLOAT, 1,dim_coord(3),nvarid)
+      ierr=NF_PUT_ATT_TEXT(nid,nvarid,"long_name",10,"pseudo-alt")
+!     ierr=NF_PUT_ATT_TEXT(nid,nvarid,'units',2,"km")
+      if ( pcoordv(2)>pcoordv(1) ) then
+         ierr=NF_PUT_ATT_TEXT(nid,nvarid,"long_name",10,"pseudo-alt")
+         ierr=NF_PUT_ATT_TEXT(nid,nvarid,'positive',2,"up")
+      else
+         ierr=NF_PUT_ATT_TEXT(nid,nvarid,"long_name",8,"pressure")
+         ierr = NF_PUT_ATT_TEXT (nid,nvarid,'positive',4,"down")
+      endif
+      ierr=NF_ENDDEF(nid)
+
+      ierr=NF_PUT_VAR_REAL(nid,nvarid,coordv)
+!
+      END
