!--------------------------------------------------------------------------
! Version 1.0
! Date 05/23/2003
! Author: Sara Fletcher
!---------------------------------------------------------------------------

! $Log: write_nc_diag_0D.F
! Revision 1.0 05/23/2003
! This program wites some diagnositics for the calculation of ocean basis 
! functions
!---------------------------------------------------------------------------
!
!Name: write_nc_diag_0D.F
!
! INPUT:
!       group=group code (ex: IPSL)
!       production= production (model and version ex: OPA 8.1)
!       run= Timedep or Stationary
!       nrec=number of records
!       time=time expressed as decimal years
!       ndyetrac= number of dye tracers
!       global_tot_dye=global total dye flux for this year for each tracer (mol)
!       global_cum_dye=global cumulative dye flux for each tracer (mol)
!       global_mean_conc= global mead dye concentration (mol/m-3)
!       
! OUTPUT FILE: 
!        A netcdf file (clobbered if it exists) with the filename  
!        group_run_Diag_0D.nc
!
!-----------------------------------------------------------------------------

      SUBROUTINE write_nc_diag_0D(group,production,run,nrec,time, 
     .          ndyetrac,global_tot_dye,global_cum_dye,global_mean_conc)

! No implicit declarations
      IMPLICIT NONE       

! Arguments
      CHARACTER*(*) group        
      CHARACTER*(*) production       
      CHARACTER*(*) run
      INTEGER nrec
      REAL time (nrec)
      INTEGER ndyetrac
      REAL global_tot_dye(ndyetrac,nrec)
      REAL global_cum_dye(ndyetrac,nrec)
      REAL global_mean_conc(ndyetrac,nrec)

! Constants
        REAL missing_value
        PARAMETER (missing_value=-1.E+34)

! Local variables
        CHARACTER*256 string256, filename

! NetCDF variables
#include "netcdf.inc"
        INTEGER NC_ID
        INTEGER STATUS
        INTEGER TIME_DIM,TIME_ID
        INTEGER DYE_DIM, DYE_ID
        INTEGER DIMS_2D(2), TWO_DIM
        INTEGER TOT_ID, CUM_ID, MEAN_ID

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Build the NetCDF filename
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        filename=group//'_'//run//
     &  '_diag_0D.nc'

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Open the NetCDF file
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_CREATE(filename,NF_CLOBBER,NC_ID)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Define dimensions
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_DEF_DIM(NC_ID,'time',nrec,TIME_DIM)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        STATUS=NF_DEF_DIM(NC_ID,'dye',ndyetrac,DYE_DIM)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Define variables
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_DEF_VAR(NC_ID,'time',NF_FLOAT,
     &  1,TIME_DIM,TIME_ID)
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        DIMS_2D(1)=DYE_DIM
        DIMS_2D(2)=TIME_DIM
        STATUS=NF_DEF_VAR(NC_ID,'global_tot_dye', NF_FLOAT, 2,
     .         DIMS_2D, TOT_ID)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_DEF_VAR(NC_ID,'global_cum_dye', NF_FLOAT, 2,
     .         DIMS_2D, CUM_ID)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_DEF_VAR(NC_ID,'global_mean_conc', NF_FLOAT, 2,
     .         DIMS_2D, MEAN_ID)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Define global attributes
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        string256='$RCSfile: write_nc_diag_0D.F,v $ '
     &           //'$Revision: 1.0 $'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,
     &  'output_routine',LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------
        string256='GDT 1.2'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'Conventions',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------
        string256=filename
        STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'file_name',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)
!---------------------------------------------------------
        string256='Ocean Inversion'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'project',
     &  LEN_TRIM(string256),string256)
        
!---------------------------------------------------------
        string256='Institution'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'institution',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------
        string256=production
        STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'production',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Define variable attributes
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        string256='year'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,TIME_ID,'long_name',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        string256='calendar_year as %Y.%f'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,TIME_ID,'units',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------
        string256='Global total dye flux'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,TOT_ID,'long_name',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        string256='mol'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,TOT_ID,'units',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        STATUS=NF_PUT_ATT_REAL(NC_ID,TOT_ID,'missing_value',
     &  NF_FLOAT,1,missing_value)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------

        string256='Global cumulative dye flux'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,CUM_ID,'long_name',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        string256='mol'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,CUM_ID,'units',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        STATUS=NF_PUT_ATT_REAL(NC_ID,CUM_ID,'missing_value',
     &  NF_FLOAT,1,missing_value)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------

        string256='Global mean dye concentration'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,MEAN_ID,'long_name',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        string256='mol/cm3'
        STATUS=NF_PUT_ATT_TEXT(NC_ID,MEAN_ID,'units',
     &  LEN_TRIM(string256),string256)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        STATUS=NF_PUT_ATT_REAL(NC_ID,MEAN_ID,'missing_value',
     &  NF_FLOAT,1,missing_value)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! End of define mode
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_ENDDEF(NC_ID)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Write data to file
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_PUT_VAR_REAL(NC_ID,TIME_ID,time)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------
        STATUS=NF_PUT_VAR_REAL(NC_ID,TOT_ID,global_tot_dye)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------
        STATUS=NF_PUT_VAR_REAL(NC_ID,CUM_ID,global_cum_dye)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!---------------------------------------------------------
        STATUS=NF_PUT_VAR_REAL(NC_ID,MEAN_ID,global_mean_conc)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Close the NetCDF file
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        STATUS=NF_CLOSE(NC_ID)
        IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS)

        END

