diff --git a/ROMS/Nonlinear/lmd_vmix.F b/ROMS/Nonlinear/lmd_vmix.F index 694f75d..be56e1c 100644 --- a/ROMS/Nonlinear/lmd_vmix.F +++ b/ROMS/Nonlinear/lmd_vmix.F @@ -37,6 +37,7 @@ USE mod_grid USE mod_mixing USE mod_ocean + USE mod_scalars USE mod_stepping ! # ifdef LMD_SKPP @@ -57,7 +58,8 @@ # ifdef PROFILE CALL wclock_on (ng, iNLM, 18) # endif - CALL lmd_vmix_tile (ng, tile, & + IF (.not.PerfectRST(ng).or.iic(ng).ne.ntstart(ng)) THEN + CALL lmd_vmix_tile (ng, tile, & & LBi, UBi, LBj, UBj, & & IminS, ImaxS, JminS, JmaxS, & & nstp(ng), & @@ -76,12 +78,13 @@ & MIXING(ng) % Akt, & & MIXING(ng) % Akv) # ifdef LMD_SKPP - CALL lmd_skpp (ng, tile) + CALL lmd_skpp (ng, tile) # endif # ifdef LMD_BKPP - CALL lmd_bkpp (ng, tile) + CALL lmd_bkpp (ng, tile) # endif - CALL lmd_finish (ng, tile) + CALL lmd_finish (ng, tile) + END IF # ifdef PROFILE CALL wclock_off (ng, iNLM, 18) # endif diff --git a/ROMS/Utility/checkvars.F b/ROMS/Utility/checkvars.F index 033aafa..3b37251 100644 --- a/ROMS/Utility/checkvars.F +++ b/ROMS/Utility/checkvars.F @@ -327,6 +327,20 @@ have_var(idTdif)=.TRUE. ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idSdif))) THEN have_var(idSdif)=.TRUE. +# ifdef LMD_SKPP + ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idHsbl))) THEN + have_var(idHsbl)=.TRUE. +# endif +# ifdef LMD_BKPP + ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idHbbl))) THEN + have_var(idHbbl)=.TRUE. +# endif +# ifdef LMD_NONLOCAL + ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idGhat(itemp)))) THEN + have_var(idGhat(itemp))=.TRUE. + ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idGhat(isalt)))) THEN + have_var(idGhat(isalt))=.TRUE. +# endif # endif # if defined GLS_MIXING || defined MY25_MIXING ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idMtke))) THEN diff --git a/ROMS/Utility/def_rst.F b/ROMS/Utility/def_rst.F index 7768fed..a0ebc7f 100644 --- a/ROMS/Utility/def_rst.F +++ b/ROMS/Utility/def_rst.F @@ -1008,7 +1008,7 @@ Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idHsbl,ng),r8) status=def_var(ng, iNLM, RST(ng)%ncid, RST(ng)%Vid(idHsbl), & - & NF_FRST, nvd3, t2dgrd, Aval, Vinfo, ncname) + & NF_FRST, nvd3, sr2dgrd, Aval, Vinfo, ncname) IF (exit_flag.ne.NoError) RETURN # endif @@ -1032,9 +1032,30 @@ Vinfo(22)='coordinates' Aval(5)=REAL(Iinfo(1,idHbbl,ng),r8) status=def_var(ng, iNLM, RST(ng)%ncid, RST(ng)%Vid(idHbbl), & - & NF_FRST, nvd3, t2dgrd, Aval, Vinfo, ncname) + & NF_FRST, nvd3, sr2dgrd, Aval, Vinfo, ncname) IF (exit_flag.ne.NoError) RETURN # endif +# if defined PERFECT_RESTART && defined LMD_NONLOCAL +! +! Define out KPP nonlocal transport. +! + DO itrc=1,NAT + Vinfo( 1)=Vname(1,idGhat(itrc)) + Vinfo( 2)=Vname(2,idGhat(itrc)) + Vinfo( 3)=Vname(3,idGhat(itrc)) + Vinfo(14)=Vname(4,idGhat(itrc)) + Vinfo(16)=Vname(1,idtime) +# if defined WRITE_WATER && defined MASKING + Vinfo(20)='mask_rho' +# endif + Vinfo(22)='coordinates' + Aval(5)=REAL(Iinfo(1,idGhat(itrc),ng),r8) + status=def_var(ng, iNLM, RST(ng)%ncid, & + & RST(ng)%Vid(idGhat(itrc)), NF_FRST, & + & nvd4, w3dgrd, Aval, Vinfo, ncname) + IF (exit_flag.ne.NoError) RETURN + END DO +# endif # if defined BVF_MIXING || defined LMD_MIXING || \ defined GLS_MIXING || defined MY25_MIXING ! @@ -1551,6 +1572,16 @@ got_var(idHbbl)=.TRUE. RST(ng)%Vid(idHbbl)=var_id(i) # endif +# if defined PERFECT_RESTART && defined LMD_NONLOCAL + ELSE IF (TRIM(var_name(i)).eq. & + & TRIM(Vname(1,idGhat(itemp)))) THEN + got_var(idGhat(itemp))=.TRUE. + RST(ng)%Vid(idGhat(itemp))=var_id(i) + ELSE IF (TRIM(var_name(i)).eq. & + & TRIM(Vname(1,idGhat(isalt)))) THEN + got_var(idGhat(isalt))=.TRUE. + RST(ng)%Vid(idGhat(isalt))=var_id(i) +# endif ELSE IF (TRIM(var_name(i)).eq.TRIM(Vname(1,idVvis))) THEN got_var(idVvis)=.TRUE. RST(ng)%Vid(idVvis)=var_id(i) diff --git a/ROMS/Utility/get_state.F b/ROMS/Utility/get_state.F index 97221ff..0c3f8fc 100644 --- a/ROMS/Utility/get_state.F +++ b/ROMS/Utility/get_state.F @@ -168,7 +168,7 @@ Perfect3D=.TRUE. END IF #endif - PerfectRST(ng)=Perfect2d.or.Perfect3d + PerfectRST(ng)=Perfect2D.or.Perfect3D ! ! Determine variables to read. ! @@ -441,12 +441,12 @@ IF (get_var(idFsur)) THEN foundit=find_string(var_name, n_var, TRIM(Vname(1,idFsur)), & & varid) - IF (Perfect2d) THEN + IF (Perfect2D) THEN gtype=var_flag(varid)*r3dvar ELSE gtype=var_flag(varid)*r2dvar END IF - IF (Perfect2d) THEN + IF (Perfect2D) THEN status=nf_fread3d(ng, IDmod, ncname, ncINPid, & & Vname(1,idFsur), varid, & & InpRec, gtype, Vsize, & @@ -970,6 +970,104 @@ END IF # endif # endif +# if defined LMD_SKPP +! +! Read in Hsbl +! + IF (have_var(idHsbl).and.Perfect3D) THEN + foundit=find_string(var_name, n_var, TRIM(Vname(1,idHsbl)), & + & varid) + gtype=var_flag(varid)*r2dvar + status=nf_fread2d(ng, IDmod, ncname, ncINPid, & + & Vname(1,idHsbl), varid, & + & InpRec, gtype, Vsize, & + & LBi, UBi, LBj, UBj, & + & Fscl, Fmin, Fmax, & +# ifdef MASKING + & GRID(ng) % rmask, & +# endif + & MIXING(ng) % Hsbl) + IF (status.ne.nf90_noerr) THEN + IF (Master) THEN + WRITE (stdout,60) string, TRIM(Vname(1,idHsbl)), InpRec, & + & TRIM(ncname) + END IF + exit_flag=2 + ioerror=status + RETURN + ELSE + IF (Master) THEN + WRITE (stdout,70) TRIM(Vname(2,idHsbl)), Fmin, Fmax + END IF + END IF + END IF +# endif +# if defined LMD_BKPP +! +! Read in Hbbl +! + IF (have_var(idHbbl).and.Perfect3D) THEN + foundit=find_string(var_name, n_var, TRIM(Vname(1,idHbbl)), & + & varid) + gtype=var_flag(varid)*r2dvar + status=nf_fread2d(ng, IDmod, ncname, ncINPid, & + & Vname(1,idHbbl), varid, & + & InpRec, gtype, Vsize, & + & LBi, UBi, LBj, UBj, & + & Fscl, Fmin, Fmax, & +# ifdef MASKING + & GRID(ng) % rmask, & +# endif + & MIXING(ng) % Hbbl) + IF (status.ne.nf90_noerr) THEN + IF (Master) THEN + WRITE (stdout,60) string, TRIM(Vname(1,idHbbl)), InpRec, & + & TRIM(ncname) + END IF + exit_flag=2 + ioerror=status + RETURN + ELSE + IF (Master) THEN + WRITE (stdout,70) TRIM(Vname(2,idHbbl)), Fmin, Fmax + END IF + END IF + END IF +# endif +# if defined LMD_NONLOCAL && defined PERFECT_RESTART +! +! Read in Ghats +! + DO itrc=1,NAT + IF (have_var(idGhat(itrc))) THEN + foundit=find_string(var_name, n_var, & + & TRIM(Vname(1,idGhat(itrc))), varid) + gtype=var_flag(varid)*w3dvar + status=nf_fread3d(ng, IDmod, ncname, ncINPid, & + & Vname(1,idGhat(itrc)), varid, & + & InpRec, gtype, Vsize, & + & LBi, UBi, LBj, UBj, 0, N(ng), & + & Fscl, Fmin,Fmax, & +# ifdef MASKING + & GRID(ng) % rmask, & +# endif + & MIXING(ng) % Ghats(:,:,:,itrc)) + IF (status.ne.nf90_noerr) THEN + IF (Master) THEN + WRITE (stdout,60) string, TRIM(Vname(1,idGhat(itrc))), & + & InpRec, TRIM(ncname) + END IF + exit_flag=2 + ioerror=status + RETURN + ELSE + IF (Master) THEN + WRITE (stdout,70) TRIM(Vname(2,idGhat(itrc))), Fmin, Fmax + END IF + END IF + END IF + END DO +# endif # if defined GLS_MIXING || defined MY25_MIXING ! ! Read in turbulent kinetic energy. diff --git a/ROMS/Utility/wrt_rst.F b/ROMS/Utility/wrt_rst.F index 8b4045a..6272b9b 100644 --- a/ROMS/Utility/wrt_rst.F +++ b/ROMS/Utility/wrt_rst.F @@ -593,6 +593,31 @@ RETURN END IF # endif +# if defined PERFECT_RESTART && defined LMD_NONLOCAL +! +! Write out KPP nonlocal transport. +! + DO i=1,NAT + scale=1.0_r8 + gtype=gfactor*w3dvar + status=nf_fwrite3d(ng, iNLM, RST(ng)%ncid, & + & RST(ng)%Vid(idGhat(i)), & + & RST(ng)%Rindex, gtype, & + & LBi, UBi, LBj, UBj, 0, N(ng), scale, & +# ifdef MASKING + & GRID(ng) % rmask_io, & +# endif + & MIXING(ng) % ghats(:,:,:,i)) + IF (status.ne.nf90_noerr) THEN + IF (Master) THEN + WRITE (stdout,10) TRIM(Vname(1,idGhat(i))), RST(ng)%Rindex + END IF + exit_flag=3 + ioerror=status + RETURN + END IF + END DO +# endif # if defined BVF_MIXING || defined GLS_MIXING || \ defined MY25_MIXING || defined LMD_MIXING !