From 5ecb81c8ac682e94adb233aa28c6c6d7d177528c Mon Sep 17 00:00:00 2001 From: Helen Kershaw Date: Thu, 25 May 2023 14:08:31 -0400 Subject: [PATCH] removed smoother code and docs See #479 for discussion &smoother_nml is still in a bunch of input.nmls --- README.rst | 1 - .../assimilation/filter_mod.dopplerfold.f90 | 76 +-- .../modules/assimilation/filter_mod.f90 | 76 +-- .../modules/assimilation/filter_mod.rst | 1 - .../modules/assimilation/smoother_mod.f90 | 584 ------------------ .../modules/assimilation/smoother_mod.nml | 7 - .../modules/assimilation/smoother_mod.rst | 522 ---------------- .../modules/assimilation/smootherdatadart.ps | Bin 77478 -> 0 bytes .../assimilation/smootherdatadartexplain.ps | Bin 85718 -> 0 bytes 9 files changed, 2 insertions(+), 1265 deletions(-) delete mode 100644 assimilation_code/modules/assimilation/smoother_mod.f90 delete mode 100644 assimilation_code/modules/assimilation/smoother_mod.nml delete mode 100644 assimilation_code/modules/assimilation/smoother_mod.rst delete mode 100644 assimilation_code/modules/assimilation/smootherdatadart.ps delete mode 100644 assimilation_code/modules/assimilation/smootherdatadartexplain.ps diff --git a/README.rst b/README.rst index b953f5cb9e..32a286d07b 100644 --- a/README.rst +++ b/README.rst @@ -488,7 +488,6 @@ References assimilation_code/modules/observations/obs_kind_mod assimilation_code/modules/observations/DEFAULT_obs_kind_mod assimilation_code/modules/observations/obs_sequence_mod - assimilation_code/modules/assimilation/smoother_mod assimilation_code/modules/assimilation/assim_readme assimilation_code/modules/assimilation/assim_tools_mod assimilation_code/modules/assimilation/cov_cutoff_mod diff --git a/assimilation_code/modules/assimilation/filter_mod.dopplerfold.f90 b/assimilation_code/modules/assimilation/filter_mod.dopplerfold.f90 index b829a82e50..8ac1147de6 100644 --- a/assimilation_code/modules/assimilation/filter_mod.dopplerfold.f90 +++ b/assimilation_code/modules/assimilation/filter_mod.dopplerfold.f90 @@ -65,12 +65,6 @@ module filter_mod use mpi_utilities_mod, only : my_task_id, task_sync, broadcast_send, broadcast_recv, & task_count -use smoother_mod, only : smoother_read_restart, advance_smoother, & - smoother_gen_copy_meta_data, smoother_write_restart, & - init_smoother, do_smoothing, smoother_mean_spread, & - smoother_assim, smoother_ss_diagnostics, & - smoother_end, set_smoother_trace - use random_seq_mod, only : random_seq_type, init_random_seq, random_gaussian use state_vector_io_mod, only : state_vector_io_init, read_state, write_state, & @@ -358,9 +352,8 @@ subroutine filter_main() type(file_info_type) :: file_info_output type(file_info_type) :: file_info_all -logical :: ds, all_gone, allow_missing +logical :: all_gone, allow_missing -! real(r8), allocatable :: temp_ens(:) ! for smoother real(r8), allocatable :: prior_qc_copy(:) call filter_initialize_modules_used() ! static_init_model called in here @@ -392,8 +385,6 @@ subroutine filter_main() write(msgstring, '(A,I5)') 'running with an ensemble size of ', ens_size call error_handler(E_MSG,'filter_main:', msgstring, source) -! See if smoothing is turned on -ds = do_smoothing() call set_missing_ok_status(allow_missing_clm) allow_missing = get_missing_ok_status() @@ -551,13 +542,6 @@ subroutine filter_main() ! Set a time type for initial time if namelist inputs are not negative call filter_set_initial_time(init_time_days, init_time_seconds, time1, read_time_from_file) -! Moved this. Not doing anything with it, but when we do it should be before the read -! Read in or initialize smoother restarts as needed -if(ds) then - call init_smoother(state_ens_handle, POST_INF_COPY, POST_INF_SD_COPY) - call smoother_read_restart(state_ens_handle, ens_size, model_size, time1, init_time_days) -endif - call trace_message('Before reading in ensemble restart files') call timestamp_message('Before reading in ensemble restart files') @@ -613,11 +597,6 @@ subroutine filter_main() prior_obs_spread_index, posterior_obs_spread_index, & compute_posterior) -if(ds) call error_handler(E_ERR, 'filter', 'smoother broken by Helen') - -!>@todo fudge -if(ds) call smoother_gen_copy_meta_data(num_output_state_members, output_inflation=.true.) - call timestamp_message('After initializing output files') call trace_message('After initializing output files') @@ -735,15 +714,6 @@ subroutine filter_main() ! if model state data not at required time, advance model if (curr_ens_time /= next_ens_time) then - ! Advance the lagged distribution, if needed. - ! Must be done before the model runs and updates the data. - if(ds) then - call trace_message('Before advancing smoother') - call timestamp_message('Before advancing smoother') - call advance_smoother(state_ens_handle) - call timestamp_message('After advancing smoother') - call trace_message('After advancing smoother') - endif ! we are going to advance the model - make sure we're doing single file output if (.not. has_cycling) then @@ -928,24 +898,6 @@ subroutine filter_main() call timestamp_message('After observation assimilation') call trace_message('After observation assimilation') - ! Do the update for the smoother lagged fields, too. - ! Would be more efficient to do these all at once inside filter_assim - ! in the future - if(ds) then - write(msgstring, '(A,I8,A)') 'Ready to reassimilate up to', size(keys), ' observations in the smoother' - call trace_message(msgstring, 'filter:', -1) - - call trace_message('Before smoother assimilation') - call timestamp_message('Before smoother assimilation') - call smoother_assim(obs_fwd_op_ens_handle, seq, keys, ens_size, num_groups, & - obs_val_index, ENS_MEAN_COPY, ENS_SD_COPY, & - PRIOR_INF_COPY, PRIOR_INF_SD_COPY, OBS_KEY_COPY, OBS_GLOBAL_QC_COPY, & - OBS_MEAN_START, OBS_MEAN_END, OBS_VAR_START, & - OBS_VAR_END) - call timestamp_message('After smoother assimilation') - call trace_message('After smoother assimilation') - endif - ! Already transformed, so compute mean and spread for state diag as needed call compute_copy_mean_sd(state_ens_handle, 1, ens_size, ENS_MEAN_COPY, ENS_SD_COPY) @@ -982,11 +934,6 @@ subroutine filter_main() call write_state(state_ens_handle, file_info_postassim) endif - !>@todo What to do here? - !call smoother_ss_diagnostics(model_size, num_output_state_members, & - ! output_inflation, temp_ens, ENS_MEAN_COPY, ENS_SD_COPY, & - ! POST_INF_COPY, POST_INF_SD_COPY) - call timestamp_message('After postassim state space output') call trace_message('After postassim state space output') @@ -1035,12 +982,6 @@ subroutine filter_main() call timestamp_message('After computing posterior observation values') call trace_message('After computing posterior observation values') - if(ds) then - call trace_message('Before computing smoother means/spread') - call smoother_mean_spread(ens_size, ENS_MEAN_COPY, ENS_SD_COPY) - call trace_message('After computing smoother means/spread') - endif - call trace_message('Before posterior obs space diagnostics') ! Write posterior observation space diagnostics @@ -1104,11 +1045,6 @@ subroutine filter_main() call write_state(state_ens_handle, file_info_analysis) endif - !>@todo What to do here? - !call smoother_ss_diagnostics(model_size, num_output_state_members, & - ! output_inflation, temp_ens, ENS_MEAN_COPY, ENS_SD_COPY, & - ! POST_INF_COPY, POST_INF_SD_COPY) - call timestamp_message('After analysis state space output') call trace_message('After analysis state space output') @@ -1153,9 +1089,6 @@ subroutine filter_main() if (.not. write_all_stages_at_end) & call write_state(state_ens_handle, file_info_output) - !>@todo need to fix smoother - !if(ds) call smoother_write_restart(1, ens_size) - call timestamp_message('After state space output') call trace_message('After state space output') @@ -1215,12 +1148,6 @@ subroutine filter_main() call destroy_obs_sequence(seq) call trace_message('After ensemble and obs memory cleanup') -if(ds) then - call trace_message('Before smoother memory cleanup') - call smoother_end() - call trace_message('After smoother memory cleanup') -endif - call trace_message('Filter done') call timestamp_message('Filter done') if(my_task_id() == 0) then @@ -1875,7 +1802,6 @@ subroutine set_trace(trace_execution, output_timestamps, silence) timestamp_level = -1 endif -call set_smoother_trace(trace_level, timestamp_level) call set_obs_model_trace(trace_level, timestamp_level) call set_assim_tools_trace(trace_level, timestamp_level) diff --git a/assimilation_code/modules/assimilation/filter_mod.f90 b/assimilation_code/modules/assimilation/filter_mod.f90 index db60ff3dfe..2999c03145 100644 --- a/assimilation_code/modules/assimilation/filter_mod.f90 +++ b/assimilation_code/modules/assimilation/filter_mod.f90 @@ -65,12 +65,6 @@ module filter_mod use mpi_utilities_mod, only : my_task_id, task_sync, broadcast_send, broadcast_recv, & task_count -use smoother_mod, only : smoother_read_restart, advance_smoother, & - smoother_gen_copy_meta_data, smoother_write_restart, & - init_smoother, do_smoothing, smoother_mean_spread, & - smoother_assim, smoother_ss_diagnostics, & - smoother_end, set_smoother_trace - use random_seq_mod, only : random_seq_type, init_random_seq, random_gaussian use state_vector_io_mod, only : state_vector_io_init, read_state, write_state, & @@ -353,9 +347,8 @@ subroutine filter_main() type(file_info_type) :: file_info_output type(file_info_type) :: file_info_all -logical :: ds, all_gone, allow_missing +logical :: all_gone, allow_missing -! real(r8), allocatable :: temp_ens(:) ! for smoother real(r8), allocatable :: prior_qc_copy(:) call filter_initialize_modules_used() ! static_init_model called in here @@ -387,9 +380,6 @@ subroutine filter_main() write(msgstring, '(A,I5)') 'running with an ensemble size of ', ens_size call error_handler(E_MSG,'filter_main:', msgstring, source) -! See if smoothing is turned on -ds = do_smoothing() - call set_missing_ok_status(allow_missing_clm) allow_missing = get_missing_ok_status() @@ -546,13 +536,6 @@ subroutine filter_main() ! Set a time type for initial time if namelist inputs are not negative call filter_set_initial_time(init_time_days, init_time_seconds, time1, read_time_from_file) -! Moved this. Not doing anything with it, but when we do it should be before the read -! Read in or initialize smoother restarts as needed -if(ds) then - call init_smoother(state_ens_handle, POST_INF_COPY, POST_INF_SD_COPY) - call smoother_read_restart(state_ens_handle, ens_size, model_size, time1, init_time_days) -endif - call trace_message('Before reading in ensemble restart files') call timestamp_message('Before reading in ensemble restart files') @@ -608,11 +591,6 @@ subroutine filter_main() prior_obs_spread_index, posterior_obs_spread_index, & compute_posterior) -if(ds) call error_handler(E_ERR, 'filter', 'smoother broken by Helen') - -!>@todo fudge -if(ds) call smoother_gen_copy_meta_data(num_output_state_members, output_inflation=.true.) - call timestamp_message('After initializing output files') call trace_message('After initializing output files') @@ -730,15 +708,6 @@ subroutine filter_main() ! if model state data not at required time, advance model if (curr_ens_time /= next_ens_time) then - ! Advance the lagged distribution, if needed. - ! Must be done before the model runs and updates the data. - if(ds) then - call trace_message('Before advancing smoother') - call timestamp_message('Before advancing smoother') - call advance_smoother(state_ens_handle) - call timestamp_message('After advancing smoother') - call trace_message('After advancing smoother') - endif ! we are going to advance the model - make sure we're doing single file output if (.not. has_cycling) then @@ -923,24 +892,6 @@ subroutine filter_main() call timestamp_message('After observation assimilation') call trace_message('After observation assimilation') - ! Do the update for the smoother lagged fields, too. - ! Would be more efficient to do these all at once inside filter_assim - ! in the future - if(ds) then - write(msgstring, '(A,I8,A)') 'Ready to reassimilate up to', size(keys), ' observations in the smoother' - call trace_message(msgstring, 'filter:', -1) - - call trace_message('Before smoother assimilation') - call timestamp_message('Before smoother assimilation') - call smoother_assim(obs_fwd_op_ens_handle, seq, keys, ens_size, num_groups, & - obs_val_index, ENS_MEAN_COPY, ENS_SD_COPY, & - PRIOR_INF_COPY, PRIOR_INF_SD_COPY, OBS_KEY_COPY, OBS_GLOBAL_QC_COPY, & - OBS_MEAN_START, OBS_MEAN_END, OBS_VAR_START, & - OBS_VAR_END) - call timestamp_message('After smoother assimilation') - call trace_message('After smoother assimilation') - endif - ! Already transformed, so compute mean and spread for state diag as needed call compute_copy_mean_sd(state_ens_handle, 1, ens_size, ENS_MEAN_COPY, ENS_SD_COPY) @@ -977,11 +928,6 @@ subroutine filter_main() call write_state(state_ens_handle, file_info_postassim) endif - !>@todo What to do here? - !call smoother_ss_diagnostics(model_size, num_output_state_members, & - ! output_inflation, temp_ens, ENS_MEAN_COPY, ENS_SD_COPY, & - ! POST_INF_COPY, POST_INF_SD_COPY) - call timestamp_message('After postassim state space output') call trace_message('After postassim state space output') @@ -1030,11 +976,6 @@ subroutine filter_main() call timestamp_message('After computing posterior observation values') call trace_message('After computing posterior observation values') - if(ds) then - call trace_message('Before computing smoother means/spread') - call smoother_mean_spread(ens_size, ENS_MEAN_COPY, ENS_SD_COPY) - call trace_message('After computing smoother means/spread') - endif call trace_message('Before posterior obs space diagnostics') @@ -1103,11 +1044,6 @@ subroutine filter_main() call write_state(state_ens_handle, file_info_analysis) endif - !>@todo What to do here? - !call smoother_ss_diagnostics(model_size, num_output_state_members, & - ! output_inflation, temp_ens, ENS_MEAN_COPY, ENS_SD_COPY, & - ! POST_INF_COPY, POST_INF_SD_COPY) - call timestamp_message('After analysis state space output') call trace_message('After analysis state space output') @@ -1152,9 +1088,6 @@ subroutine filter_main() if (.not. write_all_stages_at_end) & call write_state(state_ens_handle, file_info_output) - !>@todo need to fix smoother - !if(ds) call smoother_write_restart(1, ens_size) - call timestamp_message('After state space output') call trace_message('After state space output') @@ -1214,12 +1147,6 @@ subroutine filter_main() call destroy_obs_sequence(seq) call trace_message('After ensemble and obs memory cleanup') -if(ds) then - call trace_message('Before smoother memory cleanup') - call smoother_end() - call trace_message('After smoother memory cleanup') -endif - call trace_message('Filter done') call timestamp_message('Filter done') if(my_task_id() == 0) then @@ -1910,7 +1837,6 @@ subroutine set_trace(trace_execution, output_timestamps, silence) timestamp_level = -1 endif -call set_smoother_trace(trace_level, timestamp_level) call set_obs_model_trace(trace_level, timestamp_level) call set_assim_tools_trace(trace_level, timestamp_level) diff --git a/assimilation_code/modules/assimilation/filter_mod.rst b/assimilation_code/modules/assimilation/filter_mod.rst index 64638eed46..b95cc38034 100644 --- a/assimilation_code/modules/assimilation/filter_mod.rst +++ b/assimilation_code/modules/assimilation/filter_mod.rst @@ -476,7 +476,6 @@ Modules used ensemble_manager_mod adaptive_inflate_mod mpi_utilities_mod - smoother_mod random_seq_mod state_vector_io_mod io_filenames_mod diff --git a/assimilation_code/modules/assimilation/smoother_mod.f90 b/assimilation_code/modules/assimilation/smoother_mod.f90 deleted file mode 100644 index adf4042d06..0000000000 --- a/assimilation_code/modules/assimilation/smoother_mod.f90 +++ /dev/null @@ -1,584 +0,0 @@ -! DART software - Copyright UCAR. This open source software is provided -! by UCAR, "as is", without charge, subject to all terms of use at -! http://www.image.ucar.edu/DAReS/DART/DART_download - -module smoother_mod - -! Tools for turning the filter into a fixed lag smoother for the full state vector. - -use types_mod, only : r8, i8, metadatalength, MISSING_R8 -use mpi_utilities_mod, only : my_task_id -use utilities_mod, only : file_exist, check_namelist_read, do_output, & - find_namelist_in_file, error_handler, & - E_ERR, E_MSG, nmlfileunit, logfileunit, timestamp, & - do_nml_file, do_nml_term -use ensemble_manager_mod, only : ensemble_type, init_ensemble_manager, & - all_vars_to_all_copies, & - duplicate_ens, compute_copy_mean_sd, & - all_copies_to_all_vars, get_copy, map_task_to_pe -use time_manager_mod, only : time_type, operator(==), print_time - - -use options_mod, only : get_missing_ok_status -use assim_tools_mod, only : filter_assim -use obs_sequence_mod, only : obs_sequence_type -use adaptive_inflate_mod, only : adaptive_inflate_type, adaptive_inflate_init, & - do_varying_ss_inflate, do_single_ss_inflate -use io_filenames_mod, only : file_info_type, netcdf_file_type - -implicit none -private - -public :: smoother_read_restart, advance_smoother, & - smoother_gen_copy_meta_data, smoother_write_restart, init_smoother, & - do_smoothing, smoother_mean_spread, smoother_assim, & - smoother_ss_diagnostics, & - smoother_end, set_smoother_trace - - -character(len=*), parameter :: source = 'smoother_mod.f90' - -logical :: module_initialized = .false. -integer :: print_trace_details = 0 -integer :: print_timestamps = 0 - -character(len=512) :: errstring - -! State for the smoother -integer :: smoother_head = 1, num_current_lags = 0 -integer :: smoother_state_mean_index, smoother_state_spread_index -type(ensemble_type), allocatable :: lag_handle(:) -type(netcdf_file_type), allocatable :: SmootherStateUnit(:) -type(adaptive_inflate_type) :: lag_inflate - -!============================================================================ - -!---- namelist with default values - -integer :: num_lags = 0 -logical :: start_from_restart = .false. -logical :: output_restart = .false. - -! These will be prepended with Lag_NNNNN_ (and optionally appended with -! ens number depending on namelist settings). -character(len = 129) :: restart_in_file_name = 'ics', & - restart_out_file_name = 'restart' - -namelist /smoother_nml/ num_lags, start_from_restart, & - output_restart, restart_in_file_name, & - restart_out_file_name - -!------------------------------------------------------------------------- -contains - - -subroutine static_init_smoother() - -integer :: iunit, io - -! First call to init_smoother must initialize module and read namelist -if ( .not. module_initialized ) then - ! Initialize the module with utilities - module_initialized = .true. - - ! Read the namelist entry - call find_namelist_in_file("input.nml", "smoother_nml", iunit) - read(iunit, nml = smoother_nml, iostat = io) - call check_namelist_read(iunit, io, "smoother_nml") - - if (do_nml_file()) write(nmlfileunit, nml=smoother_nml) - if (do_nml_term()) write( * , nml=smoother_nml) - - ! Allocate space for lag_size storage - if(num_lags > 0) & - allocate(lag_handle(num_lags), SmootherStateUnit(num_lags)) - -endif - -end subroutine static_init_smoother - -!------------------------------------------------------------------------- - -subroutine init_smoother(ens_handle, POST_INF_COPY, POST_INF_SD_COPY) - -type(ensemble_type), intent(inout) :: ens_handle -integer, intent(in) :: POST_INF_COPY, POST_INF_SD_COPY - -logical :: allow_missing - -! static_init_smoother initializes module and read namelist -if ( .not. module_initialized ) call static_init_smoother() - -write(errstring, *)'Smoother is under construction for this version' -call error_handler(E_ERR,'init_smoother',errstring,source) - -! find out if it is ok to have missing values in the state vector -allow_missing = get_missing_ok_status() - -! Initialize a null adaptive_inflate type since inflation is not done at lags -! NOTE: Using ens_handle here (not lag_handle) so it doesn't die for 0 lag choice -if(num_lags > 0) call adaptive_inflate_init(lag_inflate, 0, .false., .false., & - .false. ,.true., 1.0_r8, 0.0_r8, & - 1.0_r8, 1.0_r8, 0.0_r8, 1.0_r8, allow_missing, "Lag") - -end subroutine init_smoother - -!------------------------------------------------------------------------- - -subroutine smoother_read_restart(ens_handle, ens_size, model_size, time1, init_time_days) - -type(ensemble_type), intent(inout) :: ens_handle -integer(i8), intent(in) :: model_size -integer, intent(in) :: ens_size -type(time_type), intent(inout) :: time1 -integer, intent(in) :: init_time_days - -! Can either get restart by copying ensemble_ic into every lag or by reading from -! restart files. If reading from restart, may want to override the times as indicated -! by the filter namelist. -integer :: i, j, smoother_index -character(len = 256) :: file_name, temp_name - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_read_restart',errstring,source) -endif - -! Initialize the storage space for the lag ensembles -do i = 1, num_lags - ! Only need 2 extra copies but have 6 for now to comply with filter's needs - call init_ensemble_manager(lag_handle(i), ens_size + 6, model_size, 1) -end do - -! assume no lags are current, and increment this as the files are found. -! this allows a model which has only advanced N times to have > N lags. -num_current_lags = 0 - -! If starting from restart, read these in -if(start_from_restart) then - READ_LAGS: do i = 1, num_lags - smoother_index = next_index(i) - write(file_name, '("Lag_", I5.5, "_", A)') i, trim(restart_in_file_name) - write(temp_name, '(A, ".", I4.4)') trim(file_name), 1 - if (file_exist(file_name) .or. file_exist(temp_name)) then - if(init_time_days >= 0) then - ! call read_ensemble_restart(lag_handle(smoother_index), 1, ens_size, & - ! start_from_restart, file_name, time1) - else - ! call read_ensemble_restart(lag_handle(smoother_index), 1, ens_size, & - ! start_from_restart, file_name) - endif - num_current_lags = num_current_lags + 1 - !write(errstring, '(A,I4,A,I4)') 'reading restart file ', i, ' into cycle number', smoother_index - !call error_handler(E_MSG, 'smoother_read_restart', errstring) - else - ! lag ic file does not exist yet, duplicate the filter ics - ! for the rest of the lags and break out of the i loop - do j = i, num_lags - smoother_index = next_index(j) - call duplicate_ens(ens_handle, lag_handle(smoother_index), .true.) - !write(errstring, '(A,I4,A,I4)') 'filling restart data ', i, ' into cycle number', smoother_index - !call error_handler(E_MSG, 'smoother_read_restart', errstring) - end do - exit READ_LAGS - endif - end do READ_LAGS - - !write(errstring, '(i4, A)') num_current_lags, ' smoother restart files processed' - !call error_handler(E_MSG,'smoother_read_restart',errstring) - -else - ! If not starting from restart, just copy the filter ics to all lags - do i = 1, num_lags - call duplicate_ens(ens_handle, lag_handle(i), .true.) - end do - !write(errstring, '(A,I4,A)') 'no restart data found, filling all', num_lags, ' lags' - !call error_handler(E_MSG, 'smoother_read_restart', errstring) -endif - -!write(errstring, '(A,I4,A)') 'head =', smoother_head -!call error_handler(E_MSG, 'smoother_read_restart', errstring) - -end subroutine smoother_read_restart - -!------------------------------------------------------------------------- - -subroutine advance_smoother(ens_handle) - -type(ensemble_type), intent(in) :: ens_handle - -integer :: smoother_tail - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'advance_smoother',errstring,source) -endif - -!call error_handler(E_MSG, 'advance_smoother', 'start of routine') -!if (num_lags /= num_current_lags) then -! write(errstring, '(A,I4)') 'num_current_lags starts =', num_current_lags -! call error_handler(E_MSG, 'advance_smoother', errstring) -!endif - -!write(errstring, '(A,I4)') 'apparently time has advanced, head starts =', smoother_head -!call error_handler(E_MSG, 'advance_smoother', errstring) - -! Copy the newest state from the ensemble over the oldest state -! Storage is cyclic -smoother_tail = smoother_head - 1 -if(smoother_tail == 0) smoother_tail = num_lags -call duplicate_ens(ens_handle, lag_handle(smoother_tail), .true.) -!write(errstring, '(A,I4)') 'copied current ens data into tail =', smoother_tail -!call error_handler(E_MSG, 'advance_smoother', errstring) - - -! Make the head point to the most recent data copy -smoother_head = smoother_tail - -! Add one to smoother ens if necessary -call smoother_inc_lags() - -!write(errstring, '(A,I4,A,I4)') 'head now =', smoother_head, ' num_current_lags =', num_current_lags -!call error_handler(E_MSG, 'advance_smoother', errstring) - -! debug only -!call print_time(lag_handle(smoother_head)%time(1), ' advance_smoother: head time now', logfileunit) -!call print_time(lag_handle(smoother_head)%time(1), ' advance_smoother: head time now') -!smoother_tail = smoother_head - 1 -!if(smoother_tail == 0) smoother_tail = num_lags -!call print_time(lag_handle(smoother_tail)%time(1), ' advance_smoother: tail time now', logfileunit) -!call print_time(lag_handle(smoother_tail)%time(1), ' advance_smoother: tail time now') - -end subroutine advance_smoother - -!------------------------------------------------------------------------- - -subroutine smoother_gen_copy_meta_data(num_output_state_members, output_inflation) - -integer, intent(in) :: num_output_state_members -logical, intent(in) :: output_inflation - -! Figures out the strings describing the output copies for the smoother state output files. -! These are the prior and posterior state output files. - -! The 4 is for ensemble mean and spread plus inflation mean and spread -character(len = metadatalength) :: state_meta(num_output_state_members + 4) -!character(len = 14) :: file_name -!character(len = 15) :: meta_data_string -integer :: i, ensemble_offset, num_state_copies - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_gen_copy_meta_data',errstring,source) -endif - -! Ensemble mean goes first -num_state_copies = num_output_state_members + 2 -smoother_state_mean_index = 1 -state_meta(smoother_state_mean_index) = 'ensemble mean' - -! Ensemble spread goes second -smoother_state_spread_index = 2 -state_meta(smoother_state_spread_index) = 'ensemble spread' - -! Check for too many output ensemble members -if(num_output_state_members > 10000) then - write(errstring, *)'output metadata in smoother needs state ensemble size < 10000, not ', & - num_output_state_members - call error_handler(E_ERR,'smoother_gen_copy_meta_data',errstring,source) -endif - -! Compute starting point for ensemble member output -ensemble_offset = 2 - -! Set up the metadata for the output state diagnostic files -do i = 1, num_output_state_members - write(state_meta(i + ensemble_offset), '(a15, 1x, i6)') 'ensemble member', i -end do - -! Netcdf output diagnostics for inflation; inefficient for single spatial -! NOTE: this should be changed to handle prior, posterior, both, or -! neither inflation. it must match what is written out in -! filter_state_space_diagnostics() below. space for an array state_space size -! long is created unless turned off by the namelist 'output_inflation' value, -! regardless of the actual inflation settings. -!!!if(do_single_ss_inflate(prior_inflate) .or. do_varying_ss_inflate(prior_inflate)) then -if (output_inflation) then - num_state_copies = num_state_copies + 2 - state_meta(num_state_copies -1) = 'inflation mean' - state_meta(num_state_copies) = 'inflation sd' -endif - -!>@todo FIXME: No longer writing diagnostic files. Need to handle -!> writting out smoother information. -! ! Set up diagnostic output for model state, if output is desired -! do i = 1, num_lags -! ! Generate file name and metadata for lag i output -! write(file_name, '("Lag_", i5.5, "_Diag")') i -! write(meta_data_string, '("lag ", i5.5, " state")') i -! SmootherStateUnit(i) = init_diag_output(file_name, meta_data_string, & -! num_state_copies, state_meta) -! end do - -end subroutine smoother_gen_copy_meta_data - -!----------------------------------------------------------- - -subroutine smoother_write_restart(start_copy, end_copy) - -integer, intent(in) :: start_copy, end_copy - -! Write out each smoother lag to a restart file as requested -! Single versus multiple file status is selected by ensemble manager -! Names for file are set here - -character(len = 256) :: file_name -integer :: i, smoother_index - -!type(file_info_type) :: file_info - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_write_restart',errstring,source) -endif - -! namelist controlled -if (.not. output_restart) return - -! Write out restart to each lag in turn -! Storage is cyclic with oldest lag pointed to by head, and -! head + 1 the most recent lag -do i = 1, num_current_lags - smoother_index = next_index(i) - write(file_name, '("Lag_", I5.5, "_", A)') i, trim(restart_out_file_name) - !>@todo FIXME : Need to write out smoother restarts - !call write_ensemble_restart(lag_handle(smoother_index), file_info, file_name, start_copy, end_copy) - !write(errstring, '(A,I4,A,I4)') 'writing restart file ', i, ' from cycle number', smoother_index - !call error_handler(E_MSG, 'smoother_write_restart', errstring) -end do - -end subroutine smoother_write_restart - -!----------------------------------------------------------- - -subroutine smoother_assim(obs_ens_handle, seq, keys, ens_size, num_groups, obs_val_index, & - ENS_MEAN_COPY, ENS_SD_COPY, PRIOR_INF_COPY, PRIOR_INF_SD_COPY, OBS_KEY_COPY, & - OBS_GLOBAL_QC_COPY, OBS_PRIOR_MEAN_START, OBS_PRIOR_MEAN_END, OBS_PRIOR_VAR_START, & - OBS_PRIOR_VAR_END) - -type(ensemble_type), intent(inout) :: obs_ens_handle -type(obs_sequence_type), intent(in) :: seq -integer, intent(in) :: keys(:) -integer, intent(in) :: ens_size, num_groups, obs_val_index -integer, intent(in) :: ENS_MEAN_COPY, ENS_SD_COPY, PRIOR_INF_COPY -integer, intent(in) :: PRIOR_INF_SD_COPY -integer, intent(in) :: OBS_KEY_COPY, OBS_GLOBAL_QC_COPY -integer, intent(in) :: OBS_PRIOR_MEAN_START, OBS_PRIOR_MEAN_END -integer, intent(in) :: OBS_PRIOR_VAR_START, OBS_PRIOR_VAR_END - -integer :: smoother_index, i - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_assim',errstring,source) -endif - -do i = 1, num_current_lags - smoother_index = next_index(i) - call all_vars_to_all_copies(lag_handle(smoother_index)) - - !write(errstring, '(A,I4,A,I4)') 'starting assimilate pass for lag', i, & - ! ' data, cycle index', smoother_index - !call error_handler(E_MSG,'smoother_assim',errstring) - - write(errstring, '(A,I4,A)') 'Starting reassimilate pass for lag', i, ' data' - if (print_trace_details >= 0) call error_handler(E_MSG,'smoother_assim:',errstring) - if (print_trace_details >= 1) then - call print_time(lag_handle(smoother_index)%time(1), & - ' smoother_assim: Time of lagged data is: ', logfileunit) - call print_time(lag_handle(smoother_index)%time(1), & - ' smoother_assim: Time of lagged data is: ') - endif - - ! NEED A LAG INFLATE TYPE THAT DOES NO INFLATION FOR NOW - call filter_assim(lag_handle(smoother_index), obs_ens_handle, & - seq, keys, ens_size, num_groups, & - obs_val_index, lag_inflate, ENS_MEAN_COPY, ENS_SD_COPY, & - PRIOR_INF_COPY, PRIOR_INF_SD_COPY, OBS_KEY_COPY, OBS_GLOBAL_QC_COPY, & - OBS_PRIOR_MEAN_START, OBS_PRIOR_MEAN_END, OBS_PRIOR_VAR_START, & - OBS_PRIOR_VAR_END, inflate_only = .false.) - - !write(errstring, '(A,I8,A,I4,A)') 'finished assimilating ', size(keys), & - ! ' observations for lag', i, ' data' - !call error_handler(E_MSG,'smoother_assim', errstring) - !write(errstring, '(A,I4)') ' smoother_assim: smoother_index =', smoother_index - !call error_handler(E_MSG,'smoother_assim', errstring) - !call print_time(lag_handle(smoother_index)%time(1), errstring) - write(errstring, '(A,I8,A,I4,A)') 'finished assimilating ', size(keys), & - ' observations for lag', i, ' data' - if (do_output() .and. print_timestamps > 0) call timestamp(errstring, pos='debug') -end do - -!call error_handler(E_MSG,'smoother_assim', 'end of routine, returning') - -end subroutine smoother_assim - -!----------------------------------------------------------- - -function do_smoothing() - -logical :: do_smoothing - -! static_init_smoother initializes module and read namelist -! (which sets num_lags which if > 0 enables the whole process) - -if ( .not. module_initialized ) call static_init_smoother() - -do_smoothing = num_lags > 0 - -end function do_smoothing - -!----------------------------------------------------------- - -subroutine smoother_mean_spread(ens_size, ENS_MEAN_COPY, ENS_SD_COPY) - -integer, intent(in) :: ens_size, ENS_MEAN_COPY, ENS_SD_COPY - -integer :: smoother_index, i - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_mean_spread',errstring,source) -endif - -! Must be called when smoother handles are copy complete. -! Leaves the data var complete before it returns. -do i = 1, num_current_lags - smoother_index = next_index(i) - - call compute_copy_mean_sd(lag_handle(smoother_index), 1, ens_size, ENS_MEAN_COPY, ENS_SD_COPY) - call all_copies_to_all_vars(lag_handle(smoother_index)) -end do - -end subroutine smoother_mean_spread - -!----------------------------------------------------------- - -subroutine smoother_ss_diagnostics(model_size, num_output_state_members, & - temp_ens, ENS_MEAN_COPY, ENS_SD_COPY, POST_INF_COPY, POST_INF_SD_COPY) - -integer, intent(in) :: model_size, num_output_state_members -! JH Note temp_ens not being used in this routine -real(r8), intent(out) :: temp_ens(model_size) -integer, intent(in) :: ENS_MEAN_COPY, ENS_SD_COPY, POST_INF_COPY, POST_INF_SD_COPY - -integer :: smoother_index, i - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_ss_diagnostics',errstring,source) -endif - -do i = 1, num_current_lags - smoother_index = next_index(i) - - ! FIXME: is this still needed? - call all_copies_to_all_vars(lag_handle(smoother_index)) - ! only ensemble copies have the time - !call filter_state_space_diagnostics(lag_handle(smoother_index)%time(1), SmootherStateUnit(i), & - ! lag_handle(smoother_index), model_size, num_output_state_members, & - ! smoother_state_mean_index, smoother_state_spread_index, output_inflation, temp_ens, & - ! ENS_MEAN_COPY, ENS_SD_COPY, lag_inflate, POST_INF_COPY, POST_INF_SD_COPY) -end do - -! REMOVE THIS WHEN IMPLEMENTED. -temp_ens(1) = MISSING_R8 ! Just to silence compiler warnings. - -end subroutine smoother_ss_diagnostics - -!----------------------------------------------------------- - -subroutine smoother_end() - -! Free up smoother allocated storage - -! Probably need to free up ensemble manager storage too - -deallocate(lag_handle, SmootherStateUnit) - -end subroutine smoother_end - -!----------------------------------------------------------- - -subroutine smoother_inc_lags() -! Increment the number of lags that are current for the smoother storage - -! must have called init_smoother() before using this routine -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_inc_lags',errstring,source) -endif - - -if(num_current_lags < num_lags) num_current_lags = num_current_lags + 1 - -!write(errstring, *)'smoother_inc_lags called, num_current_lags =', num_current_lags -!call error_handler(E_MSG,'smoother_inc_lags',errstring) - - -end subroutine smoother_inc_lags - -!----------------------------------------------------------- - -function next_index(i) - integer, intent(in) :: i - integer :: next_index -! the index numbers for the collection of lag_handles is -! a circular list. increment and do the wrap if needed. - -if ( .not. module_initialized ) then - write(errstring, *)'cannot be called before init_smoother() called' - call error_handler(E_ERR,'smoother_inc_lags',errstring,source) -endif - - -next_index = smoother_head + i - 1 -if(next_index > num_lags) next_index = next_index - num_lags - -!write(errstring, *)'next_index called, index =', next_index -!call error_handler(E_MSG,'next_index',errstring) - -end function next_index - -!----------------------------------------------------------- - -subroutine set_smoother_trace(execution_level, timestamp_level) - integer, intent(in) :: execution_level - integer, intent(in) :: timestamp_level - -! set module local vars from the calling code to indicate how much -! output we should generate from this code. execution level is -! intended to make it easier to figure out where in the code a crash -! is happening; timestamp level is intended to help with gross levels -! of overall performance profiling. eventually, a level of 1 will -! print out only basic info; level 2 will be more detailed. -! (right now, only > 0 prints anything and it doesn't matter how -! large the value is.) - - -print_trace_details = execution_level -print_timestamps = timestamp_level - -end subroutine set_smoother_trace - -!----------------------------------------------------------- - -end module smoother_mod - diff --git a/assimilation_code/modules/assimilation/smoother_mod.nml b/assimilation_code/modules/assimilation/smoother_mod.nml deleted file mode 100644 index 0b5f773e99..0000000000 --- a/assimilation_code/modules/assimilation/smoother_mod.nml +++ /dev/null @@ -1,7 +0,0 @@ -&smoother_nml - num_lags = 0, - start_from_restart = .false., - output_restart = .false., - restart_in_file_name = 'ics', - restart_out_file_name = 'restart' / - diff --git a/assimilation_code/modules/assimilation/smoother_mod.rst b/assimilation_code/modules/assimilation/smoother_mod.rst deleted file mode 100644 index 6a3b3c6dfe..0000000000 --- a/assimilation_code/modules/assimilation/smoother_mod.rst +++ /dev/null @@ -1,522 +0,0 @@ -MODULE smoother_mod -=================== - -.. attention:: - -  The DART smoother works with versions of DART *before* Manhattan (9.x.x) and has yet to be updated. If you are interested in -  using ``smoother_mod`` with more recent versions of DART, contact DAReS staff to assess the feasibility of an update. -  Until that time, you should consider this documentation as out-of-date. - -Overview --------- - -| Implements a fixed lag ensemble smoother as part of the filter. For now, this is done inefficiently with a separate - call to ``assim_tools_mod:filter_assim()`` for each lag. -| To enable the smoother, set the number of lags (num_lags) to something larger than 0 in the ``smoother_nml`` section - of your ``input.nml`` file and run ``filter`` as before. - -.. container:: routine - - :: - - &smoother_nml - num_lags = 10, - start_from_restart = .false., - output_restart = .true., - restart_in_file_name = "ics", - restart_out_file_name = "restart" / - -| In the low order models, 10 is a plausible number. -| In addition to generating ``preassim.nc`` and ``analysis.nc`` files, files of the form ``Lag_NNNNN_Diag.nc`` will be - generated. Each of these has N fewer timesteps than the lag=0 run, starting at the same time but ending N timesteps - sooner. The ``obs_seq.final`` file and the ``preassim.nc`` and ``analysis.nc`` files will be the same as the - non-lagged version; the new output will be in each of the ``Lag_NNNNN_Diag.nc`` files. - -Example -------- - -| If you have a ``true_state.nc`` file and want to use the ``plot_total_err`` matlab function to plot the error, you - must do the following steps to generate analogs of lagged ``true_state.nc`` files to use as a comparison. (The logic - is not currently implemented in the matlab scripts to be able to compare netCDF files with unequal time coordinates.) -| Make N separate versions of the true_state.nc with the last N timesteps removed. Using the netCDF NCO operator program - 'ncks' is one way. If the true_state.nc file has 1000 time steps, then this command removes the last one: - -.. container:: unix - - ncks -d time,0,998 true_state.nc True_Lag01.nc - -Note that the first time is at index 0, so the last timestep is index 999 in the full file, and 998 in the truncated -file. Repeat this step for all N lags. Here are NCO commands to generate 10 truth files for num_lags = 10, 1000 time -steps in true_state.nc: - -.. container:: unix - - ncks -d time,0,998 true_state.nc True_Lag01.nc - ncks -d time,0,997 true_state.nc True_Lag02.nc - ncks -d time,0,996 true_state.nc True_Lag03.nc - ncks -d time,0,995 true_state.nc True_Lag04.nc - ncks -d time,0,994 true_state.nc True_Lag05.nc - ncks -d time,0,993 true_state.nc True_Lag06.nc - ncks -d time,0,992 true_state.nc True_Lag07.nc - ncks -d time,0,991 true_state.nc True_Lag08.nc - ncks -d time,0,990 true_state.nc True_Lag09.nc - ncks -d time,0,989 true_state.nc True_Lag10.nc - -Here is an example matlab session which plots the lag=0 results and then odd numbered lags from 1 to 9. It uses the -``plot_total_err`` function from the $DART/matlab directory: - -:: - - datadir = '.'; - truth_file = fullfile(datadir,'true_state.nc'); - diagn_file = fullfile(datadir,'preassim.nc'); - plot_total_err - reply = input('original data. hit enter to continue '); - - truth_file = fullfile(datadir,'True_Lag01.nc'); - diagn_file = fullfile(datadir,'Lag_00001_Diag.nc'); - plot_total_err - reply = input('Lag 01. hit enter to continue '); - - truth_file = fullfile(datadir,'True_Lag03.nc'); - diagn_file = fullfile(datadir,'Lag_00003_Diag.nc'); - plot_total_err - reply = input('Lag 03. hit enter to continue '); - - truth_file = fullfile(datadir,'True_Lag05.nc'); - diagn_file = fullfile(datadir,'Lag_00005_Diag.nc'); - plot_total_err - reply = input('Lag 05. hit enter to continue '); - - truth_file = fullfile(datadir,'True_Lag07.nc'); - diagn_file = fullfile(datadir,'Lag_00007_Diag.nc'); - plot_total_err - reply = input('Lag 07. hit enter to continue '); - - truth_file = fullfile(datadir,'True_Lag09.nc'); - diagn_file = fullfile(datadir,'Lag_00009_Diag.nc'); - plot_total_err - reply = input('Lag 09. hit enter to continue '); - -Namelist --------- - -This namelist is read from the file ``input.nml``. 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. - -:: - - &smoother_nml - num_lags = 0, - start_from_restart = .false., - output_restart = .false., - restart_in_file_name = 'ics', - restart_out_file_name = 'restart' - / - -| - -.. container:: - - +-----------------------+--------------------+-----------------------------------------------------------------------+ - | Item | Type | Description | - +=======================+====================+=======================================================================+ - | num_lags | integer | Number of smoother lags; < 1 means no smoother. | - +-----------------------+--------------------+-----------------------------------------------------------------------+ - | start_from_restart | logical | True if smoother states are to come from restart file(s). False if | - | | | they are to be spun up from scratch. | - +-----------------------+--------------------+-----------------------------------------------------------------------+ - | output_restart | logical | True if restart file(s) are to be written, else false. | - +-----------------------+--------------------+-----------------------------------------------------------------------+ - | restart_in_file_name | character(len=129) | String used to construct the file name from which to read restart | - | | | data. ``Lag_NNNNN_`` will be prepended to the specified value to | - | | | create the actual filename. If each ensemble is to be read from a | - | | | separate file, the .NNNN ensemble number will also be appended. e.g. | - | | | specifying 'ics' here results in 'Lag_00001_ics' if all ensemble | - | | | members are read from a single file, 'Lag_00001_ics.0001', | - | | | 'Lag_00001_ics.0002', etc for multiples. | - +-----------------------+--------------------+-----------------------------------------------------------------------+ - | restart_out_file_name | character(len=129) | String used to construct the file name to which to write restart | - | | | data. ``Lag_NNNNN_`` will be prepended to the specified value to | - | | | create the actual filename. If each ensemble is to be written to a | - | | | separate file, the .NNNN ensemble number will also be appended. e.g. | - | | | specifying 'restart' here results in 'Lag_00001_restart' if all | - | | | ensemble members are written to a single file, | - | | | 'Lag_00001_restart.0001', 'Lag_00001_restart.0002', etc for | - | | | multiples. | - +-----------------------+--------------------+-----------------------------------------------------------------------+ - -| - -Other modules used ------------------- - -:: - - types_mod - mpi_utilities_mod - utilities_mod - ensemble_manager_mod - time_manager_mod - assim_model_mod - assim_tools_mod - obs_sequence_mod - adaptive_inflate_mod - -Public interfaces ------------------ - -========================== ============================== -*use smoother_mod, only :* smoother_read_restart -\ advance_smoother -\ smoother_gen_copy_meta_data -\ smoother_write_restart -\ init_smoother -\ do_smoothing -\ smoother_mean_spread -\ smoother_assim -\ filter_state_space_diagnostics -\ smoother_ss_diagnostics -\ smoother_end -========================== ============================== - -A note about documentation style. Optional arguments are enclosed in brackets *[like this]*. - -| - -.. container:: routine - - *call smoother_read_restart(ens_handle, ens_size, model_size, time1, init_time_days)* - :: - - type(ensemble_type), intent(inout) :: ens_handle - integer, intent(in) :: ens_size - integer, intent(in) :: model_size - type(time_type), intent(inout) :: time1 - integer, intent(in) :: init_time_days - -.. container:: indent1 - - Reads in ensemble of states for all lag estimates from a restart file. - - ================== ========================================================================================= - ``ens_handle`` Handle of ensemble manager structure of single state; copied into all lags for startup. - ``ens_size`` Size of the ensemble. - ``model_size`` Size of the model state vector. - ``time1`` Overwrite the time in the restart file with this value if init_time_days is non-negative. - ``init_time_days`` If non-negative, use time1 instead of time in restart file. - ================== ========================================================================================= - -| - -.. container:: routine - - *call advance_smoother(ens_handle)* - :: - - type(ensemble_type), intent(in) :: ens_handle - -.. container:: indent1 - - Advances smoother state estimates at all lags forward in time. This entails copying the most recent smoother state, - contained in ens_handle, into the lag 1 smoother state and pushing back all other lags by 1 (i.e. lag 1 becomes lag - 2, etc.). - - ============== ================================================ - ``ens_handle`` Ensemble handle with most recent filtered state. - ============== ================================================ - -| - -.. container:: routine - - *call smoother_gen_copy_meta_data(num_output_state_members, output_inflation)* - :: - - integer, intent(in) :: num_output_state_members - logical, intent(in) :: output_inflation - -.. container:: indent1 - - Initializes the metadata required for the smoother state space diagnostic files. - - ============================ ========================================================================================== - ``num_output_state_members`` Number of copies of smoother state vector that should be in state space diagnostic output. - ``output_inflation`` True if smoother state space output should include inflation values. - ============================ ========================================================================================== - -| - -.. container:: routine - - *call smoother_write_restart(start_copy, end_copy)* - :: - - integer, intent(in) :: start_copy - integer, intent(in) :: end_copy - -.. container:: indent1 - - Outputs restart files for all lags of smoother state. Integer arguments specify the start and end global indices of a - continguous set of copies that contain the ensemble members. - - ============== =================================================================================== - ``start_copy`` Global index of ensemble copy that starts the actual ensemble members for smoother. - ``end_copy`` Global index of ensemble copy that ends the actual ensemble members for smoother. - ============== =================================================================================== - -| - -.. container:: routine - - *call init_smoother(ens_handle, POST_INF_COPY, POST_INF_SD_COPY)* - :: - - type(ensemble_type), intent(inout) :: ens_handle - integer, intent(in) :: POST_INF_COPY - integer, intent(in) :: POST_INF_SD_COPY - -.. container:: indent1 - - Initializes the storage needed for a smoother. Also initializes an adaptive inflation type that does NO inflation - (not currently supported for smoothers). - - ==================== ========================================================================================== - ``ens_handle`` An ensemble handle for the filter that contains information about ensemble and model size. - ``POST_INF_COPY`` Global index of ensemble copy that holds posterior state space inflation values. - ``POST_INF_SD_COPY`` Global index of ensemble copy that holds posterior inflation standard deviation values. - ==================== ========================================================================================== - -| - -.. container:: routine - - *var = do_smoothing()* - :: - - logical, intent(out) :: do_smoothing - -.. container:: indent1 - - Returns true if smoothing is to be done, else false. - - ================ ======================================== - ``do_smoothing`` Returns true if smoothing is to be done. - ================ ======================================== - -| - -.. container:: routine - - *call smoother_mean_spread(ens_size,ENS_MEAN_COPY,ENS_SD_COPY, output_state_ens_mean,output_state_ens_spread)* - :: - - integer, intent(in) :: ens_size - integer, intent(in) :: ENS_MEAN_COPY - integer, intent(in) :: ENS_SD_COPY - logical, intent(in) :: output_state_ens_mean - logical, intent(in) :: output_state_ens_spread - -.. container:: indent1 - - Computes the ensemble mean (and spread if required) of all state variables for all lagged ensembles. Spread is only - computed if it is required for output. - - =========================== =================================================================== - ``ens_size`` Size of ensemble. - ``ENS_MEAN_COPY`` Global index of copy that stores ensemble mean. - ``ENS_SD_COPY`` Global index of copy that stores ensemble spread. - ``output_state_ens_mean`` True if the ensemble mean is to be output to state diagnostic file. - ``output_state_ens_spread`` True if ensemble spread is to be output to state diagnostic file. - =========================== =================================================================== - -| - -.. container:: routine - - *call smoother_assim(obs_ens_handle, seq, keys, ens_size, num_groups, obs_val_index, ENS_MEAN_COPY, ENS_SD_COPY, - PRIOR_INF_COPY, PRIOR_INF_SD_COPY, OBS_KEY_COPY, OBS_GLOBAL_QC_COPY, OBS_PRIOR_MEAN_START, OBS_PRIOR_MEAN_END, - OBS_PRIOR_VAR_START, OBS_PRIOR_VAR_END)* - :: - - type(ensemble_type), intent(inout) :: obs_ens_handle - type(obs_sequence_type), intent(in) :: seq - integer, dimension(:), intent(in) :: keys - integer, intent(in) :: ens_size - integer, intent(in) :: num_groups - integer, intent(in) :: obs_val_index - integer, intent(in) :: ENS_MEAN_COPY - integer, intent(in) :: ENS_SD_COPY - integer, intent(in) :: PRIOR_INF_COPY - integer, intent(in) :: PRIOR_INF_SD_COPY - integer, intent(in) :: OBS_KEY_COPY - integer, intent(in) :: OBS_GLOBAL_QC_COPY - integer, intent(in) :: OBS_PRIOR_MEAN_START - integer, intent(in) :: OBS_PRIOR_MEAN_END - integer, intent(in) :: OBS_PRIOR_VAR_START - integer, intent(in) :: OBS_PRIOR_VAR_END - -.. container:: indent1 - - Does assimilation of a set of observations for each smoother lag. - - +--------------------------+------------------------------------------------------------------------------------------+ - | ``obs_ens_handle`` | Handle for ensemble manager holding prior estimates of observations. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``seq`` | Observation sequence being assimilated. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``keys`` | A one dimensional array containing indices in seq of observations to as similate at | - | | current time. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``ens_size`` | Ensemble size. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``num_groups`` | Number of groups in filter. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``obs_val_index`` | Integer index of copy of data in seq that contains the observed value from instruments. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``ENS_MEAN_COPY`` | Global index in smoother's state ensemble that holds ensemble mean. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``ENS_SD_COPY`` | Global index in smoother's state ensemble that holds ensemble standard deviation. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``PRIOR_INF_COPY`` | Global index in obs_ens_handle that holds inflation values (not used for smoother). | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``PRIOR_INF_SD_COPY`` | Global index in obs_ens_handle that holds inflation sd values (not used for smoother). | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``OBS_KEY_COPY`` | Global index in obs_ens_handle that holds the key for the observation. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``OBS_GLOBAL_QC_COPY`` | Global index in obs_ens_handle that holds the quality control value. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``OBS_PRIOR_MEAN_START`` | Global index in obs_ens_handle that holds the first group's prior mean. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``OBS_PRIOR_MEAN_END`` | Global index in obs_ens_handle that holds the last group's prior mean. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``OBS_PRIOR_VAR_START`` | Global index in obs_ens_handle that holds the first group's prior variance. | - +--------------------------+------------------------------------------------------------------------------------------+ - | ``OBS_PRIOR_VAR_END`` | Global index in obs_ens_handle that holds the last group's prior variance. | - +--------------------------+------------------------------------------------------------------------------------------+ - -| - -.. container:: routine - - *call filter_state_space_diagnostics(out_unit, ens_handle, model_size, num_output_state_members, - output_state_mean_index, output_state_spread_index, output_inflation, temp_ens, ENS_MEAN_COPY, ENS_SD_COPY, inflate, - INF_COPY, INF_SD_COPY)* - :: - - type(netcdf_file_type), intent(inout) :: out_unit - type(ensemble_type), intent(inout) :: ens_handle - integer, intent(in) :: model_size - integer, intent(in) :: num_output_state_members - integer, intent(in) :: output_state_mean_index - integer, intent(in) :: output_state_spread_index - logical, intent(in) :: output_inflation - real(r8), intent(out) :: temp_ens(model_size) - integer, intent(in) :: ENS_MEAN_COPY - integer, intent(in) :: ENS_SD_COPY - type(adaptive_inflate_type), intent(in) :: inflate - integer, intent(in) :: INF_COPY - integer, intent(in) :: INF_SD_COPY - -.. container:: indent1 - - Writes state space diagnostic values including ensemble members, mean and spread, and inflation mean and spread to a - netcdf file. - - ============================= ================================================================== - ``out_unit`` Descriptor for the netcdf file being written. - ``ens_handle`` Ensemble handle whose state space values are to be written. - ``model_size`` Size of the model state vector. - ``num_output_state_members`` Number of individual state members to be output. - ``output_state_mean_index`` Index in netcdf file for ensemble mean. - ``output_state_spread_index`` Index in netcdf file for ensemble spread. - ``output_inflation`` True if the inflation values are to be output. Default is .TRUE. - ``temp_ens`` Storage passed in to avoid having to allocate extra space. - ``ENS_MEAN_COPY`` Global index in ens_handle for ensemble mean. - ``ENS_SD_COPY`` Global index in ens_handle for ensemble spread. - ``inflate`` Contains description and values of state space inflation. - ``INF_COPY`` Global index in ens_handle of inflation values. - ``INF_SD_COPY`` Global index in ens_handle of inflation standard deviation values. - ============================= ================================================================== - -| - -.. container:: routine - - *call smoother_ss_diagnostics(model_size, num_output_state_members, output_inflation, temp_ens, ENS_MEAN_COPY, - ENS_SD_COPY, POST_INF_COPY, POST_INF_SD_COPY)* - :: - - integer, intent(in) :: model_size - integer, intent(in) :: num_output_state_members - logical, intent(in) :: output_inflation - real(r8), intent(out) :: temp_ens(model_size) - integer, intent(in) :: ENS_MEAN_COPY - integer, intent(in) :: ENS_SD_COPY - integer, intent(in) :: POST_INF_COPY - integer, intent(in) :: POST_INF_SD_COPY - -.. container:: indent1 - - Outputs state space diagnostics files for all smoother lags. - - +------------------------------+--------------------------------------------------------------------------------------+ - | ``model_size`` | Size of the model state vector. | - +------------------------------+--------------------------------------------------------------------------------------+ - | ``num_output_state_members`` | Number of state copies to be output in the state space diagnostics file. | - +------------------------------+--------------------------------------------------------------------------------------+ - | ``output_inflation`` | True if the inflation values are to be output. Default is .TRUE. | - +------------------------------+--------------------------------------------------------------------------------------+ - | ``temp_ens`` | Storage passed in to avoid having to allocate extra space. | - +------------------------------+--------------------------------------------------------------------------------------+ - | ``ENS_MEAN_COPY`` | Global index of the ensemble mean in the lag smoother ensemble handles. | - +------------------------------+--------------------------------------------------------------------------------------+ - | ``ENS_SD_COPY`` | Global index of the ensemble spread in the lag smoother ensemble handles. | - +------------------------------+--------------------------------------------------------------------------------------+ - | ``POST_INF_COPY`` | Global index of the inflation value in the lag smoother ensemble handles (not | - | | currently used). | - +------------------------------+--------------------------------------------------------------------------------------+ - | ``POST_INF_SD_COPY`` | Global index of the inflation spread in the lag smoother ensemble handles (not | - | | currently used). | - +------------------------------+--------------------------------------------------------------------------------------+ - -| - -.. container:: routine - - *call smoother_end()* - -.. container:: indent1 - - Releases storage allocated for smoother. - -| - -.. container:: routine - - *call smoother_inc_lags()* - -.. container:: indent1 - - Increments the number of lags that are in use for smoother. Used when a smoother is being started up and there have - not been enough times to propagate the state to all requested lags. - -| - -Files ------ - -- input.nml -- smoother initial condition files -- smoother restart files - -References ----------- - -#. none - -Private components ------------------- - -N/A diff --git a/assimilation_code/modules/assimilation/smootherdatadart.ps b/assimilation_code/modules/assimilation/smootherdatadart.ps deleted file mode 100644 index d8080193007f6c2b2202c8464ee3218e19672e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77478 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 diff --git a/assimilation_code/modules/assimilation/smootherdatadartexplain.ps b/assimilation_code/modules/assimilation/smootherdatadartexplain.ps deleted file mode 100644 index 496c40517da3974957eebf985e3478109b8ef9d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85718 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