MODULE def_info_mod ! !git $Id$ !svn $Id: def_info.F 1189 2023-08-15 21:26:58Z arango $ !================================================== Hernan G. Arango === ! Copyright (c) 2002-2023 The ROMS/TOMS Group ! ! Licensed under a MIT/X style license ! ! See License_ROMS.md ! !======================================================================= ! ! ! This routine defines information variables in requested NetCDF ! ! file. ! ! ! ! On input the NetCDF dimesions IDs is an interger vector as follows: ! ! ! ! DimIDs( 1) => XI-dimension at RHO-points ! ! DimIDs( 2) => XI-dimension at U-points ! ! DimIDs( 3) => XI-dimension at V-points ! ! DimIDs( 4) => XI-dimension at PSI-points ! ! DimIDs( 5) => ETA-dimension at RHO-points ! ! DimIDs( 6) => ETA-dimension at U-points ! ! DimIDs( 7) => ETA-dimension at V-points ! ! DimIDs( 8) => ETA-dimension at PSI-points ! ! DimIDs( 9) => S-dimension at RHO-points ! ! DimIDs(10) => S-dimension at W-points ! ! DimIDs(11) => Number of tracers dimension ! ! DimIDs(12) => Unlimited time record dimension ! ! DimIDs(13) => Number of stations dimension ! ! DimIDs(14) => Boundary dimension ! ! DimIDs(15) => Number of floats dimension ! ! DimIDs(16) => Number sediment bed layers dimension ! ! DimIDs(17) => Dimension 2D water RHO-points ! ! DimIDs(18) => Dimension 2D water U-points ! ! DimIDs(19) => Dimension 2D water V-points ! ! DimIDs(20) => Dimension 3D water RHO-points ! ! DimIDs(21) => Dimension 3D water U-points ! ! DimIDs(23) => Dimension 3D water W-points ! ! DimIDs(24) => Dimension sediment bed water points ! ! DimIDs(25) => Number of EcoSim phytoplankton groups ! ! DimIDs(26) => Number of EcoSim bacteria groups ! ! DimIDs(27) => Number of EcoSim DOM groups ! ! DimIDs(28) => Number of EcoSim fecal groups ! ! DimIDs(29) => Number of state variables ! ! DimIDs(30) => Number of 3D variables time levels (2) ! ! DimIDs(31) => Number of 2D variables time levels (3) ! ! DimIDs(32) => Number of sediment tracers ! ! DimIDs(33) => Number of light spectral bands. ! ! ! !======================================================================= ! USE mod_param USE mod_parallel USE mod_fourdvar USE mod_grid USE mod_iounits USE mod_ncparam USE mod_scalars USE mod_strings ! USE def_dim_mod, ONLY : def_dim USE def_var_mod, ONLY : def_var USE lbc_mod, ONLY : lbc_putatt USE strings_mod, ONLY : FoundError, join_string USE tadv_mod, ONLY : tadv_putatt ! implicit none ! INTERFACE def_info MODULE PROCEDURE def_info_nf90 END INTERFACE def_info ! CONTAINS ! !*********************************************************************** SUBROUTINE def_info_nf90 (ng, model, ncid, ncname, DimIDs) !*********************************************************************** ! ! ! This routine defines information variables for the requested NetCDF ! ! file using the standard NetCDF-3 or NetCDF-4 library. ! ! ! ! On Input: ! ! ! ! ng Nested grid number (integer) ! ! model Calling model identifier (integer) ! ! ncid NetCDF file ID (integer) ! ! ncname NetCDF filename (character) ! ! DimIDs NetCDF dimensions IDs (integer vector of size nDimID) ! ! ! ! On Output: ! ! ! ! exit_flag Error flag (integer) stored in MOD_SCALARS ! ! ioerror NetCDF return code (integer) stored in MOD_IOUNITS ! ! ! !*********************************************************************** ! USE mod_netcdf ! USE distribute_mod, ONLY : mp_bcasti ! ! Imported variable declarations. ! integer, intent(in) :: ng, model, ncid integer, intent(in) :: DimIDs(nDimID) ! character (*), intent(in) :: ncname ! ! Local variable declarations. ! integer, parameter :: Natt = 25 integer :: brydim, i, ie, is, j, lstr, varid integer :: srdim, stadim, status, swdim, trcdim, usrdim integer :: statedim integer :: ibuffer(2) integer :: p2dgrd(2), tbrydim(2) integer :: t2dgrd(3), u2dgrd(3), v2dgrd(3) ! real(r8) :: Aval(6) ! character (len=11 ) :: bryatt, clmatt, frcatt character (len=50 ) :: tiling character (len=80 ) :: type character (len=512) :: state_vector character (len=4096) :: string character (len=MaxLen) :: Vinfo(Natt) character (len=*), parameter :: MyFile = & & "ROMS/Utility/def_info.F"//", def_info_nf90" ! SourceFile=MyFile ! !----------------------------------------------------------------------- ! Set dimension variables. !----------------------------------------------------------------------- ! p2dgrd(1)=DimIDs(4) p2dgrd(2)=DimIDs(8) t2dgrd(1)=DimIDs(1) t2dgrd(2)=DimIDs(5) u2dgrd(1)=DimIDs(2) u2dgrd(2)=DimIDs(6) v2dgrd(1)=DimIDs(3) v2dgrd(2)=DimIDs(7) srdim=DimIDs(9) swdim=DimIDs(10) trcdim=DimIDs(11) stadim=DimIDs(13) brydim=DimIDs(14) statedim=DimIDs(29) tbrydim(1)=DimIDs(11) tbrydim(2)=DimIDs(14) ! ! Set dimension for generic user parameters. ! IF ((Nuser.gt.0).and.(ncid.ne.GST(ng)%ncid)) THEN status=def_dim(ng, model, ncid, ncname, 'Nuser', & & Nuser, usrdim) IF (FoundError(exit_flag, NoError, 199, MyFile)) RETURN END IF ! ! Initialize local information variable arrays. ! DO i=1,Natt DO j=1,LEN(Vinfo(1)) Vinfo(i)(j:j)=' ' END DO END DO DO i=1,6 Aval(i)=0.0_r8 END DO ! !----------------------------------------------------------------------- ! Define global attributes. !----------------------------------------------------------------------- ! IF (OutThread) THEN ! ! Define history global attribute. ! IF (LEN_TRIM(date_str).gt.0) THEN WRITE (history,'(a,1x,a,", ",a)') 'ROMS/TOMS, Version', & & TRIM( version), & & TRIM(date_str) ELSE WRITE (history,'(a,1x,a)') 'ROMS/TOMS, Version', & & TRIM(version) END IF ! ! Set tile decomposition global attribute. ! WRITE (tiling,10) NtileI(ng), NtileJ(ng) ! ! Define file name global attribute. ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'file', & & TRIM(ncname)) IF (FoundError(status, nf90_noerr, 239, MyFile)) THEN IF (Master) WRITE (stdout,20) 'file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Define NetCDF format type. ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'format', & & 'netCDF-4/HDF5 file') IF (FoundError(status, nf90_noerr, 258, MyFile)) THEN IF (Master) WRITE (stdout,20) 'format', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Define file climate and forecast metadata convention global ! attribute. ! type='CF-1.4, SGRID-0.3' IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'Conventions', & & TRIM(type)) IF (FoundError(status, nf90_noerr, 274, MyFile)) THEN IF (Master) WRITE (stdout,20) 'Conventions', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Define file type global attribute. ! IF (ncid.eq.ADM(ng)%ncid) THEN type='ROMS/TOMS adjoint history file' ELSE IF (ncid.eq.AVG(ng)%ncid) THEN type='ROMS/TOMS nonlinear model averages file' ELSE IF (ncid.eq.DIA(ng)%ncid) THEN type='ROMS/TOMS diagnostics file' ELSE IF (ncid.eq.FLT(ng)%ncid) THEN type='ROMS/TOMS floats file' ELSE IF (ncid.eq.ERR(ng)%ncid) THEN type='ROMS/TOMS posterior analysis error covariance matrix' ELSE IF (ncid.eq.GST(ng)%ncid) THEN type='ROMS/TOMS GST check pointing restart file' ELSE IF (ncid.eq.HAR(ng)%ncid) THEN type='ROMS/TOMS Least-squared Detiding Harmonics file' ELSE IF (ncid.eq.HSS(ng)%ncid) THEN type='ROMS/TOMS 4D-Var Hessian eigenvectors file' ELSE IF (ncid.eq.HIS(ng)%ncid) THEN type='ROMS/TOMS history file' ELSE IF (ncid.eq.ITL(ng)%ncid) THEN type='ROMS/TOMS tangent linear model initial file' ELSE IF (ncid.eq.LCZ(ng)%ncid) THEN type='ROMS/TOMS 4D-Var Lanczos vectors file' ELSE IF (ncid.eq.LZE(ng)%ncid) THEN type='ROMS/TOMS 4D-Var Evolved Lanczos vectors file' ELSE IF (ncid.eq.NRM(1,ng)%ncid) THEN type='ROMS/TOMS initial conditions error covariance norm file' ELSE IF (ncid.eq.NRM(2,ng)%ncid) THEN type='ROMS/TOMS model error covariance norm file' ELSE IF (ncid.eq.NRM(3,ng)%ncid) THEN type='ROMS/TOMS boundary conditions error covariance norm file' ELSE IF (ncid.eq.NRM(4,ng)%ncid) THEN type='ROMS/TOMS surface forcing error covariance norm file' ELSE IF (ncid.eq.QCK(ng)%ncid) THEN type='ROMS/TOMS quicksave file' ELSE IF (ncid.eq.RST(ng)%ncid) THEN type='ROMS/TOMS restart file' ELSE IF (ncid.eq.STA(ng)%ncid) THEN type='ROMS/TOMS station file' ELSE IF (ncid.eq.TLF(ng)%ncid) THEN type='ROMS/TOMS tangent linear impulse forcing file' ELSE IF (ncid.eq.TLM(ng)%ncid) THEN type='ROMS/TOMS tangent linear history file' END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'type', & & TRIM(type)) IF (FoundError(status, nf90_noerr, 347, MyFile)) THEN IF (Master) WRITE (stdout,20) 'type', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Set state vector variables. ! is=1 state_vector=' ' DO i=1,NstateVar(ng) lstr=LEN_TRIM(Vname(1,idSvar(i))) ie=is+lstr state_vector(is:ie)=TRIM(Vname(1,idSvar(i)))//', ' is=ie+2 END DO ! ! Define other global attributes to NetCDF file. ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'title', & & TRIM(title)) IF (FoundError(status, nf90_noerr, 373, MyFile)) THEN IF (Master) WRITE (stdout,20) 'title', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'var_info', & & TRIM(varname)) IF (FoundError(status, nf90_noerr, 383, MyFile)) THEN IF (Master) WRITE (stdout,20) 'var_info', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN lstr=LEN_TRIM(state_vector)-1 status=nf90_put_att(ncid, nf90_global, 'state_vector', & & state_vector(1:lstr)) IF (FoundError(status, nf90_noerr, 395, MyFile)) THEN IF (Master) WRITE (stdout,20) 'state_vector', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'rst_file', & & TRIM(RST(ng)%name)) IF (FoundError(status, nf90_noerr, 418, MyFile)) THEN IF (Master) WRITE (stdout,20) 'rst_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN IF (LdefHIS(ng)) THEN IF (ndefHIS(ng).gt.0) THEN status=nf90_put_att(ncid, nf90_global, 'his_base', & & TRIM(HIS(ng)%base)) ELSE status=nf90_put_att(ncid, nf90_global, 'his_file', & & TRIM(HIS(ng)%name)) END IF IF (FoundError(status, nf90_noerr, 434, MyFile)) THEN IF (Master) WRITE (stdout,20) 'his_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'grd_file', & & TRIM(GRD(ng)%name)) IF (FoundError(status, nf90_noerr, 533, MyFile)) THEN IF (Master) WRITE (stdout,20) 'grd_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'ini_file', & & TRIM(INI(ng)%name)) IF (FoundError(status, nf90_noerr, 546, MyFile)) THEN IF (Master) WRITE (stdout,20) 'ini_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid,nf90_global, 'itl_file', & & TRIM(ITL(ng)%name)) IF (FoundError(status, nf90_noerr, 558, MyFile)) THEN IF (Master) WRITE (stdout,20) 'itl_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'nrm_file', & & TRIM(NRM(1,ng)%name)) IF (FoundError(status, nf90_noerr, 588, MyFile)) THEN IF (Master) WRITE (stdout,20) 'nrm_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'tlf_file', & & TRIM(TLF(ng)%name)) IF (FoundError(status, nf90_noerr, 600, MyFile)) THEN IF (Master) WRITE (stdout,20) 'tlf_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'obs_file', & & TRIM(OBS(ng)%name)) IF (FoundError(status, nf90_noerr, 612, MyFile)) THEN IF (Master) WRITE (stdout,20) 'obs_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN IF (LuvSrc(ng).or.LwSrc(ng).or.(ANY(LtracerSrc(:,ng)))) THEN status=nf90_put_att(ncid, nf90_global, 'river_file', & & TRIM(SSF(ng)%name)) IF (FoundError(status, nf90_noerr, 689, MyFile)) THEN IF (Master) WRITE (stdout,20) 'river_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END IF IF (exit_flag.eq.NoError) THEN IF (LprocessTides(ng)) THEN status=nf90_put_att(ncid, nf90_global, 'tide_file', & & TRIM(TIDE(ng)%name)) IF (FoundError(status, nf90_noerr, 703, MyFile)) THEN IF (Master) WRITE (stdout,20) 'tide_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END IF IF (exit_flag.eq.NoError) THEN DO i=1,nFfiles(ng) CALL join_string (FRC(i,ng)%files, FRC(i,ng)%Nfiles, & & string, lstr) WRITE (frcatt,30) 'frc_file_', i status=nf90_put_att(ncid, nf90_global, frcatt, & & string(1:lstr)) IF (FoundError(status, nf90_noerr, 720, MyFile)) THEN IF (Master) WRITE (stdout,20) TRIM(frcatt), TRIM(ncname) exit_flag=3 ioerror=status EXIT END IF END DO END IF IF (ObcData(ng)) THEN DO i=1,nBCfiles(ng) IF (exit_flag.eq.NoError) THEN CALL join_string (BRY(i,ng)%files, BRY(i,ng)%Nfiles, & & string, lstr) WRITE (bryatt,30) 'bry_file_', i status=nf90_put_att(ncid, nf90_global, bryatt, & & string(1:lstr)) IF (FoundError(status, nf90_noerr, 738, MyFile)) THEN IF (Master) WRITE (stdout,20) TRIM(bryatt), TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END DO END IF IF (Lclimatology(ng)) THEN DO i=1,nCLMfiles(ng) IF (exit_flag.eq.NoError) THEN CALL join_string (CLM(i,ng)%files, CLM(i,ng)%Nfiles, & & string, lstr) WRITE (clmatt,30) 'clm_file_', i status=nf90_put_att(ncid, nf90_global, clmatt, & & string(1:lstr)) IF (FoundError(status, nf90_noerr, 757, MyFile)) THEN IF (Master) WRITE (stdout,20) TRIM(clmatt), TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END DO END IF IF (Lnudging(ng)) THEN IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'nud_file', & & TRIM(NUD(ng)%name)) IF (FoundError(status, nf90_noerr, 772, MyFile)) THEN IF (Master) WRITE (stdout,20) 'nud_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'fwd_file', & & TRIM(FWD(ng)%name)) IF (FoundError(status, nf90_noerr, 785, MyFile)) THEN IF (Master) WRITE (stdout,20) 'fwd_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'script_file', & & TRIM(Iname)) IF (FoundError(status, nf90_noerr, 811, MyFile)) THEN IF (Master) WRITE (stdout,20) 'script_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'apar_file', & & TRIM(aparnam)) IF (FoundError(status, nf90_noerr, 823, MyFile)) THEN IF (Master) WRITE (stdout,20) 'apar_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! NLM tracer advection scheme. ! IF (exit_flag.eq.NoError) THEN CALL tadv_putatt (ng, ncid, ncname, 'NLM_TADV', & & Hadvection, Vadvection, status) IF (FoundError(status, nf90_noerr, 875, MyFile)) THEN IF (Master) WRITE (stdout,20) 'NLM_TADV', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN CALL tadv_putatt (ng, ncid, ncname, 'ADM_TADV', & & ad_Hadvection, ad_Vadvection, status) IF (FoundError(status, nf90_noerr, 886, MyFile)) THEN IF (Master) WRITE (stdout,20) 'NLM_TADV', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! NLM Lateral boundary conditions. ! IF (exit_flag.eq.NoError) THEN CALL lbc_putatt (ng, ncid, ncname, 'NLM_LBC', LBC, status) IF (FoundError(status, nf90_noerr, 899, MyFile)) THEN IF (Master) WRITE (stdout,20) 'NLM_LBC', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Adjoint-based lateral boundary conditions. ! IF (exit_flag.eq.NoError) THEN CALL lbc_putatt (ng, ncid, ncname, 'ADM_LBC', ad_LBC, status) IF (FoundError(status, nf90_noerr, 912, MyFile)) THEN IF (Master) WRITE (stdout,20) 'ADM_LBC', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! GIT repository information. ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'git_url', & & TRIM(git_url)) IF (FoundError(status, nf90_noerr, 927, MyFile)) THEN IF (Master) WRITE (stdout,20) 'git_url', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'git_rev', & & TRIM(git_rev)) IF (FoundError(status, nf90_noerr, 938, MyFile)) THEN IF (Master) WRITE (stdout,20) 'git_rev', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! SVN repository information. ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'svn_url', & & TRIM(svn_url)) IF (FoundError(status, nf90_noerr, 951, MyFile)) THEN IF (Master) WRITE (stdout,20) 'svn_url', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'svn_rev', & & TRIM(svn_rev)) IF (FoundError(status, nf90_noerr, 962, MyFile)) THEN IF (Master) WRITE (stdout,20) 'svn_rev', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Local root directory, cpp header directory and file, and analytical ! directory ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'code_dir', & & TRIM(Rdir)) IF (FoundError(status, nf90_noerr, 978, MyFile)) THEN IF (Master) WRITE (stdout,20) 'code_dir', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'header_dir', & & TRIM(Hdir)) IF (FoundError(status, nf90_noerr, 990, MyFile)) THEN IF (Master) WRITE (stdout,20) 'header_dir', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'header_file', & & TRIM(Hfile)) IF (FoundError(status, nf90_noerr, 1002, MyFile)) THEN IF (Master) WRITE (stdout,20) 'header_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Attributes describing platform and compiler ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'os', & & TRIM(my_os)) IF (FoundError(status, nf90_noerr, 1017, MyFile)) THEN IF (Master) WRITE (stdout,20) 'os', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'cpu', & & TRIM(my_cpu)) IF (FoundError(status, nf90_noerr, 1027, MyFile)) THEN IF (Master) WRITE (stdout,20) 'cpu', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'compiler_system', & & TRIM(my_fort)) IF (FoundError(status, nf90_noerr, 1037, MyFile)) THEN IF (Master) WRITE (stdout,20) 'compiler_system', & & TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'compiler_command', & & TRIM(my_fc)) IF (FoundError(status, nf90_noerr, 1048, MyFile)) THEN IF (Master) WRITE (stdout,20) 'compiler_command', & & TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN lstr=INDEX(my_fflags, 'free')-2 IF (lstr.le.0) lstr=LEN_TRIM(my_fflags) status=nf90_put_att(ncid, nf90_global, 'compiler_flags', & & my_fflags(1:lstr)) IF (FoundError(status, nf90_noerr, 1061, MyFile)) THEN IF (Master) WRITE (stdout,20) 'compiler_flags', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Tiling and history attributes. ! IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'tiling', & & TRIM(tiling)) IF (FoundError(status, nf90_noerr, 1073, MyFile)) THEN IF (Master) WRITE (stdout,20) 'tiling', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF IF (exit_flag.eq.NoError) THEN status=nf90_put_att(ncid, nf90_global, 'history', & & TRIM(history)) IF (FoundError(status, nf90_noerr, 1083, MyFile)) THEN IF (Master) WRITE (stdout,20) 'history', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF ! ! Analytical header files used. ! IF (exit_flag.eq.NoError) THEN CALL join_string (ANANAME, SIZE(ANANAME), string, lstr) IF (lstr.gt.0) THEN status=nf90_put_att(ncid, nf90_global, 'ana_file', & & string(1:lstr)) IF (FoundError(status, nf90_noerr, 1097, MyFile)) THEN IF (Master) WRITE (stdout,20) 'ana_file', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END IF ! ! Activated CPP options. ! IF (exit_flag.eq.NoError) THEN lstr=LEN_TRIM(Coptions)-1 status=nf90_put_att(ncid, nf90_global, 'CPP_options', & & TRIM(Coptions(1:lstr))) IF (FoundError(status, nf90_noerr, 1132, MyFile)) THEN IF (Master) WRITE (stdout,20) 'CPP_options', TRIM(ncname) exit_flag=3 ioerror=status END IF END IF END IF ibuffer(1)=exit_flag ibuffer(2)=ioerror CALL mp_bcasti (ng, model, ibuffer) exit_flag=ibuffer(1) ioerror=ibuffer(2) IF (FoundError(exit_flag, NoError, 1148, MyFile)) RETURN ! !----------------------------------------------------------------------- ! Define running parameters. !----------------------------------------------------------------------- ! ! Time stepping parameters. ! Vinfo( 1)='ntimes' Vinfo( 2)='number of long time-steps' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1169, MyFile)) RETURN Vinfo( 1)='ndtfast' Vinfo( 2)='number of short time-steps' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1176, MyFile)) RETURN Vinfo( 1)='dt' Vinfo( 2)='size of long time-steps' Vinfo( 3)='second' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1184, MyFile)) RETURN Vinfo( 1)='dtfast' Vinfo( 2)='size of short time-steps' Vinfo( 3)='second' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1192, MyFile)) RETURN Vinfo( 1)='dstart' Vinfo( 2)='time stamp assigned to model initilization' WRITE (Vinfo( 3),'(a,a)') 'days since ', TRIM(Rclock%string) Vinfo( 4)=TRIM(Rclock%calendar) status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1201, MyFile)) RETURN Vinfo( 1)='nHIS' Vinfo( 2)='number of time-steps between history records' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1249, MyFile)) RETURN Vinfo( 1)='ndefHIS' Vinfo( 2)= & & 'number of time-steps between the creation of history files' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1257, MyFile)) RETURN Vinfo( 1)='nRST' Vinfo( 2)='number of time-steps between restart records' IF (LcycleRST(ng)) THEN Vinfo(13)='only latest two records are maintained' END IF status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1267, MyFile)) RETURN Vinfo( 1)='nADJ' Vinfo( 2)='number of time-steps between adjoint history records' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1303, MyFile)) RETURN Vinfo( 1)='ndefADJ' Vinfo( 2)= & & 'number of time-steps between the creation of adjoint files' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1311, MyFile)) RETURN Vinfo( 1)='nTLM' Vinfo( 2)='number of time-steps between tangent history records' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1320, MyFile)) RETURN Vinfo( 1)='ndefTLM' Vinfo( 2)= & & 'number of time-steps between the creation of tanget files' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1328, MyFile)) RETURN Vinfo( 1)='Nouter' Vinfo( 2)='number of minimization outer loops' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1446, MyFile)) RETURN Vinfo( 1)='Ninner' Vinfo( 2)='number of minimization inner loops' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1453, MyFile)) RETURN ! ! Power-law shape filter parameters for time-averaging of barotropic ! fields. ! Vinfo( 1)='Falpha' Vinfo( 2)='Power-law shape barotropic filter parameter' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1466, MyFile)) RETURN Vinfo( 1)='Fbeta' Vinfo( 2)='Power-law shape barotropic filter parameter' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1473, MyFile)) RETURN Vinfo( 1)='Fgamma' Vinfo( 2)='Power-law shape barotropic filter parameter' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1480, MyFile)) RETURN ! ! Horizontal mixing coefficients. ! Vinfo( 1)='nl_tnu2' Vinfo( 2)='nonlinear model Laplacian mixing coefficient '// & & 'for tracers' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1493, MyFile)) RETURN Vinfo( 1)='ad_tnu2' Vinfo( 2)='adjoint model Laplacian mixing coefficient '// & & 'for tracers' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1503, MyFile)) RETURN Vinfo( 1)='tl_tnu2' Vinfo( 2)='tangent linear model Laplacian mixing coefficient '// & & 'for tracers' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1514, MyFile)) RETURN Vinfo( 1)='nl_visc2' Vinfo( 2)='nonlinear model Laplacian mixing coefficient '// & & 'for momentum' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1559, MyFile)) RETURN Vinfo( 1)='ad_visc2' Vinfo( 2)='adjoint model Laplacian mixing coefficient '// & & 'for momentum' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1569, MyFile)) RETURN Vinfo( 1)='tl_visc2' Vinfo( 2)='tangent linear model Laplacian mixing coefficient '// & & 'for momentum' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1580, MyFile)) RETURN Vinfo( 1)='LuvSponge' Vinfo( 2)='horizontal viscosity sponge activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1645, MyFile)) RETURN Vinfo( 1)='LtracerSponge' Vinfo( 2)='horizontal diffusivity sponge activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1655, MyFile)) RETURN ! ! Background vertical mixing coefficients. ! Vinfo( 1)='Akt_bak' Vinfo( 2)='background vertical mixing coefficient for tracers' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1667, MyFile)) RETURN Vinfo( 1)='Akv_bak' Vinfo( 2)='background vertical mixing coefficient for momentum' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1675, MyFile)) RETURN Vinfo( 1)='Akk_bak' Vinfo( 2)= & & 'background vertical mixing coefficient for turbulent energy' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1685, MyFile)) RETURN Vinfo( 1)='Akp_bak' Vinfo( 2)= & & 'background vertical mixing coefficient for length scale' Vinfo( 3)='meter2 second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1694, MyFile)) RETURN ! ! Basic state vertical mixing scale used in adjoint-based applications. ! Vinfo( 1)='ad_Akt_fac' Vinfo( 2)='adjoint model basic state vertical mixing '// & & 'scale for tracers' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1708, MyFile)) RETURN Vinfo( 1)='tl_Akt_fac' Vinfo( 2)='tangent linear model basic state vertical mixing '// & & 'scale for tracers' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1718, MyFile)) RETURN Vinfo( 1)='ad_Akv_fac' Vinfo( 2)='adjoint model basic state vertical mixing '// & & 'scale for momentum' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1728, MyFile)) RETURN Vinfo( 1)='tl_Akv_fac' Vinfo( 2)='tangent linear model basic state vertical mixing '// & & 'scale for momentum' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1738, MyFile)) RETURN ! ! Drag coefficients. ! Vinfo( 1)='rdrg' Vinfo( 2)='linear drag coefficient' Vinfo( 3)='meter second-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1751, MyFile)) RETURN Vinfo( 1)='rdrg2' Vinfo( 2)='quadratic drag coefficient' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo ,ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1758, MyFile)) RETURN Vinfo( 1)='Zob' Vinfo( 2)='bottom roughness' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1767, MyFile)) RETURN Vinfo( 1)='Zos' Vinfo( 2)='surface roughness' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1775, MyFile)) RETURN ! ! Nudging inverse time scales used in various tasks. ! Vinfo( 1)='Znudg' Vinfo( 2)='free-surface nudging/relaxation inverse time scale' Vinfo( 3)='day-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1912, MyFile)) RETURN Vinfo( 1)='M2nudg' Vinfo( 2)='2D momentum nudging/relaxation inverse time scale' Vinfo( 3)='day-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1920, MyFile)) RETURN Vinfo( 1)='M3nudg' Vinfo( 2)='3D momentum nudging/relaxation inverse time scale' Vinfo( 3)='day-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1929, MyFile)) RETURN Vinfo( 1)='Tnudg' Vinfo( 2)='Tracers nudging/relaxation inverse time scale' Vinfo( 3)='day-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1937, MyFile)) RETURN ! ! Open boundary nudging, inverse time scales. ! IF (NudgingCoeff(ng)) THEN Vinfo( 1)='FSobc_in' Vinfo( 2)='free-surface inflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/brydim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1951, MyFile)) RETURN Vinfo( 1)='FSobc_out' Vinfo( 2)='free-surface outflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/brydim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1959, MyFile)) RETURN Vinfo( 1)='M2obc_in' Vinfo( 2)='2D momentum inflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/brydim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1967, MyFile)) RETURN Vinfo( 1)='M2obc_out' Vinfo( 2)='2D momentum outflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/brydim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1975, MyFile)) RETURN Vinfo( 1)='Tobc_in' Vinfo( 2)='tracers inflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 2, tbrydim, Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1984, MyFile)) RETURN Vinfo( 1)='Tobc_out' Vinfo( 2)='tracers outflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 2, tbrydim, Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 1992, MyFile)) RETURN Vinfo( 1)='M3obc_in' Vinfo( 2)='3D momentum inflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/brydim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2000, MyFile)) RETURN Vinfo( 1)='M3obc_out' Vinfo( 2)='3D momentum outflow, nudging inverse time scale' Vinfo( 3)='second-1' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/brydim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2008, MyFile)) RETURN END IF ! ! Equation of State parameters. ! Vinfo( 1)='rho0' Vinfo( 2)='mean density used in Boussinesq approximation' Vinfo( 3)='kilogram meter-3' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2021, MyFile)) RETURN Vinfo( 1)='R0' Vinfo( 2)='background density used in linear equation of state' Vinfo( 3)='kilogram meter-3' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2041, MyFile)) RETURN Vinfo( 1)='Tcoef' Vinfo( 2)='thermal expansion coefficient' Vinfo( 3)='Celsius-1' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2049, MyFile)) RETURN Vinfo( 1)='Scoef' Vinfo( 2)='Saline contraction coefficient' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2056, MyFile)) RETURN ! ! Various parameters. ! ! ! Slipperiness parameters. ! Vinfo( 1)='gamma2' Vinfo( 2)='slipperiness parameter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2086, MyFile)) RETURN ! ! Logical switches to activate horizontal momentum transport ! point Sources/Sinks (like river runoff transport) and mass point ! Sources/Sinks (like volume vertical influx). ! Vinfo( 1)='LuvSrc' Vinfo( 2)='momentum point sources and sink activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2099, MyFile)) RETURN Vinfo( 1)='LwSrc' Vinfo( 2)='mass point sources and sink activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2108, MyFile)) RETURN ! ! Logical switches indicating which tracer variables are processed ! during point Sources/Sinks. ! Vinfo( 1)='LtracerSrc' Vinfo( 2)='tracer point sources and sink activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2122, MyFile)) RETURN ! ! Logical switches to process climatology fields. ! Vinfo( 1)='LsshCLM' Vinfo( 2)='sea surface height climatology processing switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2134, MyFile)) RETURN Vinfo( 1)='Lm2CLM' Vinfo( 2)='2D momentum climatology processing switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2143, MyFile)) RETURN Vinfo( 1)='Lm3CLM' Vinfo( 2)='3D momentum climatology processing switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2153, MyFile)) RETURN Vinfo( 1)='LtracerCLM' Vinfo( 2)='tracer climatology processing switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2162, MyFile)) RETURN ! ! Logical switches for nudging of climatology fields. ! Vinfo( 1)='LnudgeM2CLM' Vinfo( 2)='2D momentum climatology nudging activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2174, MyFile)) RETURN ! Vinfo( 1)='LnudgeM3CLM' Vinfo( 2)='3D momentum climatology nudging activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2184, MyFile)) RETURN ! Vinfo( 1)='LnudgeTCLM' Vinfo( 2)='tracer climatology nudging activation switch' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/trcdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2193, MyFile)) RETURN ! ! 4D-Var assimilation parameters. ! Vinfo( 1)='LhessianEV' Vinfo( 2)='switch to compute Hessian eigenvectors' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2227, MyFile)) RETURN Vinfo( 1)='LhotStart' Vinfo( 2)='switch for hot start of subsequent outer loops' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2237, MyFile)) RETURN Vinfo( 1)='Lprecond' Vinfo( 2)='switch for conjugate gradient preconditioning' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2247, MyFile)) RETURN Vinfo( 1)='Lritz' Vinfo( 2)='switch for Ritz limited-memory preconditioning' Vinfo( 9)='.FALSE.' Vinfo(10)='.TRUE.' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2256, MyFile)) RETURN IF (Lprecond.and.(NritzEV.gt.0)) THEN Vinfo( 1)='NritzEV' Vinfo( 2)='number of preconditioning eigenpairs to use' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2265, MyFile)) RETURN END IF Vinfo( 1)='GradErr' Vinfo( 2)='Upper bound on relative error of the gradient' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2295, MyFile)) RETURN Vinfo( 1)='HevecErr' Vinfo( 2)='Accuracy required for Hessian eigenvectors' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2302, MyFile)) RETURN Vinfo( 1)='Nmethod' Vinfo( 2)='background error covariance normalization method' Vinfo( 9)='exact' Vinfo(10)='randomization' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2312, MyFile)) RETURN Vinfo( 1)='Rscheme' Vinfo( 2)='Random number generation scheme' Vinfo( 9)='intrisic_randon_number' Vinfo(10)='Gaussian_distributed_deviates' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2321, MyFile)) RETURN Vinfo( 1)='Nrandom' Vinfo( 2)='number of randomization iterations' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2328, MyFile)) RETURN Vinfo( 1)='Hgamma' Vinfo( 2)='initial conditions error covariance '// & & 'horizontal convolution time-step stability factor' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2336, MyFile)) RETURN Vinfo( 1)='HgammaM' Vinfo( 2)='model error covariance '// & & 'horizontal convolution time-step stability factor' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2345, MyFile)) RETURN Vinfo( 1)='Vgamma' Vinfo( 2)='initial conditions error covariance '// & & 'vertical convolution time-step stability factor' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2375, MyFile)) RETURN Vinfo( 1)='VgammaM' Vinfo( 2)='model error covariance '// & & 'vertical convolution time-step stability factor' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2384, MyFile)) RETURN Vinfo( 1)='Hdecay' Vinfo( 2)='initial conditions error covariance '// & & 'horizontal decorrelation scale' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/statedim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2405, MyFile)) RETURN Vinfo( 1)='Vdecay' Vinfo( 2)='initial conditions error covariance '// & & 'vertical decorrelation scale' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/statedim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2415, MyFile)) RETURN IF (NSA.eq.2) THEN Vinfo( 1)='HdecayM' Vinfo( 2)='model error covariance ' // & & 'horizontal decorrelation scale' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/statedim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2426, MyFile)) RETURN Vinfo( 1)='VdecayM' Vinfo( 2)='model error covariance '// & & 'vertical decorrelation scale' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/statedim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2436, MyFile)) RETURN END IF ! !----------------------------------------------------------------------- ! Define grid variables. !----------------------------------------------------------------------- ! ! Grid type switch: Spherical or Cartesian. Writing characters in ! parallel I/O is extremely inefficient. It is better to write ! this as an integer switch: 0=Cartesian, 1=spherical. ! Vinfo( 1)='spherical' Vinfo( 2)='grid type logical switch' Vinfo( 9)='Cartesian' Vinfo(10)='spherical' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2886, MyFile)) RETURN ! ! Domain Length. ! Vinfo( 1)='xl' Vinfo( 2)='domain length in the XI-direction' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2896, MyFile)) RETURN Vinfo( 1)='el' Vinfo( 2)='domain length in the ETA-direction' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2904, MyFile)) RETURN ! ! S-coordinate parameters. ! Vinfo( 1)='Vtransform' Vinfo( 2)='vertical terrain-following transformation equation' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2914, MyFile)) RETURN Vinfo( 1)='Vstretching' Vinfo( 2)='vertical terrain-following stretching function' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2921, MyFile)) RETURN Vinfo( 1)='theta_s' Vinfo( 2)='S-coordinate surface control parameter' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2928, MyFile)) RETURN Vinfo( 1)='theta_b' Vinfo( 2)='S-coordinate bottom control parameter' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2935, MyFile)) RETURN Vinfo( 1)='Tcline' Vinfo( 2)='S-coordinate surface/bottom layer width' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2943, MyFile)) RETURN Vinfo( 1)='hc' Vinfo( 2)='S-coordinate parameter, critical depth' Vinfo( 3)='meter' status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2951, MyFile)) RETURN ! ! SGRID conventions for staggered data on structured grids. ! Vinfo( 1)='grid' status=def_var(ng, model, ncid, varid, nf90_int, & & 1, (/0/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2959, MyFile)) RETURN ! ! S-coordinate non-dimensional independent variable at RHO-points. ! Vinfo( 1)='s_rho' Vinfo( 2)='S-coordinate at RHO-points' Vinfo( 5)='valid_min' Vinfo( 6)='valid_max' IF (Vtransform(ng).eq.1) THEN Vinfo(21)='ocean_s_coordinate_g1' ELSE IF (Vtransform(ng).eq.2) THEN Vinfo(21)='ocean_s_coordinate_g2' END IF Vinfo(23)='s: s_rho C: Cs_r eta: zeta depth: h depth_c: hc' vinfo(25)='up' Aval(2)=-1.0_r8 Aval(3)=0.0_r8 status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/srdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 2983, MyFile)) RETURN ! ! S-coordinate non-dimensional independent variable at W-points. ! Vinfo( 1)='s_w' Vinfo( 2)='S-coordinate at W-points' Vinfo( 5)='valid_min' Vinfo( 6)='valid_max' Vinfo(21)='ocean_s_coordinate' IF (Vtransform(ng).eq.1) THEN Vinfo(21)='ocean_s_coordinate_g1' ELSE IF (Vtransform(ng).eq.2) THEN Vinfo(21)='ocean_s_coordinate_g2' END IF Vinfo(23)='s: s_w C: Cs_w eta: zeta depth: h depth_c: hc' vinfo(25)='up' Aval(2)=-1.0_r8 Aval(3)=0.0_r8 status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/swdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 3008, MyFile)) RETURN ! ! S-coordinate non-dimensional stretching curves at RHO-points. ! Vinfo( 1)='Cs_r' Vinfo( 2)='S-coordinate stretching curves at RHO-points' Vinfo( 5)='valid_min' Vinfo( 6)='valid_max' Aval(2)=-1.0_r8 Aval(3)=0.0_r8 status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/srdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 3021, MyFile)) RETURN ! ! S-coordinate non-dimensional stretching curves at W-points. ! Vinfo( 1)='Cs_w' Vinfo( 2)='S-coordinate stretching curves at W-points' Vinfo( 5)='valid_min' Vinfo( 6)='valid_max' Aval(2)=-1.0_r8 Aval(3)=0.0_r8 status=def_var(ng, model, ncid, varid, NF_TOUT, & & 1, (/swdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 3034, MyFile)) RETURN ! ! User generic parameters. ! IF (Nuser.gt.0) THEN Vinfo( 1)='user' Vinfo( 2)='user generic parameters' Vinfo(24)='_FillValue' Aval(6)=spval status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/usrdim/), Aval, Vinfo, ncname, & & SetParAccess = .FALSE.) IF (FoundError(exit_flag, NoError, 3047, MyFile)) RETURN END IF IF (ncid.ne.FLT(ng)%ncid) THEN ! ! Bathymetry. ! Vinfo( 1)=Vname(1,idtopo) Vinfo( 2)=Vname(2,idtopo) Vinfo( 3)=Vname(3,idtopo) Vinfo(14)=Vname(4,idtopo) Vinfo(21)=Vname(6,idtopo) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idtopo,ng),r8) IF (ncid.eq.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/stadim/), Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3088, MyFile)) RETURN ELSE status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3092, MyFile)) RETURN END IF ! ! Coriolis Parameter. ! IF (ncid.ne.STA(ng)%ncid) THEN Vinfo( 1)=Vname(1,idfcor) Vinfo( 2)=Vname(2,idfcor) Vinfo( 3)=Vname(3,idfcor) Vinfo(14)=Vname(4,idfcor) Vinfo(21)=Vname(6,idfcor) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idfcor,ng),r8) status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3108, MyFile)) RETURN END IF ! ! Curvilinear coordinate metrics. ! IF (ncid.ne.STA(ng)%ncid) THEN Vinfo( 1)=Vname(1,idpmdx) Vinfo( 2)=Vname(2,idpmdx) Vinfo( 3)=Vname(3,idpmdx) Vinfo(14)=Vname(4,idpmdx) Vinfo(21)=Vname(6,idpmdx) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idpmdx,ng),r8) status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3123, MyFile)) RETURN ! Vinfo( 1)=Vname(1,idpndy) Vinfo( 2)=Vname(2,idpndy) Vinfo( 3)=Vname(3,idpndy) Vinfo(14)=Vname(4,idpndy) Vinfo(21)=Vname(6,idpndy) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idpndy,ng),r8) status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3134, MyFile)) RETURN END IF ! ! Grid coordinates of RHO-points. ! IF (spherical) THEN Vinfo( 1)=Vname(1,idLonR) Vinfo( 2)=Vname(2,idLonR) Vinfo( 3)=Vname(3,idLonR) Vinfo(14)=Vname(4,idLonR) Vinfo(21)=Vname(6,idLonR) IF (ncid.eq.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/stadim/), Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3148, MyFile)) RETURN ELSE status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3152, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idLatR) Vinfo( 2)=Vname(2,idLatR) Vinfo( 3)=Vname(3,idLatR) Vinfo(14)=Vname(4,idLatR) Vinfo(21)=Vname(6,idLatR) IF (ncid.eq.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/stadim/), Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3163, MyFile)) RETURN ELSE status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3167, MyFile)) RETURN END IF ELSE Vinfo( 1)=Vname(1,idXgrR) Vinfo( 2)=Vname(2,idXgrR) Vinfo( 3)=Vname(3,idXgrR) Vinfo(14)=Vname(4,idXgrR) Vinfo(21)=Vname(6,idXgrR) IF (ncid.eq.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/stadim/), Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3178, MyFile)) RETURN ELSE status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3182, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idYgrR) Vinfo( 2)=Vname(2,idYgrR) Vinfo( 3)=Vname(3,idYgrR) Vinfo(14)=Vname(4,idYgrR) Vinfo(21)=Vname(6,idYgrR) IF (ncid.eq.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/stadim/), Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3193, MyFile)) RETURN ELSE status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3197, MyFile)) RETURN END IF END IF ! ! Grid coordinates of U-points. ! IF (spherical) THEN Vinfo( 1)=Vname(1,idLonU) Vinfo( 2)=Vname(2,idLonU) Vinfo( 3)=Vname(3,idLonU) Vinfo(14)=Vname(4,idLonU) Vinfo(21)=Vname(6,idLonU) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, u2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3212, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idLatU) Vinfo( 2)=Vname(2,idLatU) Vinfo( 3)=Vname(3,idLatU) Vinfo(14)=Vname(4,idLatU) Vinfo(21)=Vname(6,idLatU) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, u2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3223, MyFile)) RETURN END IF ELSE Vinfo( 1)=Vname(1,idXgrU) Vinfo( 2)=Vname(2,idXgrU) Vinfo( 3)=Vname(3,idXgrU) Vinfo(14)=Vname(4,idXgrU) Vinfo(21)=Vname(6,idXgrU) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, u2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3234, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idYgrU) Vinfo( 2)=Vname(2,idYgrU) Vinfo( 3)=Vname(3,idYgrU) Vinfo(14)=Vname(4,idYgrU) Vinfo(21)=Vname(6,idYgrU) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, u2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3245, MyFile)) RETURN END IF END IF ! ! Grid coordinates of V-points. ! IF (spherical) THEN Vinfo( 1)=Vname(1,idLonV) Vinfo( 2)=Vname(2,idLonV) Vinfo( 3)=Vname(3,idLonV) Vinfo(14)=Vname(4,idLonV) Vinfo(21)=Vname(6,idLonV) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, v2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3260, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idLatV) Vinfo( 2)=Vname(2,idLatV) Vinfo( 3)=Vname(3,idLatV) Vinfo(14)=Vname(4,idLatV) Vinfo(21)=Vname(6,idLatV) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, v2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3271, MyFile)) RETURN END IF ELSE Vinfo( 1)=Vname(1,idXgrV) Vinfo( 2)=Vname(2,idXgrV) Vinfo( 3)=Vname(3,idXgrV) Vinfo(14)=Vname(4,idXgrV) Vinfo(21)=Vname(6,idXgrV) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, v2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3282, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idYgrV) Vinfo( 2)=Vname(2,idYgrV) Vinfo( 3)=Vname(3,idYgrV) Vinfo(14)=Vname(4,idYgrV) Vinfo(21)=Vname(6,idYgrV) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, v2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3293, MyFile)) RETURN END IF END IF ! ! Grid coordinates of PSI-points. ! IF (spherical) THEN Vinfo( 1)=Vname(1,idLonP) Vinfo( 2)=Vname(2,idLonP) Vinfo( 3)=Vname(3,idLonP) Vinfo(14)=Vname(4,idLonP) Vinfo(21)=Vname(6,idLonP) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, p2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3308, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idLatP) Vinfo( 2)=Vname(2,idLatP) Vinfo( 3)=Vname(3,idLatP) Vinfo(14)=Vname(4,idLatP) Vinfo(21)=Vname(6,idLatP) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, p2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3319, MyFile)) RETURN END IF ELSE Vinfo( 1)=Vname(1,idXgrP) Vinfo( 2)=Vname(2,idXgrP) Vinfo( 3)=Vname(3,idXgrP) Vinfo(14)=Vname(4,idXgrP) Vinfo(21)=Vname(6,idXgrP) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, p2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3330, MyFile)) RETURN END IF ! Vinfo( 1)=Vname(1,idYgrP) Vinfo( 2)=Vname(2,idYgrP) Vinfo( 3)=Vname(3,idYgrP) Vinfo(14)=Vname(4,idYgrP) Vinfo(21)=Vname(6,idYgrP) IF (ncid.ne.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, p2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3341, MyFile)) RETURN END IF END IF ! ! Angle between XI-axis and EAST at RHO-points. ! Vinfo( 1)=Vname(1,idangR) Vinfo( 2)=Vname(2,idangR) Vinfo( 3)=Vname(3,idangR) Vinfo(14)=Vname(4,idangR) Vinfo(21)=Vname(6,idangR) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idangR,ng),r8) IF (ncid.eq.STA(ng)%ncid) THEN status=def_var(ng, model, ncid, varid, NF_TYPE, & & 1, (/stadim/), Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3359, MyFile)) RETURN ELSE status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3363, MyFile)) RETURN END IF ! ! Masking fields at RHO-, U-, V-points, and PSI-points. ! IF (ncid.ne.STA(ng)%ncid) THEN Vinfo( 1)=Vname(1,idmskR) Vinfo( 2)=Vname(2,idmskR) Vinfo( 9)='land' Vinfo(10)='water' Vinfo(21)=Vname(6,idmskR) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idmskR,ng),r8) status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, t2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3380, MyFile)) RETURN ! Vinfo( 1)=Vname(1,idmskU) Vinfo( 2)=Vname(2,idmskU) Vinfo( 9)='land' Vinfo(10)='water' Vinfo(21)=Vname(6,idmskU) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idmskU,ng),r8) status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, u2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3391, MyFile)) RETURN ! Vinfo( 1)=Vname(1,idmskV) Vinfo( 2)=Vname(2,idmskV) Vinfo( 9)='land' Vinfo(10)='water' Vinfo(21)=Vname(6,idmskV) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idmskV,ng),r8) status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, v2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3402, MyFile)) RETURN ! Vinfo( 1)=Vname(1,idmskP) Vinfo( 2)=Vname(2,idmskP) Vinfo( 9)='land' Vinfo(10)='water' Vinfo(21)=Vname(6,idmskP) Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idmskP,ng),r8) status=def_var(ng, model, ncid, varid, NF_TYPE, & & 2, p2dgrd, Aval, Vinfo, ncname) IF (FoundError(exit_flag, NoError, 3413, MyFile)) RETURN END IF END IF ! 10 FORMAT (i3.3,'x',i3.3) 20 FORMAT (/,' DEF_INFO_NF90 - error while creating global', & & ' attribute: ',a,/,17x,a) 30 FORMAT (a,i2.2) ! RETURN END SUBROUTINE def_info_nf90 END MODULE def_info_mod