Forced Lorenz 96

Overview

The forced_lorenz_96 model implements the standard Lorenz (1996) [1] equations except that the forcing term, F, is added to the state vector and is assigned an independent value at each gridpoint. The result is a model that is twice as big as the standard L96 model. The forcing can be allowed to vary in time or can be held fixed so that the model looks like the standard L96 but with a state vector that includes the constant forcing term. An option is also included to add random noise to the forcing terms as part of the time tendency computation which can help in assimilation performance. If the random noise option is turned off (see namelist) the time tendency of the forcing terms is 0.

DART state vector composition:

state variables

forcing terms

traditional Lorenz_96 state

“extended” state

indices 1 - 40

indices 41 - 80

The forced_lorenz_96 model has a work/workshop_setup.csh script that compiles and runs an example. This example is referenced in Section 20 of the DART_tutorial and is intended to provide insight into parameter estimation and model/assimilation behavior. Be aware that the input.nml file is modified by the workshop_setup.csh script.

Quick Start

To become familiar with the model, try this quick experiment.

  1. compile everything in the model/forced_lorenz_96/work directory.

    cd $DARTROOT/models/forced_lorenz_96/work
    ./quickbuild.ch
    
  2. make sure the input.nml looks like the following (there is a lot that has been left out for clarity, these are the settings of interest for this example):

    &perfect_model_obs_nml
       start_from_restart    = .true.,
       output_restart        = .true.,
       async                 = 0,
       restart_in_file_name  = "perfect_ics",
       obs_seq_in_file_name  = "obs_seq.in",
       obs_seq_out_file_name = "obs_seq.out",
       ...
    /
    
    &filter_nml
       async                    = 0,
       ens_size                 = 80,
       start_from_restart       = .true.,
       output_restart           = .true.,
       obs_sequence_in_name     = "obs_seq.out",
       obs_sequence_out_name    = "obs_seq.final",
       restart_in_file_name     = "filter_ics",
       restart_out_file_name    = "filter_restart",
       num_output_state_members = 80,
       num_output_obs_members   = 80,
       ...
    /
    
    &model_nml
       num_state_vars    = 40,
       forcing           = 8.00,
       delta_t           = 0.05,
       time_step_days    = 0,
       time_step_seconds = 3600,
       reset_forcing     = .false.,
       random_forcing_amplitude = 0.10
    /
    
  3. Run perfect_model_obs to generate true_state.nc and obs_seq.out. The default obs_seq.in will cause the model to advance for 1000 time steps.

    ./perfect_model_obs
    
  4. If you have ncview, explore the true_state.nc. Notice that the State Variable indices from 1-40 are the dynamical part of the model and 41-80 are the Forcing variables.

    ncview true_state.nc
    
  5. Run filter to generate preassim.nc, analysis.nc and obs_seq.final.

    ./filter
    
  6. Launch Matlab and run plot_ens_time_series.

    >> plot_ens_time_series
    Input name of prior or posterior diagnostics file for preassim.nc:
    preassim.nc
    OPTIONAL: if you have the true state and want it superimposed,
    provide the name of the input file. If not, enter a dummy filename.
    Input name of True State file for true_state.nc:
    true_state.nc
    Using state state variable IDs 1 13 27
    If these are OK, ;
    If not, please enter array of state variable ID's
    To choose from entire state enter A 25 50 75 (between 1 and 80)
    To choose traditional model state enter S 1 23 40 (between 1 and 40)
    To choose forcing estimates enter F 2 12 22 (between 1 and 40)
    (no intervening syntax required)
    A 20 30 40 60 70 80
    

    Indices 20, 30, and 40 will be from the dynamical part of the lorenz_96 attractor, indices 60, 70, and 80 will be the corresponding Forcing values. Here are some images for just indices 20 and 60. Click on each image for a high-res version.

Repeat the experiment with reset_forcing = .true. when creating the true state and reset_forcing = .false. when assimilating. What happens?

Namelist

The model also implements the variant of Smith (2001), which can be invoked by setting local_y = .true. in the &model_nml namelist in the input.nml file.

The &model_nml namelist is read from the input.nml file. Namelists start with an ampersand & and terminate with a slash /. Character strings that contain a / must be enclosed in quotes to prevent them from prematurely terminating the namelist.

&model_nml
   num_state_vars    = 40,
   forcing           = 8.00,
   delta_t           = 0.05,
   time_step_days    = 0,
   time_step_seconds = 3600,
   reset_forcing     = .false.,
   random_forcing_amplitude = 0.10
/

Description of each namelist entry

Item

Type

Description

num_state_vars

integer

Number of variables in model.

forcing

real(r8)

Forcing, F, for model.

delta_t

real(r8)

Non-dimensional timestep.

time_step_days

real(r8)

Base model time step maps to this much real time.

time_step_seconds

real(r8)

Base model time step maps to this.

reset_forcing

logical

If true, all forcing values are held fixed at the value specified for the forcing namelist.

random_forcing_amplitude

real(r8)

Standard deviation of the gaussian noise with zero mean that is added to each forcing value’s time step.

References