Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#4 - subroutines coupler_full_chksum and coupler_stocks #114

Merged
merged 98 commits into from
May 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
a40f8fc
create coupler_wrapper_mod and remove fredb_id
Jan 26, 2024
bbfe3b6
add coupler_wrapper
Jan 29, 2024
cae99f4
add clocks, might not compile
mlee03 Feb 5, 2024
5c0e849
add full_coupler_mod
mlee03 Feb 5, 2024
cd0e905
fix errors
mlee03 Feb 5, 2024
99cc5a5
move omp_lib to full_coupler_mode
mlee03 Feb 5, 2024
2c3270c
fix typo in omp section
mlee03 Feb 6, 2024
d2961a6
change omp to full_coupler_clocks
mlee03 Feb 7, 2024
cd5a052
fix clock in omp
mlee03 Feb 7, 2024
5699072
initialize clock in coupler_init
mlee03 Feb 7, 2024
c6ee300
fix initialization clock
mlee03 Feb 7, 2024
dccf9a4
cleanup public private
mlee03 Feb 7, 2024
d1767dc
fix spacing
mlee03 Feb 7, 2024
4478b27
correct clock initializations
mlee03 Feb 8, 2024
4ab65b5
fix typo in clocks; add mpp_error to clocks
mlee03 Feb 8, 2024
a60abd3
fix init clocks again
mlee03 Feb 8, 2024
a6760b2
forgot coupler clock initialization
mlee03 Feb 9, 2024
33c0425
add public
mlee03 Mar 8, 2024
ac25fd8
fix end module
mlee03 Mar 8, 2024
cb0b7cf
fix spacing
mlee03 Mar 8, 2024
5a3187a
make text public
mlee03 Mar 8, 2024
1bb5298
add ocean_chksum to public
mlee03 Mar 8, 2024
cdd38b1
use fms in coupler_main
mlee03 Mar 8, 2024
9d71ff5
Merge remote-tracking branch 'fms/main' into create_clocks
mlee03 Mar 10, 2024
4f10df3
Merge remote-tracking branch 'fms/main' into create_coupler_wrapper
mlee03 Mar 11, 2024
273a7bf
use fms
mlee03 Mar 13, 2024
7f5e81f
implicit none
mlee03 Mar 19, 2024
06bd214
implicit none
mlee03 Mar 19, 2024
ba3065f
add fredb_id back
mlee03 Mar 26, 2024
04e06ab
lint?
mlee03 Mar 26, 2024
c51a69a
add fredb_id back
mlee03 Mar 26, 2024
9a7d00e
forgot variable declarations for fredbid
mlee03 Mar 26, 2024
fb6fda0
use MACRO for version update
mlee03 Mar 29, 2024
d626009
update macro name
mlee03 Mar 29, 2024
e4440ca
add tag
mlee03 Mar 29, 2024
fe17c6b
add quotes
mlee03 Mar 29, 2024
a42f4f9
remove quoets
mlee03 Mar 29, 2024
9731db4
file_version.fh
mlee03 Apr 11, 2024
c5c9e2f
add untracked file
mlee03 Apr 11, 2024
af3039e
add _in to clock subroutine args
Apr 16, 2024
8cf0e79
more fixes
Apr 16, 2024
46787c7
fix typo
mlee03 Apr 17, 2024
6b0fbd3
oops change full_coupler_clocks to coupler_clocks
mlee03 Apr 17, 2024
add6309
remove *_flux_exchange_mod clocks
Apr 17, 2024
2e965ef
IMPLICIT NONE
mlee03 Apr 18, 2024
8d50f21
Merge remote-tracking branch 'origin/create_clocks' into remove_flux_…
mlee03 Apr 18, 2024
446673f
make variables program variables inwork gaea might go down
mlee03 Apr 19, 2024
e891d18
make program variables
Apr 23, 2024
1880bfe
it compiles!
mlee03 Apr 23, 2024
9c52fc6
conc_nthreads error that wasnt there before!
mlee03 Apr 23, 2024
7e13e96
pass Time as coupler_init argument
May 6, 2024
0e8f21e
add Time_restart_current to coupler_init argument
May 6, 2024
7b517c2
change full to nothing
mlee03 May 7, 2024
1ff89ae
merge attempt
mlee03 May 7, 2024
9af81ba
fixes for compilation
mlee03 May 7, 2024
d3ad3e2
update full coupler mod
mlee03 May 9, 2024
04f5ca2
make coupler_clocks program variable
mlee03 May 9, 2024
cb7721b
make clock type public
mlee03 May 9, 2024
43c175f
Merge remote-tracking branch 'origin/create_clocks' into remove_flux_…
mlee03 May 9, 2024
cb7eb94
update to latest coupler changes
mlee03 May 9, 2024
ae1d804
add coupler_full_chksum
mlee03 May 10, 2024
660477c
Revert "add coupler_full_chksum"
mlee03 May 10, 2024
12f8fe1
fix typos
mlee03 May 10, 2024
002d0e9
Merge remote-tracking branch 'origin/remove_flux_exchange_clocks' int…
mlee03 May 10, 2024
d055b69
Merge remote-tracking branch 'mkl/update_file_version' into update_fi…
mlee03 May 10, 2024
6fd7694
restore flux clocks
mlee03 May 10, 2024
3b99fa6
Merge remote-tracking branch 'origin/update_file_version' into update…
mlee03 May 10, 2024
da4b565
restore flux clocks
mlee03 May 10, 2024
5d2fb17
fix comment
mlee03 May 10, 2024
cc23339
Merge remote-tracking branch 'origin/coupler_full_checksum' into coup…
mlee03 May 10, 2024
365899a
add coupler_stocks subroutines
mlee03 May 10, 2024
c6e3378
Revert "add coupler_stocks subroutines"
mlee03 May 10, 2024
ce62da9
fix mistakes
mlee03 May 10, 2024
c26aa4c
change full_chksum to _ocean_chksum
mlee03 May 18, 2024
638a1b2
Merge remote-tracking branch 'origin/coupler_full_checksum' into coup…
mlee03 May 18, 2024
e3664d9
Merge remote-tracking branch 'origin/coupler_stocks' into coupler_stocks
mlee03 May 18, 2024
2fca138
fix mistakes get it to compile
mlee03 May 20, 2024
60e45ee
stock changes disappeared? adding them back in
mlee03 May 20, 2024
d5bd58a
its not that simple
mlee03 May 20, 2024
b415715
register clock ids at once
mlee03 May 20, 2024
5efd041
Merge remote-tracking branch 'origin/create_clocks' into update_file_…
mlee03 May 20, 2024
218fa4f
Merge remote-tracking branch 'origin/update_file_version' into couple…
mlee03 May 20, 2024
ef42d5c
github merge gone wrong
mlee03 May 20, 2024
5e9270a
make things pretty!
mlee03 May 20, 2024
6d74405
remove public flux_stocks
May 22, 2024
42e95d9
Merge remote-tracking branch 'origin/coupler_stocks' into coupler_stocks
mlee03 May 22, 2024
c4f5873
comments
mlee03 May 22, 2024
36ad297
bring up to date with main
mlee03 May 23, 2024
cdfe049
remove fms/main
mlee03 May 23, 2024
b9c1d2d
Merge remote-tracking branch 'origin/create_clocks' into update_file_…
mlee03 May 23, 2024
73c84e3
merging gone sloppy
mlee03 May 23, 2024
bc663ea
Merge remote-tracking branch 'origin/create_clocks' into update_file_…
mlee03 May 23, 2024
17f5826
Merge remote-tracking branch 'origin/update_file_version' into couple…
mlee03 May 23, 2024
35941e5
Merge remote-tracking branch 'fms/main' into coupler_stocks
mlee03 May 31, 2024
5313898
missed merge fixes
mlee03 May 31, 2024
b04c41a
add comments for tom
mlee03 May 31, 2024
d675116
why is .emacs not working
mlee03 May 31, 2024
7b50298
missed coupler_chksum replacement
mlee03 May 31, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 19 additions & 49 deletions full/coupler_main.F90
Original file line number Diff line number Diff line change
Expand Up @@ -439,27 +439,17 @@ program coupler_main
!-----------------------------------------------------------------------
!------ ocean/slow-ice integration loop ------

if (check_stocks >= 0) then
call fms_mpp_set_current_pelist()
call flux_init_stocks(Time, Atm, Land, Ice, Ocean_state)
endif
if (check_stocks >= 0) call coupler_flux_init_finish_stocks(Time, Atm, Land, Ice, Ocean_state, &
coupler_clocks, init_stocks=.True.)

do nc = 1, num_cpld_calls
if (do_chksum) call coupler_chksum('top_of_coupled_loop+', nc, Atm, Land, Ice)
call fms_mpp_set_current_pelist()

if (do_chksum) then
if (Atm%pe) then
call fms_mpp_set_current_pelist(Atm%pelist)
call atmos_ice_land_chksum('MAIN_LOOP-', nc, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary)
endif
if (Ocean%is_ocean_pe) then
call fms_mpp_set_current_pelist(Ocean%pelist)
call ocean_chksum('MAIN_LOOP-', nc, Ocean, Ice_ocean_boundary)
endif
call fms_mpp_set_current_pelist()
endif
if (do_chksum) then
call coupler_chksum('top_of_coupled_loop+', nc, Atm, Land, Ice)
mlee03 marked this conversation as resolved.
Show resolved Hide resolved
call coupler_atmos_ice_land_ocean_chksum('MAIN_LOOP-', nc, Atm, Land, Ice,&
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary, &
Ocean, Ice_ocean_boundary)
end if

! Calls to flux_ocean_to_ice and flux_ice_to_ocean are all PE communication
! points when running concurrently. The calls are placed next to each other in
Expand Down Expand Up @@ -487,28 +477,13 @@ program coupler_main

if (do_chksum) then
call coupler_chksum('flux_ocn2ice+', nc, Atm, Land, Ice)
if (Atm%pe) then
call fms_mpp_set_current_pelist(Atm%pelist)
call atmos_ice_land_chksum('fluxocn2ice+', nc, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary)
endif
if (Ocean%is_ocean_pe) then
call fms_mpp_set_current_pelist(Ocean%pelist)
call ocean_public_type_chksum('fluxocn2ice+', nc, Ocean)
endif
call fms_mpp_set_current_pelist()
endif

! To print the value of frazil heat flux at the right time the following block
call coupler_atmos_ice_land_ocean_chksum('flux_ocn2ice+', nc, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary, &
Ocean, Ice_ocean_boundary)
end if

! needs to sit here rather than at the end of the coupler loop.
if (check_stocks > 0) then
call fms_mpp_clock_begin(coupler_clocks%flux_check_stocks)
if (check_stocks*((nc-1)/check_stocks) == nc-1 .AND. nc > 1) then
call fms_mpp_set_current_pelist()
call flux_check_stocks(Time=Time, Atm=Atm, Lnd=Land, Ice=Ice, Ocn_state=Ocean_state)
endif
call fms_mpp_clock_end(coupler_clocks%flux_check_stocks)
endif
if (check_stocks > 0) call coupler_flux_check_stocks(nc, Time, Atm, Land, Ice, Ocean_state, coupler_clocks)

if (do_ice .and. Ice%pe) then
if (Ice%slow_ice_pe) then
Expand Down Expand Up @@ -898,23 +873,18 @@ program coupler_main
enddo
102 FORMAT(A17,i5,A4,i5,A24,f10.4,A2,f10.4,A3,f10.4,A2,f10.4,A1)

call fms_mpp_set_current_pelist()
call fms_mpp_clock_begin(coupler_clocks%final_flux_check_stocks)
if (check_stocks >= 0) then
call fms_mpp_set_current_pelist()
call flux_check_stocks(Time=Time, Atm=Atm, Lnd=Land, Ice=Ice, Ocn_state=Ocean_state)
endif
call fms_mpp_clock_end(coupler_clocks%final_flux_check_stocks)

if( check_stocks >=0 ) call coupler_flux_init_finish_stocks(Time, Atm, Land, Ice, Ocean_state, &
coupler_clocks, finish_stocks=.True.)

call fms_mpp_set_current_pelist()
!-----------------------------------------------------------------------
call fms_mpp_clock_end(coupler_clocks%main)
call fms_mpp_clock_begin(coupler_clocks%termination)

if (do_chksum) call coupler_chksum('coupler_end-', nc, Atm, Land, Ice)
call coupler_end(Atm, Land, Ice, Ocean, Ocean_state, Land_ice_atmos_boundary, Atmos_ice_boundary,&
Atmos_land_boundary, Ice_ocean_boundary, Ocean_ice_boundary, Ocn_bc_restart, Ice_bc_restart, &
Time, Time_start, Time_end, Time_restart_current)
Atmos_land_boundary, Ice_ocean_boundary, Ocean_ice_boundary, Ocn_bc_restart, Ice_bc_restart, &
Time, Time_start, Time_end, Time_restart_current)

call fms_mpp_clock_end(coupler_clocks%termination)

Expand Down
10 changes: 5 additions & 5 deletions full/flux_exchange.F90
Original file line number Diff line number Diff line change
Expand Up @@ -760,11 +760,11 @@ end subroutine flux_exchange_init

subroutine flux_check_stocks(Time, Atm, Lnd, Ice, Ocn_state)

type(FmsTime_type) :: Time
type(atmos_data_type), optional :: Atm
type(land_data_type), optional :: Lnd
type(ice_data_type), optional :: Ice
type(ocean_state_type), optional, pointer :: Ocn_state
type(FmsTime_type), intent(in) :: Time
type(atmos_data_type), intent(inout), optional :: Atm
type(land_data_type), intent(inout), optional :: Lnd
type(ice_data_type), intent(inout), optional :: Ice
type(ocean_state_type), intent(inout), optional, pointer :: Ocn_state

real :: ref_value
integer :: i
Expand Down
138 changes: 109 additions & 29 deletions full/full_coupler_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ module full_coupler_mod
public :: flux_down_from_atmos, flux_up_to_atmos
public :: flux_land_to_ice, flux_ice_to_ocean, flux_ocean_to_ice
public :: flux_ice_to_ocean_finish, flux_ocean_to_ice_finish
public :: flux_check_stocks, flux_init_stocks
public :: flux_ocean_from_ice_stocks, flux_ice_to_ocean_stocks
public :: flux_atmos_to_ocean, flux_ex_arrays_dealloc
public :: atmos_tracer_driver_gather_data
Expand All @@ -125,6 +124,9 @@ module full_coupler_mod
public :: coupler_init, coupler_end, coupler_restart
public :: coupler_chksum, atmos_ice_land_chksum, slow_ice_chksum, ocean_chksum

public :: coupler_atmos_ice_land_ocean_chksum
public :: coupler_flux_init_finish_stocks, coupler_flux_check_stocks

public :: coupler_clock_type

!-----------------------------------------------------------------------
Expand Down Expand Up @@ -227,7 +229,6 @@ module full_coupler_mod
use_hyper_thread, concurrent_ice, slow_ice_with_ocean, &
do_endpoint_chksum, combined_ice_and_ocean


!> coupler_clock_type derived type consist of all clock ids that will be set and used
!! in full coupler_main.
type coupler_clock_type
Expand Down Expand Up @@ -1089,22 +1090,14 @@ subroutine coupler_init(Atm, Ocean, Land, Ice, Ocean_state, Atmos_land_boundary,

!-----------------------------------------------------------------------
if ( do_endpoint_chksum ) then
if (Atm%pe) then
call fms_mpp_set_current_pelist(Atm%pelist)
call atmos_ice_land_chksum('coupler_init+', 0, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary)
endif
call coupler_atmos_ice_land_ocean_chksum('coupler_init+', 0, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary, Ocean, Ice_ocean_boundary)
if (Ice%slow_ice_PE) then
call fms_mpp_set_current_pelist(Ice%slow_pelist)
call slow_ice_chksum('coupler_init+', 0, Ice, Ocean_ice_boundary)
endif
if (Ocean%is_ocean_pe) then
call fms_mpp_set_current_pelist(Ocean%pelist)
call ocean_chksum('coupler_init+', 0, Ocean, Ice_ocean_boundary)
endif
endif

call fms_mpp_set_current_pelist()
end if
end if

call fms_memutils_print_memuse_stats('coupler_init')

if (fms_mpp_pe().EQ.fms_mpp_root_pe()) then
Expand Down Expand Up @@ -1139,19 +1132,12 @@ subroutine coupler_end(Atm, Land, Ice, Ocean, Ocean_state, Land_ice_atmos_bounda
integer :: num_ice_bc_restart, num_ocn_bc_restart

if ( do_endpoint_chksum ) then
if (Atm%pe) then
call fms_mpp_set_current_pelist(Atm%pelist)
call atmos_ice_land_chksum('coupler_end', 0, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary)
endif
call coupler_atmos_ice_land_ocean_chksum('coupler_end', 0, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary, Ocean, Ice_ocean_boundary)
if (Ice%slow_ice_PE) then
call fms_mpp_set_current_pelist(Ice%slow_pelist)
call slow_ice_chksum('coupler_end', 0, Ice, Ocean_ice_boundary)
endif
if (Ocean%is_ocean_pe) then
call fms_mpp_set_current_pelist(Ocean%pelist)
call ocean_chksum('coupler_end', 0, Ocean, Ice_ocean_boundary)
endif
end if
endif
call fms_mpp_set_current_pelist()

Expand Down Expand Up @@ -1515,10 +1501,10 @@ end subroutine slow_ice_chksum
!! after you exit. This is only necessary if you need to return to the global pelist.
subroutine ocean_chksum(id, timestep, Ocean, Ice_ocean_boundary)

character(len=*), intent(in) :: id
integer , intent(in) :: timestep
type (ocean_public_type), intent(in) :: Ocean
type(ice_ocean_boundary_type), intent(in) :: Ice_ocean_boundary
character(len=*), intent(in) :: id !< ID labelling the set of CHECKSUMS
integer , intent(in) :: timestep !< Timestep
type (ocean_public_type), intent(in) :: Ocean !< Ocean
type(ice_ocean_boundary_type), intent(in) :: Ice_ocean_boundary !<Ice_ocean_boundary

call ocean_public_type_chksum(id, timestep, Ocean)
call ice_ocn_bnd_type_chksum( id, timestep, Ice_ocean_boundary)
Expand Down Expand Up @@ -1629,4 +1615,98 @@ subroutine coupler_set_clock_ids(coupler_clocks, Atm, Land, Ice, Ocean, ensemble

end subroutine coupler_set_clock_ids

!> \brief This subroutine calls coupler_chksum as well as atmos_ice_land_chksum and ocean_chksum
subroutine coupler_atmos_ice_land_ocean_chksum(id, timestep, Atm, Land, Ice, Land_ice_atmos_boundary,&
Atmos_ice_boundary, Atmos_land_boundary, Ocean, Ice_ocean_boundary, Ocean_ice_boundary)

implicit none

character(len=*), intent(in) :: id !< ID labelling the set of checksums
integer , intent(in) :: timestep !< timestep
type(atmos_data_type), intent(in) :: Atm !< Atm
type(land_data_type), intent(in) :: Land !< Land
type(ice_data_type), intent(in) :: Ice !< Ice
type(land_ice_atmos_boundary_type), intent(in) :: Land_ice_atmos_boundary !< Land_ice_atmos_boundary
type(atmos_ice_boundary_type), intent(in) :: Atmos_ice_boundary !< Atmos_ice_boundary
type(atmos_land_boundary_type), intent(in) :: Atmos_land_boundary !< Atmos_land_boundary
type(ocean_public_type), intent(in) :: Ocean !< Ocean
type(ice_ocean_boundary_type), intent(in) :: Ice_ocean_boundary !< Ice_ocean_boundary
type(ocean_ice_boundary_type), intent(in), optional :: Ocean_ice_boundary !< Ocean_ice_boundary

if (Atm%pe) then
call fms_mpp_set_current_pelist(Atm%pelist)
call atmos_ice_land_chksum(trim(id), timestep, Atm, Land, Ice, &
Land_ice_atmos_boundary, Atmos_ice_boundary, Atmos_land_boundary)
endif
if (Ocean%is_ocean_pe) then
call fms_mpp_set_current_pelist(Ocean%pelist)
call ocean_chksum(trim(id), timestep, Ocean, Ice_ocean_boundary)
endif

call fms_mpp_set_current_pelist()

end subroutine coupler_atmos_ice_land_ocean_chksum

!> \brief This subroutine calls flux_init_stocks or does the final call to flux_check_stocks
subroutine coupler_flux_init_finish_stocks(Time, Atm, Land, Ice, Ocean_state, &
coupler_clocks, init_stocks, finish_stocks)

implicit none

type(FmsTime_type), intent(in) :: Time !< current Time
type(atmos_data_type), intent(inout) :: Atm !< Atm
type(land_data_type), intent(inout) :: Land !< Land
type(ice_data_type), intent(inout) :: Ice !< Ice
type(ocean_state_type), pointer, intent(inout) :: Ocean_state !< Ocean_state
type(coupler_clock_type), intent(inout) :: coupler_clocks !< coupler_clocks
logical, optional, intent(in) :: init_stocks, finish_stocks !< control flags to either call flux_init_stocks or
!! the final flux_check_stocks

logical :: init, finish !< control flags set to False. by default and takes on the value of init_stocks and
!! finish_stocks if these optional arguments are provided.
!! If true, either flux_init_stocks or
!! final flux_check_stocks will be called.

init=.False. ; if(present(init_stocks)) init=init_stocks
finish=.False. ; if(present(finish_stocks)) finish=finish_stocks

if(init) then
call fms_mpp_set_current_pelist()
call flux_init_stocks(Time, Atm, Land, Ice, Ocean_state)
else if(finish) then
call fms_mpp_set_current_pelist()
call fms_mpp_clock_begin(coupler_clocks%final_flux_check_stocks)
if (check_stocks >= 0) then
call fms_mpp_set_current_pelist()
call flux_check_stocks(Time=Time, Atm=Atm, Lnd=Land, Ice=Ice, Ocn_state=Ocean_state)
endif
call fms_mpp_clock_end(coupler_clocks%final_flux_check_stocks)
else
call fms_mpp_error(FATAL, 'coupler_flux_init_finish_stocks: either init or finish needs to be .True.')
end if

end subroutine coupler_flux_init_finish_stocks

!> \brief This subroutine calls flux_check_stocks
subroutine coupler_flux_check_stocks(nc, Time, Atm, Land, Ice, Ocean_state, coupler_clocks)

implicit none

integer, intent(in) :: nc !< current outerloop timestep
type(FmsTime_type), intent(in) :: Time !< Time
type(atmos_data_type), intent(inout) :: Atm !< Atm
type(land_data_type), intent(inout) :: Land !< Land
type(ice_data_type), intent(inout) :: Ice !< Ice
type(ocean_state_type), pointer, intent(inout) :: Ocean_state !< Ocean_state
type(coupler_clock_type), intent(inout) :: coupler_clocks !< coupler_clocks

call fms_mpp_clock_begin(coupler_clocks%flux_check_stocks)
if (check_stocks*((nc-1)/check_stocks) == nc-1 .AND. nc > 1) then
call fms_mpp_set_current_pelist()
call flux_check_stocks(Time=Time, Atm=Atm, Lnd=Land, Ice=Ice, Ocn_state=Ocean_state)
endif
call fms_mpp_clock_end(coupler_clocks%flux_check_stocks)

end subroutine coupler_flux_check_stocks

end module full_coupler_mod
Loading