SUBROUTINE output (ng) ! !svn $Id: output.F 407 2009-11-02 21:27:07Z arango $ !================================================== Hernan G. Arango === ! Copyright (c) 2002-2009 The ROMS/TOMS Group ! ! Licensed under a MIT/X style license ! ! See License_ROMS.txt ! !======================================================================= ! ! ! This subroutine manages nonlinear model output. It creates output ! ! NetCDF files and writes out data into NetCDF files. If requested, ! ! it can create several history and/or time-averaged files to avoid ! ! generating too large files during a single model run. ! ! ! !======================================================================= ! USE mod_param USE mod_parallel USE mod_floats USE mod_iounits USE mod_ncparam USE mod_netcdf USE mod_scalars ! USE distribute_mod, ONLY : mp_bcasts ! implicit none ! ! Imported variable declarations. ! integer, intent(in) :: ng ! ! Local variable declarations. ! logical :: Ldefine, NewFile integer :: ifile, lstr, status, tile ! SourceFile='output.F' ! !----------------------------------------------------------------------- ! Turn on output data time wall clock. !----------------------------------------------------------------------- ! CALL wclock_on (ng, iNLM, 8) ! !----------------------------------------------------------------------- ! If appropriate, process nonlinear history NetCDF file. !----------------------------------------------------------------------- ! ! Turn off checking for analytical header files. ! IF (Lanafile) THEN Lanafile=.FALSE. END IF ! ! Create output history NetCDF file or prepare existing file to ! append new data to it. Also, notice that it is possible to ! create several files during a single model run. ! IF (LdefHIS(ng)) THEN IF (ndefHIS(ng).gt.0) THEN IF (idefHIS(ng).lt.0) THEN idefHIS(ng)=((ntstart(ng)-1)/ndefHIS(ng))*ndefHIS(ng) IF (idefHIS(ng).lt.iic(ng)-1) THEN idefHIS(ng)=idefHIS(ng)+ndefHIS(ng) END IF END IF IF ((nrrec(ng).ne.0).and.(iic(ng).eq.ntstart(ng))) THEN IF ((iic(ng)-1).eq.idefHIS(ng)) THEN Ldefine=.FALSE. ! finished file, delay ELSE ! creation of next file Ldefine=.TRUE. NewFile=.FALSE. ! unfinished file, inquire END IF ! content for appending idefHIS(ng)=idefHIS(ng)+nHIS(ng) ! restart offset ELSE IF ((iic(ng)-1).eq.idefHIS(ng)) THEN idefHIS(ng)=idefHIS(ng)+ndefHIS(ng) IF (nHIS(ng).ne.ndefHIS(ng).and.iic(ng).eq.ntstart(ng)) THEN idefHIS(ng)=idefHIS(ng)+nHIS(ng) ! multiple record offset END IF Ldefine=.TRUE. NewFile=.TRUE. ELSE Ldefine=.FALSE. END IF IF (Ldefine) THEN ! create new file or NrecHIS(ng)=0 ! inquire existing file ifile=(iic(ng)-1)/ndefHIS(ng)+1 IF (Master) THEN lstr=LEN_TRIM(HISbase(ng)) WRITE (HISname(ng),10) HISbase(ng)(1:lstr-3),ifile 10 FORMAT (a,'_',i4.4,'.nc') END IF CALL mp_bcasts (ng, iNLM, HISname(ng)) IF (ncHISid(ng).ne.-1) THEN CALL netcdf_close (ng, iNLM, ncHISid(ng)) END IF CALL def_his (ng, NewFile) IF (exit_flag.ne.NoError) RETURN END IF IF ((iic(ng).eq.ntstart(ng)).and.(nrrec(ng).ne.0)) THEN LwrtHIS(ng)=.FALSE. ! avoid writing initial ELSE ! fields during restart LwrtHIS(ng)=.TRUE. END IF ELSE IF (iic(ng).eq.ntstart(ng)) THEN CALL def_his (ng, ldefout(ng)) IF (exit_flag.ne.NoError) RETURN LwrtHIS(ng)=.TRUE. LdefHIS(ng)=.FALSE. END IF END IF END IF ! ! Write out data into history NetCDF file. Avoid writing initial ! conditions in perturbation mode computations. ! IF (LwrtHIS(ng)) THEN IF (LwrtPER(ng)) THEN IF ((iic(ng).gt.ntstart(ng)).and. & & (MOD(iic(ng)-1,nHIS(ng)).eq.0)) THEN IF (nrrec(ng).eq.0.or.iic(ng).ne.ntstart(ng)) THEN CALL wrt_his (ng) END IF IF (exit_flag.ne.NoError) RETURN END IF ELSE IF (MOD(iic(ng)-1,nHIS(ng)).eq.0) THEN CALL wrt_his (ng) IF (exit_flag.ne.NoError) RETURN END IF END IF END IF ! !----------------------------------------------------------------------- ! If appropriate, process floats NetCDF file. !----------------------------------------------------------------------- ! IF (Lfloats(ng).and. & & (Nfloats(ng).gt.0).and.(nFLT(ng).gt.0)) THEN ! ! Create output floats NetCDF file or prepare existing file to ! append new data to it. ! IF (LdefFLT(ng)) THEN IF (frrec(ng).eq.0) THEN NewFile=.TRUE. ELSE NewFile=.FALSE. END IF CALL def_floats (ng, NewFile) IF (exit_flag.ne.NoError) RETURN LdefFLT(ng)=.FALSE. END IF ! ! Write out data into floats NetCDF file. ! IF ((MOD(iic(ng)-1,nFLT(ng)).eq.0).and. & & ((frrec(ng).eq.0).or.(iic(ng).ne.ntstart(ng)))) THEN CALL wrt_floats (ng) IF (exit_flag.ne.NoError) RETURN END IF END IF ! !----------------------------------------------------------------------- ! If appropriate, process restart NetCDF file. !----------------------------------------------------------------------- ! ! Create output restart NetCDF file or prepare existing file to ! append new data to it. ! IF (LdefRST(ng)) THEN CALL def_rst (ng) IF (exit_flag.ne.NoError) RETURN LwrtRST(ng)=.TRUE. LdefRST(ng)=.FALSE. END IF ! ! Write out data into restart NetCDF file. ! IF (LwrtRST(ng)) THEN IF ((iic(ng).gt.ntstart(ng)).and. & & (MOD(iic(ng)-1,nRST(ng)).eq.0)) THEN CALL wrt_rst (ng) IF (exit_flag.ne.NoError) RETURN END IF END IF ! !----------------------------------------------------------------------- ! Turn off output data time wall clock. !----------------------------------------------------------------------- ! CALL wclock_off (ng, iNLM, 8) RETURN END SUBROUTINE output