! ! $Id: write_nc_MaskAreaBathy.F,v 1.1 2003/10/21 06:21:52 dimitri Exp $ ! !_ --------------------------------------------------------------------- !_ RCS lines preceded by "c_ " !_ --------------------------------------------------------------------- !_ !_ $Source: /home/ubuntu/mnt/e9_copy/MITgcm_contrib/ocean_inversion_project/write_netCDF/write_nc_MaskAreaBathy.F,v $ !_ $Revision: 1.1 $ !_ $Date: 2003/10/21 06:21:52 $ ; $State: Exp $ !_ $Author: dimitri $ ; $Locker: $ !_ !_ --------------------------------------------------------------------- !_ $Log: write_nc_MaskAreaBathy.F,v $ !_ Revision 1.1 2003/10/21 06:21:52 dimitri !_ added netcdf output files !_ !_ Revision 1.1.1.1 2003/05/01 21:25:53 fletcher !_ Added code to write inversion variables !_ !_ Revision 1.1.1.1 2001/01/23 23:01:05 frenzel !_ MOM 3 Sources from Rick Slater !_ !_ Revision 1.2 1999/11/18 17:12:03 rdslater !_ Cosmetic changes: change cmoment character to "!", add $Id string at !_ top, remove *4 specifier on type statements. !_ !_ Revision 1.1.1.1 1999/05/19 15:40:41 rdslater !_ Imported sources: OCN19 OCMIP2 CFC runs !_ !_ Revision 2.1 1999/04/29 11:44:58 orr !_ Now GDT 1.2 compatible!!! !_ Added argument "production" !_ !_ Revision 1.3 1998/09/10 09:22:26 brocksce !_ Add missing value attribute for BATHY variable. !_ !_ Revision 1.2 1998/08/26 12:09:12 brocksce !_ Fixed convention error on two-dimensional bound arrays !_ (confusion between C and FORTRAN notations). !_ !_ Revision 1.1 1998/07/21 16:55:54 jomce !_ Initial revision !_ !_ --------------------------------------------------------------------- !_ !*********************************************************************** ! ! NAME: WRITE_NC_MaskAreaBathy ! ! INPUT: ! group= group code (ex: IPSL) ! production= production (model and version ex: OPA 8.1) ! imt= dimension ! jmt= dimension ! kmt= dimension ! lon= longitude axis [degrees East] ! bounds_lon= boundaries array [degrees East] ! = bounds_lon(i,j,1,1) represents the lower left boundary ! = bounds_lon(i,j,2,1) represents the lower right boundary ! = bounds_lon(i,j,1,2) represents the upper left boundary ! = bounds_lon(i,j,2,2) represents the upper right boundary ! lat= latitude axis [degrees North] ! bounds_lat= boundaries array [degrees North] ! = bounds_lat(i,j,1,1) represents the lower left boundary ! = bounds_lat(i,j,2,1) represents the lower right boundary ! = bounds_lat(i,j,1,2) represents the upper left boundary ! = bounds_lat(i,j,2,2) represents the upper right boundary ! depth= depth axis [meters] ! bounds_depth= boundaries array [meters] ! = bounds_dept(k,1) represents the lower boundary ! = bounds_dept(k,2) represents the upper boundary ! ! MASK= Mask Land/Ocean at tracer points [0/1] ! AREA= Surface Area of tracer cells [m^2] ! BATHY= Bathymetry [m] ! REG_AREA = Area of each dye region ! ! OUTPUT FILE: ! A netcdf file (clobbed if exists) with ! the filename group_MaskAreaBathy.nc ! !*********************************************************************** SUBROUTINE WRITE_NC_MaskAreaBathy( & group,production, & imt,jmt,kmt,ndyetrac, & lon,bounds_lon,lat,bounds_lat,depth,bounds_depth, & MASK,AREA,BATHY,REGION_MASK,REGION_AREA) ! No implicit declarations IMPLICIT NONE ! Arguments CHARACTER*(*) group CHARACTER*(*) production INTEGER imt,jmt,kmt,ndyetrac REAL lon(imt,jmt),bounds_lon(imt,jmt,2,2) REAL lat(imt,jmt),bounds_lat(imt,jmt,2,2) REAL depth(kmt),bounds_depth(kmt,2) REAL MASK(imt,jmt,kmt) REAL AREA(imt,jmt) REAL BATHY(imt,jmt) REAL REGION_MASK(imt,jmt,ndyetrac) REAL REGION_AREA(ndyetrac) ! Constants REAL missing_value PARAMETER (missing_value=-1.E+34) ! Local variables CHARACTER*256 string256,filename ! Function ! INTEGER LEN_TRIM ! NetCDF variables #include "netcdf.inc" INTEGER NC_ID INTEGER STATUS INTEGER LON_DIM,LON_ID INTEGER LAT_DIM,LAT_ID INTEGER DEPTH_DIM,DEPTH_ID INTEGER DYE_DIM, DYE_ID INTEGER TWO_DIM INTEGER BOUNDS_LON_ID INTEGER BOUNDS_LAT_ID INTEGER BOUNDS_DEPTH_ID INTEGER MASK_ID,AREA_ID,BATHY_ID, REG_MASK_ID, REG_AREA_ID INTEGER DIMS_2D(2) INTEGER DIMS_3D(3) INTEGER DIMS_4D(4) INTEGER DIMS_3D_REG(3) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Build the NetCDF filename !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ filename=group//'_MaskAreaBathy.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,'dye',ndyetrac,DYE_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_DEF_DIM(NC_ID,'two',2,TWO_DIM) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Define variables !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIMS_2D(1)=LON_DIM DIMS_2D(2)=LAT_DIM STATUS=NF_DEF_VAR(NC_ID,'lon',NF_FLOAT, & 2,DIMS_2D,LON_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- DIMS_4D(1)=LON_DIM DIMS_4D(2)=LAT_DIM DIMS_4D(3)=TWO_DIM DIMS_4D(4)=TWO_DIM STATUS=NF_DEF_VAR(NC_ID,'bounds_lon',NF_FLOAT, & 4,DIMS_4D,BOUNDS_LON_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'lat',NF_FLOAT, & 2,DIMS_2D,LAT_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'bounds_lat',NF_FLOAT, & 4,DIMS_4D,BOUNDS_LAT_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'depth',NF_FLOAT, & 1,DEPTH_DIM,DEPTH_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- DIMS_2D(1)=DEPTH_DIM DIMS_2D(2)=TWO_DIM STATUS=NF_DEF_VAR(NC_ID,'bounds_depth',NF_FLOAT, & 2,DIMS_2D,BOUNDS_DEPTH_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- DIMS_3D(1)=LON_DIM DIMS_3D(2)=LAT_DIM DIMS_3D(3)=DEPTH_DIM STATUS=NF_DEF_VAR(NC_ID,'MASK',NF_FLOAT, & 3,DIMS_3D,MASK_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- DIMS_2D(1)=LON_DIM DIMS_2D(2)=LAT_DIM STATUS=NF_DEF_VAR(NC_ID,'AREA',NF_FLOAT, & 2,DIMS_2D,AREA_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- DIMS_2D(1)=LON_DIM DIMS_2D(2)=LAT_DIM STATUS=NF_DEF_VAR(NC_ID,'BATHY',NF_FLOAT, & 2,DIMS_2D,BATHY_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- DIMS_3D_REG(1)=LON_DIM DIMS_3D_REG(2)=LAT_DIM DIMS_3D_REG(3)=DYE_DIM STATUS=NF_DEF_VAR(NC_ID,'REGION_MASK',NF_FLOAT, & 3,DIMS_3D_REG,REG_MASK_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- STATUS=NF_DEF_VAR(NC_ID,'REGION_AREA', NF_FLOAT, & 1,DYE_DIM, REG_AREA_ID) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Define global attributes !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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' 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 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ string256='Longitude' STATUS=NF_PUT_ATT_TEXT(NC_ID,LON_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='degrees_east' STATUS=NF_PUT_ATT_TEXT(NC_ID,LON_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,LON_ID,'modulo', & NF_FLOAT,1,360.0) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='circular' STATUS=NF_PUT_ATT_TEXT(NC_ID,LON_ID,'topology', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='bounds_lon' STATUS=NF_PUT_ATT_TEXT(NC_ID,LON_ID,'bounds', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- string256='Latitude' STATUS=NF_PUT_ATT_TEXT(NC_ID,LAT_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='degrees_north' STATUS=NF_PUT_ATT_TEXT(NC_ID,LAT_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='bounds_lat' STATUS=NF_PUT_ATT_TEXT(NC_ID,LAT_ID,'bounds', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- string256='Depth below the surface' STATUS=NF_PUT_ATT_TEXT(NC_ID,DEPTH_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='meters' STATUS=NF_PUT_ATT_TEXT(NC_ID,DEPTH_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='down' STATUS=NF_PUT_ATT_TEXT(NC_ID,DEPTH_ID,'positive', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='bounds_depth' STATUS=NF_PUT_ATT_TEXT(NC_ID,DEPTH_ID,'bounds', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- string256='Mask Land/Ocean' STATUS=NF_PUT_ATT_TEXT(NC_ID,MASK_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='0/1' STATUS=NF_PUT_ATT_TEXT(NC_ID,MASK_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='depth lat lon' STATUS=NF_PUT_ATT_TEXT(NC_ID,MASK_ID,'associate', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- string256='Surface Area of cells' STATUS=NF_PUT_ATT_TEXT(NC_ID,AREA_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='m^2' STATUS=NF_PUT_ATT_TEXT(NC_ID,AREA_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='lat lon' STATUS=NF_PUT_ATT_TEXT(NC_ID,AREA_ID,'associate', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !--------------------------------------------------------- string256='Bathymetry' STATUS=NF_PUT_ATT_TEXT(NC_ID,BATHY_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='m' STATUS=NF_PUT_ATT_TEXT(NC_ID,BATHY_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,BATHY_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='lat lon' STATUS=NF_PUT_ATT_TEXT(NC_ID,BATHY_ID,'associate', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ string256='Region Mask' STATUS=NF_PUT_ATT_TEXT(NC_ID,REG_MASK_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='dimensionless' STATUS=NF_PUT_ATT_TEXT(NC_ID,REG_MASK_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,REG_MASK_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='lat lon dye' STATUS=NF_PUT_ATT_TEXT(NC_ID,REG_MASK_ID,'associate', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ string256='Region Area' STATUS=NF_PUT_ATT_TEXT(NC_ID,REG_AREA_ID,'long_name', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='m^2' STATUS=NF_PUT_ATT_TEXT(NC_ID,REG_AREA_ID,'units', & LEN_TRIM(string256),string256) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_ATT_REAL(NC_ID,REG_AREA_ID,'missing_value', & NF_FLOAT,1,missing_value) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) string256='dye' STATUS=NF_PUT_ATT_TEXT(NC_ID,REG_AREA_ID,'associate', & LEN_TRIM(string256),string256) 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,LON_ID,lon) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,BOUNDS_LON_ID,bounds_lon) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,LAT_ID,lat) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,BOUNDS_LAT_ID,bounds_lat) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,DEPTH_ID,depth) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,BOUNDS_DEPTH_ID,bounds_depth) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,MASK_ID,MASK) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,AREA_ID,AREA) STATUS=NF_PUT_VAR_REAL(NC_ID,BATHY_ID,BATHY) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,REG_MASK_ID,REGION_MASK) IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) STATUS=NF_PUT_VAR_REAL(NC_ID,REG_AREA_ID,REGION_AREA) 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