The usual way HYCOM dies is with a negative dp (layer thickness), which indicates a CFL violation (velocity too high). For example:
84213420 i,j,k= 540 240 13 neg. dp (m) in loop 15 -1.1 max
84213420 i,j,k= 540 240 14 neg. dp (m) in loop 15 -1.2 max
84213420 i,j,k= 542 240 15 neg. dp (m) in loop 15 -0.13E+04 max
84213420 i,j,k= 542 240 15 neg. dp (m) in loop 15 -0.13E+04 fatal
This negative value is fatal if it is <= -10m.
This is only checked every 3 time steps, so it is possible some other bad thing happens before this check. However, I would be very surprised if you got a segmentation fault with no "neg. dp" messages. The advantage of these messages is that they tell you where the error occurred. You can then use hycom_profile on a 3-D archive file to see what that water column looks like.
The usual approach is to halve the baclin time step, leaving the batrop time step as close to its existing value as possible, are rerrun the last model segment.
It would not hurt to check the forcing files. Their .b files have min and max values, but a NaN would not show up. So run hycom_NaN on the forcing files as a check.
Finally, you may get fewer neg. dp's if you set the MOMTUM_CFL macro at compile time:
# Miscellaneous CPP flags (-DSTOKES -DOCEANS2 etc...)
# -DSTOKES : Stokes drift
# -DOCEANS2 : master and slave HYCOM in same executable
# -DMOMTUM_CFL : include an explicit CFL limiter
# -DMOMTUM4_CFL : include an explicit CFL limiter
# -DRDNEST_MASK : mask velocity outliers
# -DLATBDT_NPLINE3 : update pline every 3 time steps
# -DMASSLESS_1MM : lowest substantial mass-containing layer > 1mm thick
#setenv OCN_MISC ""
#setenv OCN_MISC "-DMASSLESS_1MM -DRDNEST_MASK -DLATBDT_NPLINE3"
setenv OCN_MISC "-DMASSLESS_1MM -DMOMTUM_CFL"
If it is already set, this might be why you don't see neg. dp's. The downside of MOMTUM_CFL is that it non-physically clips large velocities and so will cause problems of its own if turned on too often. It produces at report in the .log file, search for maxspd:
!
! --- Only report new CFL maximums
!
do k= 1,kk
if (cflclp(k).gt.cflmax(k)) then
cflmax(k) = cflclp(k) !save new maximum
if (mnproc.eq.1) then
write(lp, '(i9,a, &
&'' L '',i3,'' maxspd,clip (m/s):'',2f10.4)') &
nstep,c_ydh, &
k,cflspd(k),cflclp(k)
call flush(lp)
Alan.