@@ -363,9 +363,7 @@ module MOM_barotropic
363
363
OBC_mask_v = > NULL ()
364
364
integer , dimension (:,:), pointer :: &
365
365
OBC_direction_u = > NULL (), &
366
- OBC_direction_v = > NULL (), &
367
- OBC_kind_u = > NULL (), &
368
- OBC_kind_v = > NULL ()
366
+ OBC_direction_v = > NULL ()
369
367
real , dimension (:,:), pointer :: &
370
368
Cg_u = > NULL (), & ! The external wave speed at u-points, in m s-1.
371
369
Cg_v = > NULL (), & ! The external wave speed at u-points, in m s-1.
@@ -2376,11 +2374,11 @@ subroutine apply_velocity_OBCs(OBC, ubt, vbt, uhbt, vhbt, ubt_trans, vbt_trans,
2376
2374
2377
2375
if (associated (BT_OBC% OBC_mask_u)) then
2378
2376
do j= js,je ; do I= is-1 ,ie ; if (BT_OBC% OBC_mask_u(I,j)) then
2379
- if (BT_OBC % OBC_kind_u( I,j) == OBC_SIMPLE ) then
2377
+ if (OBC % OBC_segment_list(OBC % OBC_segment_u( I,j)) % specified ) then
2380
2378
uhbt(I,j) = BT_OBC% uhbt(I,j)
2381
2379
ubt(I,j) = BT_OBC% ubt_outer(I,j)
2382
2380
vel_trans = ubt(I,j)
2383
- elseif (BT_OBC % OBC_kind_u( I,j) == OBC_FLATHER ) then
2381
+ elseif (OBC % OBC_segment_list(OBC % OBC_segment_u( I,j)) % Flather ) then
2384
2382
if (BT_OBC% OBC_direction_u(I,j) == OBC_DIRECTION_E) then
2385
2383
cfl = dtbt * BT_OBC% Cg_u(I,j) * G% IdxCu(I,j) ! CFL
2386
2384
u_inlet = cfl* ubt_old(I-1 ,j) + (1.0 - cfl)* ubt_old(I,j) ! Valid for cfl<1
@@ -2413,7 +2411,7 @@ subroutine apply_velocity_OBCs(OBC, ubt, vbt, uhbt, vhbt, ubt_trans, vbt_trans,
2413
2411
endif
2414
2412
vel_trans = ubt(I,j)
2415
2413
elseif (BT_OBC% OBC_direction_u(I,j) == OBC_DIRECTION_S) then
2416
- if ((vbt(i,J)+ vbt(i+1 ,J)) > 0.0 ) then
2414
+ if ((vbt(i,J)+ vbt(i+1 ,J)) < 0.0 ) then
2417
2415
ubt(I,j) = 2.0 * ubt(I,j+1 )- ubt(I,j+2 )
2418
2416
else
2419
2417
ubt(I,j) = BT_OBC% ubt_outer(I,j)
@@ -2422,7 +2420,7 @@ subroutine apply_velocity_OBCs(OBC, ubt, vbt, uhbt, vhbt, ubt_trans, vbt_trans,
2422
2420
endif
2423
2421
endif
2424
2422
2425
- if (BT_OBC % OBC_kind_u( I,j) /= OBC_SIMPLE ) then
2423
+ if (.not. OBC % OBC_segment_list(OBC % OBC_segment_u( I,j)) % specified ) then
2426
2424
if (use_BT_cont) then
2427
2425
uhbt(I,j) = find_uhbt(vel_trans,BTCL_u(I,j)) + uhbt0(I,j)
2428
2426
else
@@ -2436,11 +2434,11 @@ subroutine apply_velocity_OBCs(OBC, ubt, vbt, uhbt, vhbt, ubt_trans, vbt_trans,
2436
2434
2437
2435
if (associated (BT_OBC% OBC_mask_v)) then
2438
2436
do J= js-1 ,je ; do i= is,ie ; if (BT_OBC% OBC_mask_v(i,J)) then
2439
- if (BT_OBC % OBC_kind_v( i,J) == OBC_SIMPLE ) then
2437
+ if (OBC % OBC_segment_list(OBC % OBC_segment_v( i,J)) % specified ) then
2440
2438
vhbt(i,J) = BT_OBC% vhbt(i,J)
2441
2439
vbt(i,J) = BT_OBC% vbt_outer(i,J)
2442
2440
vel_trans = vbt(i,J)
2443
- elseif (BT_OBC % OBC_kind_v( i,J) == OBC_FLATHER ) then
2441
+ elseif (OBC % OBC_segment_list(OBC % OBC_segment_v( i,J)) % Flather ) then
2444
2442
if (BT_OBC% OBC_direction_v(i,J) == OBC_DIRECTION_N) then
2445
2443
cfl = dtbt * BT_OBC% Cg_v(i,J) * G% IdyCv(I,j) ! CFL
2446
2444
v_inlet = cfl* vbt_old(i,J-1 ) + (1.0 - cfl)* vbt_old(i,J) ! Valid for cfl<1
@@ -2490,7 +2488,7 @@ subroutine apply_velocity_OBCs(OBC, ubt, vbt, uhbt, vhbt, ubt_trans, vbt_trans,
2490
2488
endif
2491
2489
endif
2492
2490
2493
- if (BT_OBC % OBC_kind_v( i,J) /= OBC_SIMPLE ) then
2491
+ if (.not. OBC % OBC_segment_list(OBC % OBC_segment_v( i,J)) % specified ) then
2494
2492
if (use_BT_cont) then
2495
2493
vhbt(i,J) = find_vhbt(vel_trans,BTCL_v(i,J)) + vhbt0(i,J)
2496
2494
else
@@ -2538,50 +2536,54 @@ subroutine apply_eta_OBCs(OBC, eta, ubt, vbt, BT_OBC, G, MS, halo, dtbt)
2538
2536
2539
2537
if ((OBC% apply_OBC_u_flather_east .or. OBC% apply_OBC_u_flather_west) .and. &
2540
2538
associated (BT_OBC% OBC_mask_u)) then
2541
- do j= js,je ; do I= is-1 ,ie ; if (BT_OBC% OBC_kind_u(I,j) == OBC_FLATHER) then
2542
- if (BT_OBC% OBC_direction_u(I,j) == OBC_DIRECTION_E) then
2543
- cfl = dtbt * BT_OBC% Cg_u(I,j) * G% IdxCu(I,j) ! CFL
2544
- u_inlet = cfl* ubt(I-1 ,j) + (1.0 - cfl)* ubt(I,j) ! Valid for cfl <1
2545
- ! h_in = 2.0*cfl*eta(i,j) + (1.0-2.0*cfl)*eta(i+1,j) ! external
2546
- h_in = eta(i,j) + (0.5 - cfl)* (eta(i,j)- eta(i-1 ,j)) ! internal
2547
-
2548
- H_u = BT_OBC% H_u(I,j)
2549
- eta(i+1 ,j) = 2.0 * 0.5 * ((BT_OBC% eta_outer_u(I,j)+ h_in) + &
2550
- (H_u/ BT_OBC% Cg_u(I,j))* (u_inlet- BT_OBC% ubt_outer(I,j))) - eta(i,j)
2551
- elseif (BT_OBC% OBC_direction_u(I,j) == OBC_DIRECTION_W) then
2552
- cfl = dtbt* BT_OBC% Cg_u(I,j)* G% IdxCu(I,j) ! CFL
2553
- u_inlet = cfl* ubt(I+1 ,j) + (1.0 - cfl)* ubt(I,j) ! Valid for cfl <1
2554
- ! h_in = 2.0*cfl*eta(i+1,j) + (1.0-2.0*cfl)*eta(i,j) ! external
2555
- h_in = eta(i+1 ,j) + (0.5 - cfl)* (eta(i+1 ,j)- eta(i+2 ,j)) ! internal
2556
-
2557
- H_u = BT_OBC% H_u(I,j)
2558
- eta(i,j) = 2.0 * 0.5 * ((BT_OBC% eta_outer_u(I,j)+ h_in) + &
2559
- (H_u/ BT_OBC% Cg_u(I,j))* (BT_OBC% ubt_outer(I,j)- u_inlet)) - eta(i+1 ,j)
2539
+ do j= js,je ; do I= is-1 ,ie ; if (OBC% OBC_segment_u(I,j) /= OBC_NONE) then
2540
+ if (OBC% OBC_segment_list(OBC% OBC_segment_u(I,j))% Flather) then
2541
+ if (BT_OBC% OBC_direction_u(I,j) == OBC_DIRECTION_E) then
2542
+ cfl = dtbt * BT_OBC% Cg_u(I,j) * G% IdxCu(I,j) ! CFL
2543
+ u_inlet = cfl* ubt(I-1 ,j) + (1.0 - cfl)* ubt(I,j) ! Valid for cfl <1
2544
+ ! h_in = 2.0*cfl*eta(i,j) + (1.0-2.0*cfl)*eta(i+1,j) ! external
2545
+ h_in = eta(i,j) + (0.5 - cfl)* (eta(i,j)- eta(i-1 ,j)) ! internal
2546
+
2547
+ H_u = BT_OBC% H_u(I,j)
2548
+ eta(i+1 ,j) = 2.0 * 0.5 * ((BT_OBC% eta_outer_u(I,j)+ h_in) + &
2549
+ (H_u/ BT_OBC% Cg_u(I,j))* (u_inlet- BT_OBC% ubt_outer(I,j))) - eta(i,j)
2550
+ elseif (BT_OBC% OBC_direction_u(I,j) == OBC_DIRECTION_W) then
2551
+ cfl = dtbt* BT_OBC% Cg_u(I,j)* G% IdxCu(I,j) ! CFL
2552
+ u_inlet = cfl* ubt(I+1 ,j) + (1.0 - cfl)* ubt(I,j) ! Valid for cfl <1
2553
+ ! h_in = 2.0*cfl*eta(i+1,j) + (1.0-2.0*cfl)*eta(i,j) ! external
2554
+ h_in = eta(i+1 ,j) + (0.5 - cfl)* (eta(i+1 ,j)- eta(i+2 ,j)) ! internal
2555
+
2556
+ H_u = BT_OBC% H_u(I,j)
2557
+ eta(i,j) = 2.0 * 0.5 * ((BT_OBC% eta_outer_u(I,j)+ h_in) + &
2558
+ (H_u/ BT_OBC% Cg_u(I,j))* (BT_OBC% ubt_outer(I,j)- u_inlet)) - eta(i+1 ,j)
2559
+ endif
2560
2560
endif
2561
2561
endif ; enddo ; enddo
2562
2562
endif
2563
2563
2564
2564
if ((OBC% apply_OBC_v_flather_north .or. OBC% apply_OBC_v_flather_south) .and. &
2565
2565
associated (BT_OBC% OBC_mask_v)) then
2566
- do J= js-1 ,je ; do i= is,ie ; if (BT_OBC% OBC_kind_v(i,J) == OBC_FLATHER) then
2567
- if (BT_OBC% OBC_direction_v(i,J) == OBC_DIRECTION_N) then
2568
- cfl = dtbt* BT_OBC% Cg_v(i,J)* G% IdyCv(i,J) ! CFL
2569
- v_inlet = cfl* vbt(i,J-1 ) + (1.0 - cfl)* vbt(i,J) ! Valid for cfl <1
2570
- ! h_in = 2.0*cfl*eta(i,j) + (1.0-2.0*cfl)*eta(i,j+1) ! external
2571
- h_in = eta(i,j) + (0.5 - cfl)* (eta(i,j)- eta(i,j-1 )) ! internal
2572
-
2573
- H_v = BT_OBC% H_v(i,J)
2574
- eta(i,j+1 ) = 2.0 * 0.5 * ((BT_OBC% eta_outer_v(i,J)+ h_in) + &
2575
- (H_v/ BT_OBC% Cg_v(i,J))* (v_inlet- BT_OBC% vbt_outer(i,J))) - eta(i,j)
2576
- elseif (BT_OBC% OBC_direction_v(i,J) == OBC_DIRECTION_S) then
2577
- cfl = dtbt* BT_OBC% Cg_v(i,J)* G% IdyCv(i,J) ! CFL
2578
- v_inlet = cfl* vbt(i,J+1 ) + (1.0 - cfl)* vbt(i,J) ! Valid for cfl <1
2579
- ! h_in = 2.0*cfl*eta(i,j+1) + (1.0-2.0*cfl)*eta(i,j) ! external
2580
- h_in = eta(i,j+1 ) + (0.5 - cfl)* (eta(i,j+1 )- eta(i,j+2 )) ! internal
2581
-
2582
- H_v = BT_OBC% H_v(i,J)
2583
- eta(i,j) = 2.0 * 0.5 * ((BT_OBC% eta_outer_v(i,J)+ h_in) + &
2584
- (H_v/ BT_OBC% Cg_v(i,J))* (BT_OBC% vbt_outer(i,J)- v_inlet)) - eta(i,j+1 )
2566
+ do J= js-1 ,je ; do i= is,ie ; if (OBC% OBC_segment_v(i,J) /= OBC_NONE) then
2567
+ if (OBC% OBC_segment_list(OBC% OBC_segment_v(i,J))% Flather) then
2568
+ if (BT_OBC% OBC_direction_v(i,J) == OBC_DIRECTION_N) then
2569
+ cfl = dtbt* BT_OBC% Cg_v(i,J)* G% IdyCv(i,J) ! CFL
2570
+ v_inlet = cfl* vbt(i,J-1 ) + (1.0 - cfl)* vbt(i,J) ! Valid for cfl <1
2571
+ ! h_in = 2.0*cfl*eta(i,j) + (1.0-2.0*cfl)*eta(i,j+1) ! external
2572
+ h_in = eta(i,j) + (0.5 - cfl)* (eta(i,j)- eta(i,j-1 )) ! internal
2573
+
2574
+ H_v = BT_OBC% H_v(i,J)
2575
+ eta(i,j+1 ) = 2.0 * 0.5 * ((BT_OBC% eta_outer_v(i,J)+ h_in) + &
2576
+ (H_v/ BT_OBC% Cg_v(i,J))* (v_inlet- BT_OBC% vbt_outer(i,J))) - eta(i,j)
2577
+ elseif (BT_OBC% OBC_direction_v(i,J) == OBC_DIRECTION_S) then
2578
+ cfl = dtbt* BT_OBC% Cg_v(i,J)* G% IdyCv(i,J) ! CFL
2579
+ v_inlet = cfl* vbt(i,J+1 ) + (1.0 - cfl)* vbt(i,J) ! Valid for cfl <1
2580
+ ! h_in = 2.0*cfl*eta(i,j+1) + (1.0-2.0*cfl)*eta(i,j) ! external
2581
+ h_in = eta(i,j+1 ) + (0.5 - cfl)* (eta(i,j+1 )- eta(i,j+2 )) ! internal
2582
+
2583
+ H_v = BT_OBC% H_v(i,J)
2584
+ eta(i,j) = 2.0 * 0.5 * ((BT_OBC% eta_outer_v(i,J)+ h_in) + &
2585
+ (H_v/ BT_OBC% Cg_v(i,J))* (BT_OBC% vbt_outer(i,J)- v_inlet)) - eta(i,j+1 )
2586
+ endif
2585
2587
endif
2586
2588
endif ; enddo ; enddo
2587
2589
endif
@@ -2640,7 +2642,6 @@ subroutine set_up_BT_OBC(OBC, eta, BT_OBC, G, GV, MS, halo, use_BT_cont, Datu, D
2640
2642
allocate (BT_OBC% ubt_outer(isdw-1 :iedw,jsdw:jedw)) ; BT_OBC% ubt_outer(:,:) = 0.0
2641
2643
allocate (BT_OBC% eta_outer_u(isdw-1 :iedw,jsdw:jedw)) ; BT_OBC% eta_outer_u(:,:) = 0.0
2642
2644
allocate (BT_OBC% OBC_mask_u(isdw-1 :iedw,jsdw:jedw)) ; BT_OBC% OBC_mask_u(:,:)= .false.
2643
- allocate (BT_OBC% OBC_kind_u(isdw-1 :iedw,jsdw:jedw)) ; BT_OBC% OBC_kind_u(:,:)= OBC_NONE
2644
2645
allocate (BT_OBC% OBC_direction_u(isdw-1 :iedw,jsdw:jedw)); BT_OBC% OBC_direction_u(:,:)= OBC_NONE
2645
2646
2646
2647
allocate (BT_OBC% Cg_v(isdw:iedw,jsdw-1 :jedw)) ; BT_OBC% Cg_v(:,:) = 0.0
@@ -2649,13 +2650,11 @@ subroutine set_up_BT_OBC(OBC, eta, BT_OBC, G, GV, MS, halo, use_BT_cont, Datu, D
2649
2650
allocate (BT_OBC% vbt_outer(isdw:iedw,jsdw-1 :jedw)) ; BT_OBC% vbt_outer(:,:) = 0.0
2650
2651
allocate (BT_OBC% eta_outer_v(isdw:iedw,jsdw-1 :jedw)) ; BT_OBC% eta_outer_v(:,:)= 0.0
2651
2652
allocate (BT_OBC% OBC_mask_v(isdw:iedw,jsdw-1 :jedw)) ; BT_OBC% OBC_mask_v(:,:)= .false.
2652
- allocate (BT_OBC% OBC_kind_v(isdw-1 :iedw,jsdw:jedw)) ; BT_OBC% OBC_kind_v(:,:)= OBC_NONE
2653
2653
allocate (BT_OBC% OBC_direction_v(isdw-1 :iedw,jsdw:jedw)); BT_OBC% OBC_direction_v(:,:)= OBC_NONE
2654
2654
2655
2655
if (associated (OBC% OBC_mask_u)) then
2656
2656
do j= js-1 ,je+1 ; do I= is-1 ,ie
2657
2657
BT_OBC% OBC_mask_u(I,j) = OBC% OBC_mask_u(I,j)
2658
- BT_OBC% OBC_kind_u(I,j) = OBC% OBC_kind_u(I,j)
2659
2658
BT_OBC% OBC_direction_u(I,j) = OBC% OBC_direction_u(I,j)
2660
2659
enddo ; enddo
2661
2660
if (OBC% apply_OBC_u) then
@@ -2664,7 +2663,7 @@ subroutine set_up_BT_OBC(OBC, eta, BT_OBC, G, GV, MS, halo, use_BT_cont, Datu, D
2664
2663
enddo ; enddo ; enddo
2665
2664
endif
2666
2665
do j= js,je ; do I= is-1 ,ie ; if (OBC% OBC_mask_u(I,j)) then
2667
- if (OBC% OBC_kind_u( I,j) == OBC_SIMPLE ) then
2666
+ if (OBC% OBC_segment_list(OBC % OBC_segment_u( I,j)) % specified ) then
2668
2667
if (use_BT_cont) then
2669
2668
BT_OBC% ubt_outer(I,j) = uhbt_to_ubt(BT_OBC% uhbt(I,j),BTCL_u(I,j))
2670
2669
else
@@ -2691,7 +2690,6 @@ subroutine set_up_BT_OBC(OBC, eta, BT_OBC, G, GV, MS, halo, use_BT_cont, Datu, D
2691
2690
if (associated (OBC% OBC_mask_v)) then
2692
2691
do J= js-1 ,je ; do i= is-1 ,ie+1
2693
2692
BT_OBC% OBC_mask_v(i,J) = OBC% OBC_mask_v(i,J)
2694
- BT_OBC% OBC_kind_v(i,J) = OBC% OBC_kind_v(i,J)
2695
2693
BT_OBC% OBC_direction_v(i,J) = OBC% OBC_direction_v(i,J)
2696
2694
enddo ; enddo
2697
2695
if (OBC% apply_OBC_v) then
@@ -2701,7 +2699,7 @@ subroutine set_up_BT_OBC(OBC, eta, BT_OBC, G, GV, MS, halo, use_BT_cont, Datu, D
2701
2699
endif
2702
2700
2703
2701
do J= js-1 ,je ; do i= is,ie ; if (OBC% OBC_mask_v(i,J)) then
2704
- if (OBC% OBC_kind_v( i,J) == OBC_SIMPLE ) then
2702
+ if (OBC% OBC_segment_list(OBC % OBC_segment_v( i,J)) % specified ) then
2705
2703
if (use_BT_cont) then
2706
2704
BT_OBC% vbt_outer(i,J) = vhbt_to_vbt(BT_OBC% vhbt(i,J),BTCL_v(i,J))
2707
2705
else
@@ -2741,7 +2739,6 @@ subroutine destroy_BT_OBC(BT_OBC)
2741
2739
type (BT_OBC_type), intent (inout ) :: BT_OBC
2742
2740
2743
2741
if (associated (BT_OBC% OBC_mask_u)) deallocate (BT_OBC% OBC_mask_u)
2744
- if (associated (BT_OBC% OBC_kind_u)) deallocate (BT_OBC% OBC_kind_u)
2745
2742
if (associated (BT_OBC% OBC_direction_u)) deallocate (BT_OBC% OBC_direction_u)
2746
2743
deallocate (BT_OBC% Cg_u)
2747
2744
deallocate (BT_OBC% H_u)
@@ -2750,7 +2747,6 @@ subroutine destroy_BT_OBC(BT_OBC)
2750
2747
deallocate (BT_OBC% eta_outer_u)
2751
2748
2752
2749
if (associated (BT_OBC% OBC_mask_v)) deallocate (BT_OBC% OBC_mask_v)
2753
- if (associated (BT_OBC% OBC_kind_v)) deallocate (BT_OBC% OBC_kind_v)
2754
2750
if (associated (BT_OBC% OBC_direction_v)) deallocate (BT_OBC% OBC_direction_v)
2755
2751
deallocate (BT_OBC% Cg_v)
2756
2752
deallocate (BT_OBC% H_v)
0 commit comments