c_ --------------------------------------------------------------------- c_ RCS lines preceded by "c_ " c_ --------------------------------------------------------------------- c_ c_ $Source: /www/html/ipsl/OCMIP/phase2/simulations/CFC/distrib/RCS/write_nc_CFC_year.f,v $ c_ $Revision: 2.2 $ c_ $Date: 1999/10/19 12:25:41 $ ; $State: Exp $ c_ $Author: jomce $ ; $Locker: $ c_ c_ --------------------------------------------------------------------- c_ $Log: write_nc_CFC_year.f,v $ c_ Revision 2.2 1999/10/19 12:25:41 jomce c_ Delete some associate attributes (no longer needed for GAP) c_ Added string to identify RCS filename and revision c_ c_ Revision 2.1 1999/04/29 11:48:28 orr c_ Now GDT 1.2 compatible!! c_ Added argument "production" c_ Deleted arguments lon,bounds_lon,lat,bounds_lat,depth,bounds_depth . c_ c_ Revision 1.5 1998/10/29 10:37:03 brocksce c_ Change write of time and bounds_time arrays to avoid unreset c_ values with some compilers (?!). c_ c_ Revision 1.4 1998/09/10 09:21:31 brocksce c_ Add missing value attribute for all variables. c_ c_ Revision 1.3 1998/08/28 15:23:56 brocksce c_ Declaration error on bounds_depth(2,kmt) instead of bounds_depth(kmt,2). c_ c_ Revision 1.2 1998/08/26 12:14:11 brocksce c_ Fixed convention error on two-dimensional bound arrays c_ (confusion between C and FORTRAN notations). c_ c_ Revision 1.1 1998/07/21 16:55:54 jomce c_ Initial revision c_ c_ --------------------------------------------------------------------- c_ C*********************************************************************** C C NAME: WRITE_NC_CFC_year C C INPUT: C group= group code (ex: IPSL) C production= production (model and version ex: OPA 8.1) C imt= dimension C jmt= dimension C kmt= dimension C year= year of simulation [years] C nb_seconds_per_year= following your model year [s] C nb_timesteps_per_year= following your model timestep C C CFC11= monthly tracer distributions of CFC-11 [mol/m^3] C CFC12= monthly tracer distributions of CFC-12 [mol/m^3] C MF_CFC11= monthly mean flux of CFC-11 [mol/(m^2*s)] C MF_CFC12= monthly mean flux of CFC-12 [mol/(m^2*s)] C CF_CFC11= annual cumulative flux of CFC-11 [mol/m^2] C CF_CFC12= annual cumulative flux of CFC-12 [mol/m^2] C C OUTPUT FILE: C A netcdf file (clobbed if exists) with C the filename group_CFC_year.nc C C*********************************************************************** SUBROUTINE WRITE_NC_CFC_year( & group,production, & imt,jmt,kmt, & year,nb_seconds_per_year,nb_timesteps_per_year, & CFC11,CFC12, & MF_CFC11,MF_CFC12,CF_CFC11,CF_CFC12) C No implicit declarations IMPLICIT NONE C Arguments CHARACTER*(*) group CHARACTER*(*) production INTEGER*4 imt,jmt,kmt INTEGER*4 year INTEGER*4 nb_seconds_per_year INTEGER*4 nb_timesteps_per_year REAL*4 time1(12) REAL*4 time2 REAL*4 CFC11(imt,jmt,kmt,12) REAL*4 CFC12(imt,jmt,kmt,12) REAL*4 MF_CFC11(imt,jmt,12) REAL*4 MF_CFC12(imt,jmt,12) REAL*4 CF_CFC11(imt,jmt) REAL*4 CF_CFC12(imt,jmt) C Constants REAL*4 missing_value PARAMETER (missing_value=-1.E+34) C Local variables CHARACTER*256 string256,filename CHARACTER*4 string4 INTEGER*4 I C Function INTEGER*4 LEN_TRIM C NetCDF variables INCLUDE 'netcdf.inc' INTEGER*4 NC_ID INTEGER*4 STATUS INTEGER*4 LON_DIM INTEGER*4 LAT_DIM INTEGER*4 DEPTH_DIM INTEGER*4 TIME1_DIM,TIME1_ID INTEGER*4 TIME2_DIM,TIME2_ID INTEGER*4 CFC11_ID,CFC12_ID INTEGER*4 MF_CFC11_ID,MF_CFC12_ID INTEGER*4 CF_CFC11_ID,CF_CFC12_ID INTEGER*4 DIMS_3D(3) INTEGER*4 DIMS_4D(4) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Build the NetCDF filename C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ WRITE(string4,'(I4.4)') year filename=group//'_CFC_'//string4//'.nc' C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Open the NetCDF file C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STATUS=NF_CREATE(filename,NF_CLOBBER,NC_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Define dimensions C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STATUS=NF_DEF_DIM(NC_ID,'x',imt,LON_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_DEF_DIM(NC_ID,'y',jmt,LAT_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_DEF_DIM(NC_ID,'depth',kmt,DEPTH_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_DEF_DIM(NC_ID,'time1',12,TIME1_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_DEF_DIM(NC_ID,'time2',1,TIME2_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Define variables C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STATUS=NF_DEF_VAR(NC_ID,'time1',NF_FLOAT, & 1,TIME1_DIM,TIME1_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'time2',NF_FLOAT, & 1,TIME2_DIM,TIME2_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- DIMS_4D(1)=LON_DIM DIMS_4D(2)=LAT_DIM DIMS_4D(3)=DEPTH_DIM DIMS_4D(4)=TIME1_DIM STATUS=NF_DEF_VAR(NC_ID,'CFC11',NF_FLOAT, & 4,DIMS_4D,CFC11_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'CFC12',NF_FLOAT, & 4,DIMS_4D,CFC12_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- DIMS_3D(1)=LON_DIM DIMS_3D(2)=LAT_DIM DIMS_3D(3)=TIME1_DIM STATUS=NF_DEF_VAR(NC_ID,'MF_CFC11',NF_FLOAT, & 3,DIMS_3D,MF_CFC11_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'MF_CFC12',NF_FLOAT, & 3,DIMS_3D,MF_CFC12_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- DIMS_3D(1)=LON_DIM DIMS_3D(2)=LAT_DIM DIMS_3D(3)=TIME2_DIM STATUS=NF_DEF_VAR(NC_ID,'CF_CFC11',NF_FLOAT, & 3,DIMS_3D,CF_CFC11_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'CF_CFC12',NF_FLOAT, & 3,DIMS_3D,CF_CFC12_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Define global attributes C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ string256='$RCSfile: write_nc_CFC_year.f,v $' & //'$Revision: 2.2 $' STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL, & 'output_routine',LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- 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) C--------------------------------------------------------- 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) C--------------------------------------------------------- string256=group//'_grid.nc' STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'associate_file', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='OCMIP' STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'project', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256=group STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'institution', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- 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) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Define variable attributes C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ string256='year and seasonal phase' STATUS=NF_PUT_ATT_TEXT(NC_ID,TIME1_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='calendar_month as %Y%m.%f' STATUS=NF_PUT_ATT_TEXT(NC_ID,TIME1_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_INT(NC_ID,TIME1_ID,'nb_seconds_per_year', & NF_INT,1,nb_seconds_per_year) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_INT(NC_ID,TIME1_ID,'nb_timesteps_per_year', & NF_INT,1,nb_timesteps_per_year) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='year' STATUS=NF_PUT_ATT_TEXT(NC_ID,TIME2_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='calendar_year as %Y' STATUS=NF_PUT_ATT_TEXT(NC_ID,TIME2_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_INT(NC_ID,TIME2_ID,'nb_seconds_per_year', & NF_INT,1,nb_seconds_per_year) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_INT(NC_ID,TIME2_ID,'nb_timesteps_per_year', & NF_INT,1,nb_timesteps_per_year) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='CFC-11' STATUS=NF_PUT_ATT_TEXT(NC_ID,CFC11_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='mol/m^3' STATUS=NF_PUT_ATT_TEXT(NC_ID,CFC11_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,CFC11_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='CFC-12' STATUS=NF_PUT_ATT_TEXT(NC_ID,CFC12_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='mol/m^3' STATUS=NF_PUT_ATT_TEXT(NC_ID,CFC12_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,CFC12_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='Mean Flux of CFC-11 from air to sea' STATUS=NF_PUT_ATT_TEXT(NC_ID,MF_CFC11_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='mol/(m^2*s)' STATUS=NF_PUT_ATT_TEXT(NC_ID,MF_CFC11_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,MF_CFC11_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='Mean Flux of CFC-12 from air to sea' STATUS=NF_PUT_ATT_TEXT(NC_ID,MF_CFC12_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='mol/(m^2*s)' STATUS=NF_PUT_ATT_TEXT(NC_ID,MF_CFC12_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,MF_CFC12_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='Cumulative Flux of CFC-11 from air to sea' STATUS=NF_PUT_ATT_TEXT(NC_ID,CF_CFC11_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='mol/m^2' STATUS=NF_PUT_ATT_TEXT(NC_ID,CF_CFC11_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,CF_CFC11_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- string256='Cumulative Flux of CFC-12 from air to sea' STATUS=NF_PUT_ATT_TEXT(NC_ID,CF_CFC12_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='mol/m^2' STATUS=NF_PUT_ATT_TEXT(NC_ID,CF_CFC12_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,CF_CFC12_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C End of define mode C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STATUS=NF_ENDDEF(NC_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Write data to file C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DO I=1,12 time1(I)=year*100. +I - 0.5 ENDDO STATUS=NF_PUT_VAR_REAL(NC_ID,TIME1_ID,time1) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- time2=REAL(year) STATUS=NF_PUT_VAR_REAL(NC_ID,TIME2_ID,time2) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_PUT_VAR_REAL(NC_ID,CFC11_ID,CFC11) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_PUT_VAR_REAL(NC_ID,CFC12_ID,CFC12) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_PUT_VAR_REAL(NC_ID,MF_CFC11_ID,MF_CFC11) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_PUT_VAR_REAL(NC_ID,MF_CFC12_ID,MF_CFC12) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_PUT_VAR_REAL(NC_ID,CF_CFC11_ID,CF_CFC11) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C--------------------------------------------------------- STATUS=NF_PUT_VAR_REAL(NC_ID,CF_CFC12_ID,CF_CFC12) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C Close the NetCDF file C~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STATUS=NF_CLOSE(NC_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) END