@@ -26,8 +26,7 @@ module MOM_barotropic
26
26
use MOM_restart, only : query_initialized, MOM_restart_CS
27
27
use MOM_self_attr_load, only : scalar_SAL_sensitivity
28
28
use MOM_self_attr_load, only : SAL_CS
29
- use MOM_streaming_filter, only : Filt_register, Filt_accum, Filter_CS
30
- use MOM_tidal_forcing, only : tidal_frequency
29
+ use MOM_streaming_filter, only : Filt_register, Filt_init, Filt_accum, Filter_CS
31
30
use MOM_time_manager, only : time_type, real_to_time, operator (+ ), operator (- )
32
31
use MOM_unit_scaling, only : unit_scale_type
33
32
use MOM_variables, only : BT_cont_type, alloc_bt_cont_type
@@ -250,10 +249,8 @@ module MOM_barotropic
250
249
logical :: linearized_BT_PV ! < If true, the PV and interface thicknesses used
251
250
! ! in the barotropic Coriolis calculation is time
252
251
! ! invariant and linearized.
253
- logical :: use_filter_m2 ! < If true, apply streaming band-pass filter for detecting
254
- ! ! instantaneous tidal signals.
255
- logical :: use_filter_k1 ! < If true, apply streaming band-pass filter for detecting
256
- ! ! instantaneous tidal signals.
252
+ logical :: use_filter ! < If true, use streaming band-pass filter to detect the
253
+ ! ! instantaneous tidal signals in the simulation.
257
254
logical :: use_wide_halos ! < If true, use wide halos and march in during the
258
255
! ! barotropic time stepping for efficiency.
259
256
logical :: clip_velocity ! < If true, limit any velocity components that are
@@ -297,10 +294,8 @@ module MOM_barotropic
297
294
type (hor_index_type), pointer :: debug_BT_HI = > NULL () ! < debugging copy of horizontal index_type
298
295
type (SAL_CS), pointer :: SAL_CSp = > NULL () ! < Control structure for SAL
299
296
type (harmonic_analysis_CS), pointer :: HA_CSp = > NULL () ! < Control structure for harmonic analysis
300
- type (Filter_CS) :: Filt_CS_um2, & ! < Control structures for the M2 streaming filter
301
- Filt_CS_vm2, & ! < Control structures for the M2 streaming filter
302
- Filt_CS_uk1, & ! < Control structures for the K1 streaming filter
303
- Filt_CS_vk1 ! < Control structures for the K1 streaming filter
297
+ type (Filter_CS) :: Filt_CS_u, & ! < Control structures for the streaming band-pass filter of ubt
298
+ Filt_CS_v ! < Control structures for the streaming band-pass filter of vbt
304
299
logical :: module_is_initialized = .false. ! < If true, module has been initialized
305
300
306
301
integer :: isdw ! < The lower i-memory limit for the wide halo arrays.
@@ -608,8 +603,8 @@ subroutine btstep(U_in, V_in, eta_in, dt, bc_accel_u, bc_accel_v, forces, pbce,
608
603
DCor_v, & ! An averaged total thickness at v points [H ~> m or kg m-2].
609
604
Datv ! Basin depth at v-velocity grid points times the x-grid
610
605
! spacing [H L ~> m2 or kg m-1].
611
- real , dimension (:,:), pointer :: um2, uk1, vm2, vk1
612
- ! M2 and K1 velocities from the output of streaming filters [m s-1]
606
+ real , dimension (:,:,: ), pointer :: ufilt, vfilt
607
+ ! Filtered velocities from the output of streaming filters [m s-1]
613
608
real , target , dimension (SZIW_(CS),SZJW_(CS)) :: &
614
609
eta, & ! The barotropic free surface height anomaly or column mass
615
610
! anomaly [H ~> m or kg m-2]
@@ -1598,15 +1593,11 @@ subroutine btstep(U_in, V_in, eta_in, dt, bc_accel_u, bc_accel_v, forces, pbce,
1598
1593
endif ; enddo ; enddo
1599
1594
endif
1600
1595
1601
- ! Here is an example of how the filter equations are time stepped to determine the M2 and K1 velocities.
1602
- ! The filters are initialized and registered in subroutine barotropic_init.
1603
- if (CS% use_filter_m2) then
1604
- call Filt_accum(ubt, um2, CS% Time, US, CS% Filt_CS_um2)
1605
- call Filt_accum(vbt, vm2, CS% Time, US, CS% Filt_CS_vm2)
1606
- endif
1607
- if (CS% use_filter_k1) then
1608
- call Filt_accum(ubt, uk1, CS% Time, US, CS% Filt_CS_uk1)
1609
- call Filt_accum(vbt, vk1, CS% Time, US, CS% Filt_CS_vk1)
1596
+ ! Note that the filtered velocities are only updated during the current predictor step,
1597
+ ! and are calculated using the barotropic velocity from the previous correction step.
1598
+ if (CS% use_filter) then
1599
+ call Filt_accum(ubt, ufilt, CS% Time, US, CS% Filt_CS_u)
1600
+ call Filt_accum(vbt, vfilt, CS% Time, US, CS% Filt_CS_v)
1610
1601
endif
1611
1602
1612
1603
! Zero out the arrays for various time-averaged quantities.
@@ -4979,6 +4970,12 @@ subroutine barotropic_init(u, v, h, eta, Time, G, GV, US, param_file, diag, CS,
4979
4970
endif ! len_trim(wave_drag_file) > 0
4980
4971
endif ! CS%linear_wave_drag
4981
4972
4973
+ ! Initialize streaming band-pass filters
4974
+ if (CS% use_filter) then
4975
+ call Filt_init(param_file, US, CS% Filt_CS_u, restart_CS)
4976
+ call Filt_init(param_file, US, CS% Filt_CS_v, restart_CS)
4977
+ endif
4978
+
4982
4979
CS% dtbt_fraction = 0.98 ; if (dtbt_input < 0.0 ) CS% dtbt_fraction = - dtbt_input
4983
4980
4984
4981
dtbt_tmp = - 1.0
@@ -5263,9 +5260,8 @@ subroutine register_barotropic_restarts(HI, GV, US, param_file, CS, restart_CS)
5263
5260
! Local variables
5264
5261
type (vardesc) :: vd(3 )
5265
5262
character (len= 40 ) :: mdl = " MOM_barotropic" ! This module's name.
5263
+ integer :: n_filters ! < Number of streaming band-pass filters to be used in the simulation.
5266
5264
integer :: isd, ied, jsd, jed, IsdB, IedB, JsdB, JedB
5267
- real :: am2, ak1 ! < Bandwidth parameters of the M2 and K1 streaming filters [nondim]
5268
- real :: om2, ok1 ! < Target frequencies of the M2 and K1 streaming filters [rad T-1 ~> rad s-1]
5269
5265
5270
5266
isd = HI% isd ; ied = HI% ied ; jsd = HI% jsd ; jed = HI% jed
5271
5267
IsdB = HI% IsdB ; IedB = HI% IedB ; JsdB = HI% JsdB ; JedB = HI% JedB
@@ -5278,33 +5274,6 @@ subroutine register_barotropic_restarts(HI, GV, US, param_file, CS, restart_CS)
5278
5274
" sum(u dh_dt) while also correcting for truncation errors." , &
5279
5275
default= .false. , do_not_log= .true. )
5280
5276
5281
- call get_param(param_file, mdl, " STREAMING_FILTER_M2" , CS% use_filter_m2, &
5282
- " If true, turn on streaming band-pass filter for detecting " // &
5283
- " instantaneous tidal signals." , default= .false. )
5284
- call get_param(param_file, mdl, " STREAMING_FILTER_K1" , CS% use_filter_k1, &
5285
- " If true, turn on streaming band-pass filter for detecting " // &
5286
- " instantaneous tidal signals." , default= .false. )
5287
- call get_param(param_file, mdl, " FILTER_ALPHA_M2" , am2, &
5288
- " Bandwidth parameter of the streaming filter targeting the M2 frequency. " // &
5289
- " Must be positive. To turn off filtering, set FILTER_ALPHA_M2 <= 0.0." , &
5290
- default= 0.0 , units= " nondim" , do_not_log= .not. CS% use_filter_m2)
5291
- call get_param(param_file, mdl, " FILTER_ALPHA_K1" , ak1, &
5292
- " Bandwidth parameter of the streaming filter targeting the K1 frequency. " // &
5293
- " Must be positive. To turn off filtering, set FILTER_ALPHA_K1 <= 0.0." , &
5294
- default= 0.0 , units= " nondim" , do_not_log= .not. CS% use_filter_k1)
5295
- call get_param(param_file, mdl, " TIDE_M2_FREQ" , om2, &
5296
- " Frequency of the M2 tidal constituent. " // &
5297
- " This is only used if TIDES and TIDE_M2" // &
5298
- " are true, or if OBC_TIDE_N_CONSTITUENTS > 0 and M2" // &
5299
- " is in OBC_TIDE_CONSTITUENTS." , units= " rad s-1" , default= tidal_frequency(" M2" ), &
5300
- scale= US% T_to_s, do_not_log= .true. )
5301
- call get_param(param_file, mdl, " TIDE_K1_FREQ" , ok1, &
5302
- " Frequency of the K1 tidal constituent. " // &
5303
- " This is only used if TIDES and TIDE_K1" // &
5304
- " are true, or if OBC_TIDE_N_CONSTITUENTS > 0 and K1" // &
5305
- " is in OBC_TIDE_CONSTITUENTS." , units= " rad s-1" , default= tidal_frequency(" K1" ), &
5306
- scale= US% T_to_s, do_not_log= .true. )
5307
-
5308
5277
ALLOC_(CS% ubtav(IsdB:IedB,jsd:jed)) ; CS% ubtav(:,:) = 0.0
5309
5278
ALLOC_(CS% vbtav(isd:ied,JsdB:JedB)) ; CS% vbtav(:,:) = 0.0
5310
5279
if (CS% gradual_BT_ICs) then
@@ -5333,22 +5302,17 @@ subroutine register_barotropic_restarts(HI, GV, US, param_file, CS, restart_CS)
5333
5302
call register_restart_field(CS% dtbt, " DTBT" , .false. , restart_CS, &
5334
5303
longname= " Barotropic timestep" , units= " seconds" , conversion= US% T_to_s)
5335
5304
5336
- ! Initialize and register streaming filters
5337
- if (CS% use_filter_m2) then
5338
- if (am2 > 0.0 .and. om2 > 0.0 ) then
5339
- call Filt_register(am2, om2, ' u' , HI, CS% Filt_CS_um2)
5340
- call Filt_register(am2, om2, ' v' , HI, CS% Filt_CS_vm2)
5341
- else
5342
- CS% use_filter_m2 = .false.
5343
- endif
5344
- endif
5345
- if (CS% use_filter_k1) then
5346
- if (ak1 > 0.0 .and. ok1 > 0.0 ) then
5347
- call Filt_register(ak1, ok1, ' u' , HI, CS% Filt_CS_uk1)
5348
- call Filt_register(ak1, ok1, ' v' , HI, CS% Filt_CS_vk1)
5349
- else
5350
- CS% use_filter_k1 = .false.
5351
- endif
5305
+ ! Initialize and register streaming band-pass filters
5306
+ call get_param(param_file, mdl, " USE_FILTER" , CS% use_filter, &
5307
+ " If true, use streaming band-pass filters to detect the " // &
5308
+ " instantaneous tidal signals in the simulation." , default= .false. )
5309
+ call get_param(param_file, mdl, " N_FILTERS" , n_filters, &
5310
+ " Number of streaming band-pass filters to be used in the simulation." , &
5311
+ default= 0 , do_not_log= .not. CS% use_filter)
5312
+ if (n_filters<= 0 ) CS% use_filter = .false.
5313
+ if (CS% use_filter) then
5314
+ call Filt_register(n_filters, ' ubt' , ' u' , HI, CS% Filt_CS_u, restart_CS)
5315
+ call Filt_register(n_filters, ' vbt' , ' v' , HI, CS% Filt_CS_v, restart_CS)
5352
5316
endif
5353
5317
5354
5318
end subroutine register_barotropic_restarts
0 commit comments