--- Welcome to the official ADCIRCWiki site! The site is currently under construction, with limited information. ---

For general information, see the ADCIRC site, ADCIRC FAQ, or the ADCIRC Wikipedia page. For model documentation not yet available on the wiki, see the ADCIRC site. New content is being continuously added to the ADCIRCWiki, and material from the main ADCIRC site will be gradually transitioned over to the wiki.

Dynamic water level correction

Jump to navigation Jump to search

Improvements in forecasting and hindcasting of tropical cyclones have led to much more accurate meteorological data associated with these storms. These improvements, together with more detailed representations of the physics and greater model resolution, have improved storm surge model skill. This has led to a state in which storm surge forecast and hindcast errors are often dominated by what we refer to as unresolved drivers, i.e., physical processes that are not explicitly included in storm surge models. Common examples include baroclinic processes, major oceanic currents, precipitation, steric fluctuations and far-field atmospheric forcing. These phenomena typically have longer timescales than the storm surge itself and therefore often show up as biases in water level during the period leading up to, encompassing and following the surge event. [From T.G.Asher]

[include reference to Taylor's paper in references section at end]

AMS 2017 Presentation from Luettich, et al:

Representing Low Frequency, Spatially Varying Waterlevel Anomalies in Storm Surge Forecasting


[include link to Rick's powerpoint slides] [include reference to Rick's powerpoint slides in references section at end]

In order to accommodate these unresolved drivers, a water level offset ingestion feature has been added to ADCIRC.

Controlling Water Level Offset

The water level offset feature is triggered by the presence of the &offsetControl namelist at the bottom of the fort.15 file. Here is an example of how this line is used:

&offsetControl offsetFileName="hsofs_offset_test_ft.dat"  offsetMultiplier=0.3048,  offsetRampStart=0.0,  offsetRampEnd=259200.0  offsetRampReferenceTime="hotstart", offsetSkipSnaps=0  /

The code looks for the water level offset file in the same directory as the other fulldomain files, both in serial and in parallel. In parallel, each subdomain does domain decomposition of the offset data on the fly, so the only change to adcprep is the read/write of the new namelist to the subdomain fort.15 files.

The multiplier value allows us to easily change the entire dataset by single factor. It may be needed in a case where the data were provided in ft but adcirc requires meters, for example.

The offsetRampStart and offsetRampEnd parameter are the time in seconds for a linear ramp up period. The offsetRampReferenceTime parameter controls whether the ramp times are relative to the hotstart time or the coldstart time. Prior to the start of the ramp, the offset values are multiplied by 0.0, eliminating the offset until the ramp period starts.

The input parameter offsetSkipSnaps is used to skip the specified number of initial data sets in the offsets data file. It can also be used to insert blank snaps at the beginning of the run if it is negative.

Water Level Offset Input File

The water level offset input file starts with the following three lines:

# test file for 1ft offset on hsofs mesh during matthew
14400.0 # time increment between datasets -- read but ignored if constant offset
0.0 # default offset value

The first line is a comment line. The second line is the time interval in seconds between successive datasets. The third line is the default offset value; this allows us to create offset input files in a "sparse" format where only the non-default values are provided.

If there is only one dataset in the offset file, then the values are treated as temporally constant. If there is more than one dataset, ADCIRC linearly interpolates between them in time. If ADCIRC runs out of offset data, it continues with the last dataset as a set of constant values for the remainder of the run.

Because each offset dataset may have a different number of values, the # (hash, pound, or number) symbol is used as a separator. Specifically, users should place a line containing # in the first and second columns, i.e. ##, of the file. When ADCIRC sees this, it knows it has reached the end of the dataset it is currently reading and understands the next line is the start of the next time snap of data.


If a water level offset input file is specified, then the time interpolated water level offset values will be written to a file called offset.63 on the same schedule as output to the fort.63. Currently, the offset.63 file can only be produced in ASCII format. This file can then be used as a diagnostic to check that the offset values have been applied as expected.


Although the offset is implemented as a pseudo barometric pressure, it is entirely independent of any/all meteorological forcing and meteorological data. The values do not show up in the fort.71 (barometric pressure stations) or fort.73 (fulldomain barometric pressure field) output files. The offset can be used with any meteorological forcing data, or with no meteorological forcing data at all.


An ADCIRC model is coldstarted with a tide only run that uses a 10 day ramp, and runs for 15 days. How should the water level offset be configured?

In this case I suggest that you apply your bias correction after reaching full strength tidal forcing (i.e., after the 10 day tidal ramp). So to have your bias correction ramp completed at the end of the 15 day tidal spinup, I would start the ramp period at 14.5 days and end it at 15.0 days. That way you'll be able to clearly see the correction occurring when you look at the output data.

In summary, I suggest you set your ramp period as follows:

offsetRampStart =1252800.0, offsetRampEnd = 1296000.0

For the bias correction data file for this 15.0 day tidal spinup case, you'll only need a single data set, which will be treated as a constant value because there is only one dataset, so the format of the file will be for example

  1. bias correction values test for GFS 20161002 cycle 00Z

99999.9 # time increment in seconds; not used in this case 0.0 # default nodal value applied to any node not specified below 234 0.5 <-- node number and final bias correction value 1223 0.6 1789 -0.2 4000 0.1

# <-- hash tag in second column indicating the end of the dataset 

After the spinup, in preparation for a forecast run, when you want to migrate from one set of bias correction values to another over a 6 hour time period, your offsetControl line would be something like this:

&offsetControl offsetFileName= "offset_migration_from_00Z_to_06Z.dat", offsetMultiplier = 1.0, offsetRampStart = 1252800.0, offsetRampEnd = 1296000.0, offsetRampReferenceTime = "coldstart", offsetSkipSnaps = 0 /

and the corresponding file would look like something like the following:

  1. bias correction values for GFS 20161002 from cycle 00Z to cycle 06Z

21600.0 # 6 hour time increment in seconds 0.0 # default nodal value applied to any node not specified below 234 0.5 <--- values match those at the end of the tidal spinup 1223 0.6 1789 -0.2 4000 0.1

# <-- hash tag in second column indicating the end of the first dataset 

512 0.3 <-- new values for updated bias correction at 06Z, not necessarily defined at the same list of nodes 1001 -0.5 2346 0.74 4000 -0.1

# <-- hash tag in second column indicating the end of the second dataset 

At the end of the 15.0 day tidal spinup in this example the bias correction at node 234 would be 0.5. Three hours later (after the hotstart) it would be 0.25. Six hours after the hotstart it would be zero.

At the end of the 15.0 day tidal spinup in this example the bias correction at node 1001 would be 0.0. Three hours later (after the hotstart) it would be -0.25. Six hours after the hotstart it would be -0.5.

At the end of the 15.0 day tidal spinup in this example the bias correction at node 4000 would be 0.1. Three hours later (after the hotstart) it would be 0.0. Six hours after the hotstart it would be -0.1.

Frequently Asked Questions

Question: When writing the &offsetControl namelist, should I write the parameters on a single line, comma separated?

Answer: I always put fortran namelist parameters on a single line and separate the assignments with commas, but other formatting may be possible depending on the compiler you are using. I've never had issues with the way I format these fortran namelist input lines, but I've never tried any other way so I'll defer to your compiler's documentation on that.

Question: Do I need to ramp the offset, i.e., is it wise to do so for some reason?

Answer: We haven't tried a sudden application of the water level offset to the solution so we don't yet know how that would behave. Our shortest ramp up period is 12 hours but you might get away with 6 hours or even less.

Question: Does the application of a dynamic water level offset surface affect the velocity solution (not just the elevation solution as it is primarily intended)?

Answer: Yes, in a physically realistic manner. As an example, when applying a water level offset to a back bay area with a nearby tidal inlet, the water level change in the back bay must be reflected in the velocity in the inlet in order to maintain continuity (conservation of mass). In the case of an initial application of a temporally steady water level offset, this velocity effect will be a one-time occurrence. On the other hand, for a time varying water level offset surface, the continuous adjustments to the water level will be continuously reflected in the velocity solution in physically realistic ways.


[Ricks 2017 AMS ppt] [Taylor's manuscript]