1695 type(mom_domain_type),
intent(in) :: md_in
1696 type(mom_domain_type),
pointer :: mom_dom
1697 integer,
dimension(2),
optional,
intent(inout) :: min_halo
1698 integer,
optional,
intent(in) :: halo_size
1699 logical,
optional,
intent(in) :: symmetric
1700 character(len=*),
optional,
intent(in) :: domain_name
1702 integer :: global_indices(4)
1703 logical :: mask_table_exists
1704 character(len=64) :: dom_name
1706 if (.not.
associated(mom_dom))
then 1708 allocate(mom_dom%mpp_domain)
1712 mom_dom%niglobal = md_in%niglobal ; mom_dom%njglobal = md_in%njglobal
1713 mom_dom%nihalo = md_in%nihalo ; mom_dom%njhalo = md_in%njhalo
1715 mom_dom%symmetric = md_in%symmetric
1716 mom_dom%nonblocking_updates = md_in%nonblocking_updates
1718 mom_dom%X_FLAGS = md_in%X_FLAGS ; mom_dom%Y_FLAGS = md_in%Y_FLAGS
1719 mom_dom%layout(:) = md_in%layout(:) ; mom_dom%io_layout(:) = md_in%io_layout(:)
1720 mom_dom%use_io_layout = (mom_dom%io_layout(1) + mom_dom%io_layout(2) > 0)
1722 if (
associated(md_in%maskmap))
then 1723 mask_table_exists = .true.
1724 allocate(mom_dom%maskmap(mom_dom%layout(1), mom_dom%layout(2)))
1725 mom_dom%maskmap(:,:) = md_in%maskmap(:,:)
1727 mask_table_exists = .false.
1730 if (
present(halo_size) .and.
present(min_halo))
call mom_error(fatal, &
1731 "clone_MOM_domain can not have both halo_size and min_halo present.")
1733 if (
present(min_halo))
then 1734 mom_dom%nihalo = max(mom_dom%nihalo, min_halo(1))
1735 min_halo(1) = mom_dom%nihalo
1736 mom_dom%njhalo = max(mom_dom%njhalo, min_halo(2))
1737 min_halo(2) = mom_dom%njhalo
1740 if (
present(halo_size))
then 1741 mom_dom%nihalo = halo_size ; mom_dom%njhalo = halo_size
1744 if (
present(symmetric))
then ; mom_dom%symmetric = symmetric ;
endif 1747 if (
present(domain_name)) dom_name = trim(domain_name)
1749 global_indices(1) = 1 ; global_indices(2) = mom_dom%niglobal
1750 global_indices(3) = 1 ; global_indices(4) = mom_dom%njglobal
1751 if (mask_table_exists)
then 1752 call mom_define_domain( global_indices, mom_dom%layout, mom_dom%mpp_domain, &
1753 xflags=mom_dom%X_FLAGS, yflags=mom_dom%Y_FLAGS, &
1754 xhalo=mom_dom%nihalo, yhalo=mom_dom%njhalo, &
1755 symmetry = mom_dom%symmetric, name=dom_name, &
1756 maskmap=mom_dom%maskmap )
1758 call mom_define_domain( global_indices, mom_dom%layout, mom_dom%mpp_domain, &
1759 xflags=mom_dom%X_FLAGS, yflags=mom_dom%Y_FLAGS, &
1760 xhalo=mom_dom%nihalo, yhalo=mom_dom%njhalo, &
1761 symmetry = mom_dom%symmetric, name=dom_name)
1764 if ((mom_dom%io_layout(1) + mom_dom%io_layout(2) > 0) .and. &
1765 (mom_dom%layout(1)*mom_dom%layout(2) > 1))
then 1766 call mom_define_io_domain(mom_dom%mpp_domain, mom_dom%io_layout)