@@ -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,9 @@ 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
+ if (CS% use_filter) then
1597
+ call Filt_accum(ubt, ufilt, CS% Time, US, CS% Filt_CS_u)
1598
+ call Filt_accum(vbt, vfilt, CS% Time, US, CS% Filt_CS_v)
1610
1599
endif
1611
1600
1612
1601
! Zero out the arrays for various time-averaged quantities.
@@ -4984,6 +4973,12 @@ subroutine barotropic_init(u, v, h, eta, Time, G, GV, US, param_file, diag, CS,
4984
4973
endif ! len_trim(wave_drag_file) > 0
4985
4974
endif ! CS%linear_wave_drag
4986
4975
4976
+ ! Initialize streaming band-pass filters
4977
+ if (CS% use_filter) then
4978
+ call Filt_init(param_file, US, CS% Filt_CS_u, restart_CS)
4979
+ call Filt_init(param_file, US, CS% Filt_CS_v, restart_CS)
4980
+ endif
4981
+
4987
4982
CS% dtbt_fraction = 0.98 ; if (dtbt_input < 0.0 ) CS% dtbt_fraction = - dtbt_input
4988
4983
4989
4984
dtbt_tmp = - 1.0
@@ -5268,9 +5263,8 @@ subroutine register_barotropic_restarts(HI, GV, US, param_file, CS, restart_CS)
5268
5263
! Local variables
5269
5264
type (vardesc) :: vd(3 )
5270
5265
character (len= 40 ) :: mdl = " MOM_barotropic" ! This module's name.
5266
+ integer :: n_filters ! < Number of streaming band-pass filters to be used in the simulation.
5271
5267
integer :: isd, ied, jsd, jed, IsdB, IedB, JsdB, JedB
5272
- real :: am2, ak1 ! < Bandwidth parameters of the M2 and K1 streaming filters [nondim]
5273
- real :: om2, ok1 ! < Target frequencies of the M2 and K1 streaming filters [rad T-1 ~> rad s-1]
5274
5268
5275
5269
isd = HI% isd ; ied = HI% ied ; jsd = HI% jsd ; jed = HI% jed
5276
5270
IsdB = HI% IsdB ; IedB = HI% IedB ; JsdB = HI% JsdB ; JedB = HI% JedB
@@ -5283,33 +5277,6 @@ subroutine register_barotropic_restarts(HI, GV, US, param_file, CS, restart_CS)
5283
5277
" sum(u dh_dt) while also correcting for truncation errors." , &
5284
5278
default= .false. , do_not_log= .true. )
5285
5279
5286
- call get_param(param_file, mdl, " STREAMING_FILTER_M2" , CS% use_filter_m2, &
5287
- " If true, turn on streaming band-pass filter for detecting " // &
5288
- " instantaneous tidal signals." , default= .false. )
5289
- call get_param(param_file, mdl, " STREAMING_FILTER_K1" , CS% use_filter_k1, &
5290
- " If true, turn on streaming band-pass filter for detecting " // &
5291
- " instantaneous tidal signals." , default= .false. )
5292
- call get_param(param_file, mdl, " FILTER_ALPHA_M2" , am2, &
5293
- " Bandwidth parameter of the streaming filter targeting the M2 frequency. " // &
5294
- " Must be positive. To turn off filtering, set FILTER_ALPHA_M2 <= 0.0." , &
5295
- default= 0.0 , units= " nondim" , do_not_log= .not. CS% use_filter_m2)
5296
- call get_param(param_file, mdl, " FILTER_ALPHA_K1" , ak1, &
5297
- " Bandwidth parameter of the streaming filter targeting the K1 frequency. " // &
5298
- " Must be positive. To turn off filtering, set FILTER_ALPHA_K1 <= 0.0." , &
5299
- default= 0.0 , units= " nondim" , do_not_log= .not. CS% use_filter_k1)
5300
- call get_param(param_file, mdl, " TIDE_M2_FREQ" , om2, &
5301
- " Frequency of the M2 tidal constituent. " // &
5302
- " This is only used if TIDES and TIDE_M2" // &
5303
- " are true, or if OBC_TIDE_N_CONSTITUENTS > 0 and M2" // &
5304
- " is in OBC_TIDE_CONSTITUENTS." , units= " rad s-1" , default= tidal_frequency(" M2" ), &
5305
- scale= US% T_to_s, do_not_log= .true. )
5306
- call get_param(param_file, mdl, " TIDE_K1_FREQ" , ok1, &
5307
- " Frequency of the K1 tidal constituent. " // &
5308
- " This is only used if TIDES and TIDE_K1" // &
5309
- " are true, or if OBC_TIDE_N_CONSTITUENTS > 0 and K1" // &
5310
- " is in OBC_TIDE_CONSTITUENTS." , units= " rad s-1" , default= tidal_frequency(" K1" ), &
5311
- scale= US% T_to_s, do_not_log= .true. )
5312
-
5313
5280
ALLOC_(CS% ubtav(IsdB:IedB,jsd:jed)) ; CS% ubtav(:,:) = 0.0
5314
5281
ALLOC_(CS% vbtav(isd:ied,JsdB:JedB)) ; CS% vbtav(:,:) = 0.0
5315
5282
if (CS% gradual_BT_ICs) then
@@ -5338,22 +5305,17 @@ subroutine register_barotropic_restarts(HI, GV, US, param_file, CS, restart_CS)
5338
5305
call register_restart_field(CS% dtbt, " DTBT" , .false. , restart_CS, &
5339
5306
longname= " Barotropic timestep" , units= " seconds" , conversion= US% T_to_s)
5340
5307
5341
- ! Initialize and register streaming filters
5342
- if (CS% use_filter_m2) then
5343
- if (am2 > 0.0 .and. om2 > 0.0 ) then
5344
- call Filt_register(am2, om2, ' u' , HI, CS% Filt_CS_um2)
5345
- call Filt_register(am2, om2, ' v' , HI, CS% Filt_CS_vm2)
5346
- else
5347
- CS% use_filter_m2 = .false.
5348
- endif
5349
- endif
5350
- if (CS% use_filter_k1) then
5351
- if (ak1 > 0.0 .and. ok1 > 0.0 ) then
5352
- call Filt_register(ak1, ok1, ' u' , HI, CS% Filt_CS_uk1)
5353
- call Filt_register(ak1, ok1, ' v' , HI, CS% Filt_CS_vk1)
5354
- else
5355
- CS% use_filter_k1 = .false.
5356
- endif
5308
+ ! Initialize and register streaming band-pass filters
5309
+ call get_param(param_file, mdl, " USE_FILTER" , CS% use_filter, &
5310
+ " If true, use streaming band-pass filters to detect the " // &
5311
+ " instantaneous tidal signals in the simulation." , default= .false. )
5312
+ call get_param(param_file, mdl, " N_FILTERS" , n_filters, &
5313
+ " Number of streaming band-pass filters to be used in the simulation." , &
5314
+ default= 0 , do_not_log= .not. CS% use_filter)
5315
+ if (n_filters<= 0 ) CS% use_filter = .false.
5316
+ if (CS% use_filter) then
5317
+ call Filt_register(n_filters, ' ubt' , ' u' , HI, CS% Filt_CS_u, restart_CS)
5318
+ call Filt_register(n_filters, ' vbt' , ' v' , HI, CS% Filt_CS_v, restart_CS)
5357
5319
endif
5358
5320
5359
5321
end subroutine register_barotropic_restarts
0 commit comments