!_ --------------------------------------------------------------------- !_ RCS lines preceded by "c_ " !_ --------------------------------------------------------------------- !_ !_ $Revision: 1.1 $ !_ $Date: 2003/10/21 06:21:52 $ ; $State: Exp $ !_ $Author: dimitri $ ; $Locker: $ !_ $Revised for use in Ocean inversion project by sfletcher !_ !_ --------------------------------------------------------------------- !_ $Log: write_nc_basisfnctns.F,v $ !_ Revision 1.1 2003/10/21 06:21:52 dimitri !_ added netcdf output files !_ !_ Revision 1.1 1999/11/18 17:20:23 rdslater !_ Initial conversion of OCMIP-2 routines. !_ !_Revision1.5 2003/2/12 sfletcher !_corrected for some errors !_ !_ Revision 1.4 2003/2/12 sfletcher !_Modified to write dye tracers for ocean inversion !_ !_ Revision 1.3 1999/10/19 10:36:44 jomce !_ Split RCS file and revision indicator across two lines (< 72 chars) !_ !_ Revision 1.2 1999/10/19 09:46:26 jomce !_ Added "a" to end of filename (root) to identify annual files (nt=1) !_ Added string to identify RCS filename and revision !_ !_ Revision 1.1 1999/10/04 12:38:48 orr !_ Initial revision !_ !_ --------------------------------------------------------------------- !_ !*********************************************************************** ! ! NAME: WRITE_NC_basisfnctns ! ! INPUT: ! group= group code (ex: IPSL) ! production= production (model and version ex: OPA 8.1) ! run=Timedep or Stationary ! imt= dimension ! jmt= dimension ! kmt= dimension ! ndyetrac=number of dye tracers ! year= year of simulation [years] ! nb_seconds_per_year= following your model year [s] ! nb_timesteps_per_year= following your model timestep ! ! dye_arr= Concentration of dye tracer [mol/cm^3] ! ! OUTPUT FILE: ! A netcdf file (clobbed if exists) with ! the filename group_dye_basisfnctns.nc ! !*********************************************************************** SUBROUTINE WRITE_NC_basisfnctns( & group,production,run, & imt,jmt,kmt,ndyetrac, & year,nb_seconds_per_year,nb_timesteps_per_year, & dye_arr) ! No implicit declarations IMPLICIT NONE ! Arguments CHARACTER*(*) group CHARACTER*(*) run CHARACTER*(*) production INTEGER imt,jmt,kmt,ndyetrac INTEGER year INTEGER nb_seconds_per_year INTEGER nb_timesteps_per_year REAL dye_arr(imt,jmt,kmt,ndyetrac) ! Constants REAL missing_value PARAMETER (missing_value=-1.E+34) ! Local variables CHARACTER*256 string256,filename CHARACTER*4 string4 INTEGER I ! Function ! INTEGER LEN_TRIM ! NetCDF variables include "netcdf.inc" INTEGER NC_ID INTEGER STATUS INTEGER LON_DIM INTEGER LAT_DIM INTEGER DEPTH_DIM INTEGER TRAC_DIM INTEGER DYE_ID INTEGER DIMS_4D(4) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Build the NetCDF filename !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ WRITE(string4,'(I4.4)') year filename=group//'_'//run//'_BasisFNCTNS_'// & string4//'.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,'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,'tracer',ndyetrac,TRAC_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- DIMS_4D(1)=LON_DIM DIMS_4D(2)=LAT_DIM DIMS_4D(3)=DEPTH_DIM DIMS_4D(4)=TRAC_DIM STATUS=NF_DEF_VAR(NC_ID,'DYE',NF_FLOAT, & 4,DIMS_4D,DYE_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Define global attributes !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ string256='$RCSfile: write_nc_basisfnctns.F,v $' & //'$Revision: 1.1 $' 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=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) !--------------------------------------------------------- string256='Ocean Inversion Project' STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'project', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- 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) !--------------------------------------------------------- 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 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ STATUS=NF_PUT_ATT_INT(NC_ID,DYE_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,DYE_ID,'nb_timesteps_per_year', & NF_INT,1,nb_timesteps_per_year) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- string256='Concentration of Dye Tracer' STATUS=NF_PUT_ATT_TEXT(NC_ID,DYE_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='mol/cm^3' STATUS=NF_PUT_ATT_TEXT(NC_ID,DYE_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,DYE_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,DYE_ID,dye_arr) 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