@@ -1436,6 +1436,9 @@ end subroutine mpas_atm_run_compatibility
14361436 !-----------------------------------------------------------------------
14371437 subroutine atm_build_halo_groups (domain , ierr )
14381438
1439+ use mpas_halo, only : mpas_halo_init, mpas_halo_exch_group_create, mpas_halo_exch_group_add_field, &
1440+ mpas_halo_exch_group_complete, mpas_halo_exch_group_full_halo_exch
1441+
14391442 type (domain_type), intent (inout ) :: domain
14401443 integer , intent (inout ) :: ierr
14411444
@@ -1560,6 +1563,139 @@ subroutine atm_build_halo_groups(domain, ierr)
15601563 !
15611564 exchange_halo_group = > mpas_dmpar_exch_group_full_halo_exch
15621565
1566+ else if (trim (config_halo_exch_method) == ' mpas_halo' ) then
1567+
1568+ call mpas_log_write(' ' )
1569+ call mpas_log_write(' *** Using '' mpas_halo'' routines for exchanging halos' )
1570+ call mpas_log_write(' ' )
1571+
1572+ call mpas_halo_init(domain)
1573+
1574+ !
1575+ ! Set up halo exchange groups used during atmosphere core initialization
1576+ !
1577+ call mpas_halo_exch_group_create(domain, ' initialization:u' )
1578+ call mpas_halo_exch_group_add_field(domain, ' initialization:u' , ' u' , timeLevel= 1 , haloLayers= (/ 1 ,2 ,3 / ))
1579+ call mpas_halo_exch_group_complete(domain, ' initialization:u' )
1580+
1581+ call mpas_halo_exch_group_create(domain, ' initialization:pv_edge,ru,rw' )
1582+ call mpas_halo_exch_group_add_field(domain, ' initialization:pv_edge,ru,rw' , ' pv_edge' , timeLevel= 1 , haloLayers= (/ 1 ,2 ,3 / ))
1583+ call mpas_halo_exch_group_add_field(domain, ' initialization:pv_edge,ru,rw' , ' ru' , timeLevel= 1 , haloLayers= (/ 1 ,2 ,3 / ))
1584+ call mpas_halo_exch_group_add_field(domain, ' initialization:pv_edge,ru,rw' , ' rw' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1585+ call mpas_halo_exch_group_complete(domain, ' initialization:pv_edge,ru,rw' )
1586+
1587+ !
1588+ ! Set up halo exchange groups used by dynamics
1589+ !
1590+ call mpas_halo_exch_group_create(domain, ' dynamics:theta_m,scalars,pressure_p,rtheta_p' )
1591+ call mpas_halo_exch_group_add_field(domain, ' dynamics:theta_m,scalars,pressure_p,rtheta_p' , ' theta_m' , &
1592+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1593+ call mpas_halo_exch_group_add_field(domain, ' dynamics:theta_m,scalars,pressure_p,rtheta_p' , ' scalars' , &
1594+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1595+ call mpas_halo_exch_group_add_field(domain, ' dynamics:theta_m,scalars,pressure_p,rtheta_p' , ' pressure_p' , &
1596+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1597+ call mpas_halo_exch_group_add_field(domain, ' dynamics:theta_m,scalars,pressure_p,rtheta_p' , ' rtheta_p' , &
1598+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1599+ call mpas_halo_exch_group_complete(domain, ' dynamics:theta_m,scalars,pressure_p,rtheta_p' )
1600+
1601+ call mpas_halo_exch_group_create(domain, ' dynamics:rw_p,ru_p,rho_pp,rtheta_pp' )
1602+ call mpas_halo_exch_group_add_field(domain, ' dynamics:rw_p,ru_p,rho_pp,rtheta_pp' , ' rw_p' , &
1603+ timeLevel= 1 , haloLayers= (/ 1 / ))
1604+ call mpas_halo_exch_group_add_field(domain, ' dynamics:rw_p,ru_p,rho_pp,rtheta_pp' , ' ru_p' , &
1605+ timeLevel= 1 , haloLayers= (/ 2 / ))
1606+ call mpas_halo_exch_group_add_field(domain, ' dynamics:rw_p,ru_p,rho_pp,rtheta_pp' , ' rho_pp' , &
1607+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1608+ call mpas_halo_exch_group_add_field(domain, ' dynamics:rw_p,ru_p,rho_pp,rtheta_pp' , ' rtheta_pp' , &
1609+ timeLevel= 1 , haloLayers= (/ 2 / ))
1610+ call mpas_halo_exch_group_complete(domain, ' dynamics:rw_p,ru_p,rho_pp,rtheta_pp' )
1611+
1612+ call mpas_halo_exch_group_create(domain, ' dynamics:w,pv_edge,rho_edge' )
1613+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w,pv_edge,rho_edge' , ' w' , timeLevel= 2 , haloLayers= (/ 1 ,2 / ))
1614+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w,pv_edge,rho_edge' , ' pv_edge' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1615+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w,pv_edge,rho_edge' , ' rho_edge' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1616+ call mpas_halo_exch_group_complete(domain, ' dynamics:w,pv_edge,rho_edge' )
1617+
1618+ call mpas_halo_exch_group_create(domain, ' dynamics:w,pv_edge,rho_edge,scalars' )
1619+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w,pv_edge,rho_edge,scalars' , ' w' , &
1620+ timeLevel= 2 , haloLayers= (/ 1 ,2 / ))
1621+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w,pv_edge,rho_edge,scalars' , ' pv_edge' , &
1622+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1623+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w,pv_edge,rho_edge,scalars' , ' rho_edge' , &
1624+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1625+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w,pv_edge,rho_edge,scalars' , ' scalars' , &
1626+ timeLevel= 2 , haloLayers= (/ 1 ,2 / ))
1627+ call mpas_halo_exch_group_complete(domain, ' dynamics:w,pv_edge,rho_edge,scalars' )
1628+
1629+ call mpas_halo_exch_group_create(domain, ' dynamics:theta_m,pressure_p,rtheta_p' )
1630+ call mpas_halo_exch_group_add_field(domain, ' dynamics:theta_m,pressure_p,rtheta_p' , ' theta_m' , &
1631+ timeLevel= 2 , haloLayers= (/ 1 ,2 / ))
1632+ call mpas_halo_exch_group_add_field(domain, ' dynamics:theta_m,pressure_p,rtheta_p' , ' pressure_p' , &
1633+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1634+ call mpas_halo_exch_group_add_field(domain, ' dynamics:theta_m,pressure_p,rtheta_p' , ' rtheta_p' , &
1635+ timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1636+ call mpas_halo_exch_group_complete(domain, ' dynamics:theta_m,pressure_p,rtheta_p' )
1637+
1638+
1639+ call mpas_halo_exch_group_create(domain, ' dynamics:exner' )
1640+ call mpas_halo_exch_group_add_field(domain, ' dynamics:exner' , ' exner' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1641+ call mpas_halo_exch_group_complete(domain, ' dynamics:exner' )
1642+
1643+ call mpas_halo_exch_group_create(domain, ' dynamics:tend_u' )
1644+ call mpas_halo_exch_group_add_field(domain, ' dynamics:tend_u' , ' tend_u' , timeLevel= 1 , haloLayers= (/ 1 / ))
1645+ call mpas_halo_exch_group_complete(domain, ' dynamics:tend_u' )
1646+
1647+ call mpas_halo_exch_group_create(domain, ' dynamics:rho_pp' )
1648+ call mpas_halo_exch_group_add_field(domain, ' dynamics:rho_pp' , ' rho_pp' , timeLevel= 1 , haloLayers= (/ 1 / ))
1649+ call mpas_halo_exch_group_complete(domain, ' dynamics:rho_pp' )
1650+
1651+ call mpas_halo_exch_group_create(domain, ' dynamics:rtheta_pp' )
1652+ call mpas_halo_exch_group_add_field(domain, ' dynamics:rtheta_pp' , ' rtheta_pp' , timeLevel= 1 , haloLayers= (/ 1 / ))
1653+ call mpas_halo_exch_group_complete(domain, ' dynamics:rtheta_pp' )
1654+
1655+ call mpas_halo_exch_group_create(domain, ' dynamics:u_123' )
1656+ call mpas_halo_exch_group_add_field(domain, ' dynamics:u_123' , ' u' , timeLevel= 2 , haloLayers= (/ 1 ,2 ,3 / ))
1657+ call mpas_halo_exch_group_complete(domain, ' dynamics:u_123' )
1658+
1659+ call mpas_halo_exch_group_create(domain, ' dynamics:u_3' )
1660+ call mpas_halo_exch_group_add_field(domain, ' dynamics:u_3' , ' u' , timeLevel= 2 , haloLayers= (/ 3 / ))
1661+ call mpas_halo_exch_group_complete(domain, ' dynamics:u_3' )
1662+
1663+ call mpas_halo_exch_group_create(domain, ' dynamics:scalars' )
1664+ call mpas_halo_exch_group_add_field(domain, ' dynamics:scalars' , ' scalars' , timeLevel= 2 , haloLayers= (/ 1 ,2 / ))
1665+ call mpas_halo_exch_group_complete(domain, ' dynamics:scalars' )
1666+
1667+ call mpas_halo_exch_group_create(domain, ' dynamics:scalars_old' )
1668+ call mpas_halo_exch_group_add_field(domain, ' dynamics:scalars_old' , ' scalars' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1669+ call mpas_halo_exch_group_complete(domain, ' dynamics:scalars_old' )
1670+
1671+ call mpas_halo_exch_group_create(domain, ' dynamics:w' )
1672+ call mpas_halo_exch_group_add_field(domain, ' dynamics:w' , ' w' , timeLevel= 2 , haloLayers= (/ 1 ,2 / ))
1673+ call mpas_halo_exch_group_complete(domain, ' dynamics:w' )
1674+
1675+ call mpas_halo_exch_group_create(domain, ' dynamics:scale' )
1676+ call mpas_halo_exch_group_add_field(domain, ' dynamics:scale' , ' scale' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1677+ call mpas_halo_exch_group_complete(domain, ' dynamics:scale' )
1678+
1679+ #ifdef DO_PHYSICS
1680+ !
1681+ ! Set up halo exchange groups used by physics
1682+ !
1683+ call mpas_halo_exch_group_create(domain, ' physics:blten' )
1684+ call mpas_halo_exch_group_add_field(domain, ' physics:blten' , ' rublten' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1685+ call mpas_halo_exch_group_add_field(domain, ' physics:blten' , ' rvblten' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1686+ call mpas_halo_exch_group_complete(domain, ' physics:blten' )
1687+
1688+ call mpas_halo_exch_group_create(domain, ' physics:cuten' )
1689+ call mpas_halo_exch_group_add_field(domain, ' physics:cuten' , ' rucuten' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1690+ call mpas_halo_exch_group_add_field(domain, ' physics:cuten' , ' rvcuten' , timeLevel= 1 , haloLayers= (/ 1 ,2 / ))
1691+ call mpas_halo_exch_group_complete(domain, ' physics:cuten' )
1692+ #endif
1693+
1694+ !
1695+ ! Set routine to exchange a halo group
1696+ !
1697+ exchange_halo_group = > mpas_halo_exch_group_full_halo_exch
1698+
15631699 else
15641700
15651701 !
@@ -1594,6 +1730,8 @@ end subroutine atm_build_halo_groups
15941730 !-----------------------------------------------------------------------
15951731 subroutine atm_destroy_halo_groups (domain , ierr )
15961732
1733+ use mpas_halo, only : mpas_halo_exch_group_destroy, mpas_halo_finalize
1734+
15971735 type (domain_type), intent (inout ) :: domain
15981736 integer , intent (inout ) :: ierr
15991737
@@ -1633,6 +1771,44 @@ subroutine atm_destroy_halo_groups(domain, ierr)
16331771 call mpas_dmpar_exch_group_destroy(domain, ' physics:cuten' )
16341772#endif
16351773
1774+ else if (trim (config_halo_exch_method) == ' mpas_halo' ) then
1775+
1776+ !
1777+ ! Destroy halo exchange groups used only during initialization
1778+ !
1779+ call mpas_halo_exch_group_destroy(domain, ' initialization:u' )
1780+ call mpas_halo_exch_group_destroy(domain, ' initialization:pv_edge,ru,rw' )
1781+
1782+ !
1783+ ! Destroy halo exchange groups used by dynamics
1784+ !
1785+ call mpas_halo_exch_group_destroy(domain, ' dynamics:theta_m,scalars,pressure_p,rtheta_p' )
1786+ call mpas_halo_exch_group_destroy(domain, ' dynamics:rw_p,ru_p,rho_pp,rtheta_pp' )
1787+ call mpas_halo_exch_group_destroy(domain, ' dynamics:w,pv_edge,rho_edge' )
1788+ call mpas_halo_exch_group_destroy(domain, ' dynamics:w,pv_edge,rho_edge,scalars' )
1789+ call mpas_halo_exch_group_destroy(domain, ' dynamics:theta_m,pressure_p,rtheta_p' )
1790+
1791+ call mpas_halo_exch_group_destroy(domain, ' dynamics:exner' )
1792+ call mpas_halo_exch_group_destroy(domain, ' dynamics:tend_u' )
1793+ call mpas_halo_exch_group_destroy(domain, ' dynamics:rho_pp' )
1794+ call mpas_halo_exch_group_destroy(domain, ' dynamics:rtheta_pp' )
1795+ call mpas_halo_exch_group_destroy(domain, ' dynamics:u_123' )
1796+ call mpas_halo_exch_group_destroy(domain, ' dynamics:u_3' )
1797+ call mpas_halo_exch_group_destroy(domain, ' dynamics:scalars' )
1798+ call mpas_halo_exch_group_destroy(domain, ' dynamics:scalars_old' )
1799+ call mpas_halo_exch_group_destroy(domain, ' dynamics:w' )
1800+ call mpas_halo_exch_group_destroy(domain, ' dynamics:scale' )
1801+
1802+ #ifdef DO_PHYSICS
1803+ !
1804+ ! Destroy halo exchange groups used by physics
1805+ !
1806+ call mpas_halo_exch_group_destroy(domain, ' physics:blten' )
1807+ call mpas_halo_exch_group_destroy(domain, ' physics:cuten' )
1808+ #endif
1809+
1810+ call mpas_halo_finalize(domain)
1811+
16361812 else
16371813
16381814 !
0 commit comments