Opened 12 years ago
Closed 12 years ago
#605 closed bug (Fixed)
Corrected FLOATS restart — at Version 1
| Reported by: | arango | Owned by: | arango |
|---|---|---|---|
| Priority: | major | Milestone: | Release ROMS/TOMS 3.7 |
| Component: | Nonlinear | Version: | 3.7 |
| Keywords: | Cc: |
Description (last modified by )
Corrected a problem in def_floats.F when setting the DRIFTER(ng)%bounded switch during restart. If the floats have not been released yet at restart time, the values of Xgrid, Ygrid, and Zgrid will be _FillValue (i.e. 1.0E+37) in the FLOATS NetCDF file. The calls to netcdf_get_fvar in def_floats.F will replace such values with zeros.
Therefore, we need to read Zgrid first so the DRIFTER(ng)%bounded switch is FALSE in such cases to trigger the release. This switch will be set corrected if Xgrid and Ygrid are read last. The zero values in Xgrid and/or Ygrid due to unreleased floats will set DRIFTER(ng)%bounded=FALSE because of the lower bound is 0.5 in fractional coordinates. So the order of operations in def_floats.F is very important during restart.
The correct code is then:
# ifdef SOLVE3D
CALL netcdf_get_fvar (ng, iNLM, ncname, 'Zgrid', &
& Tinp, &
& ncid = FLT(ng)%ncid, &
& start = (/1,FLT(ng)%Rindex/), &
& total = (/Nfloats(ng),1/))
IF (exit_flag.ne.NoError) RETURN
DO l=1,Nfloats(ng)
IF ((Tinp(l).gt.REAL(N(ng),r8)).or. &
& (Tinp(l).lt.0.0_r8)) THEN
DRIFTER(ng)%bounded(l)=.FALSE.
ELSE
DRIFTER(ng)%bounded(l)=.TRUE.
DO i=0,NFT
DRIFTER(ng)%track(izgrd,i,l)=Tinp(l)
DRIFTER(ng)%track(izrhs,i,l)=0.0_r8
END DO
END IF
END DO
!
# endif
CALL netcdf_get_fvar (ng, iNLM, ncname, 'Xgrid', &
& Tinp, &
& ncid = FLT(ng)%ncid, &
& start = (/1,FLT(ng)%Rindex/), &
& total = (/Nfloats(ng),1/))
IF (exit_flag.ne.NoError) RETURN
DO l=1,Nfloats(ng)
IF ((Tinp(l).gt.REAL(Lm(ng)+1,r8)-0.5_r8).or. &
& (Tinp(l).lt.0.5_r8)) THEN
DRIFTER(ng)%bounded(l)=.FALSE.
ELSE
DRIFTER(ng)%bounded(l)=.TRUE.
DO i=0,NFT
DRIFTER(ng)%track(ixgrd,i,l)=Tinp(l)
DRIFTER(ng)%track(ixrhs,i,l)=0.0_r8
END DO
END IF
END DO
!
CALL netcdf_get_fvar (ng, iNLM, ncname, 'Ygrid', &
& Tinp, &
& ncid = FLT(ng)%ncid, &
& start = (/1,FLT(ng)%Rindex/), &
& total = (/Nfloats(ng),1/))
IF (exit_flag.ne.NoError) RETURN
DO l=1,Nfloats(ng)
IF ((Tinp(l).gt.REAL(Mm(ng)+1,r8)-0.5_r8).or. &
& (Tinp(l).lt.0.5_r8)) THEN
DRIFTER(ng)%bounded(l)=.FALSE.
ELSE
DRIFTER(ng)%bounded(l)=.TRUE.
DO i=0,NFT
DRIFTER(ng)%track(iygrd,i,l)=Tinp(l)
DRIFTER(ng)%track(iyrhs,i,l)=0.0_r8
END DO
END IF
END DO
Many thanks to Diego Narvaez for bringing this issue to my attention. This issue was also discussed in forum sometime ago but I was not able to reproduce it. We didn't have enough information.
I also correct a bug in packing.F when computing the norm in parallel. Many thanks to Andy for reporting this problem.
Change History (1)
comment:1 by , 12 years ago
| Description: | modified (diff) |
|---|---|
| Resolution: | → Fixed |
| Status: | new → closed |
