From 894e15d5a8f1d4a67fe17cc389127b9fb59e76b9 Mon Sep 17 00:00:00 2001 From: Weiqun Zhang Date: Mon, 24 Jul 2017 14:17:11 -0700 Subject: [PATCH] Fortran: add sum_boundary and average_sync --- Src/F_Interfaces/Base/AMReX_multifab_fi.cpp | 10 +++++ Src/F_Interfaces/Base/AMReX_multifab_mod.F90 | 39 +++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Src/F_Interfaces/Base/AMReX_multifab_fi.cpp b/Src/F_Interfaces/Base/AMReX_multifab_fi.cpp index bc20ad2bdd9..101fce3c596 100644 --- a/Src/F_Interfaces/Base/AMReX_multifab_fi.cpp +++ b/Src/F_Interfaces/Base/AMReX_multifab_fi.cpp @@ -136,6 +136,16 @@ extern "C" { mf->OverrideSync(*msk, geom->periodicity()); } + void amrex_fi_multifab_sum_boundary (MultiFab* mf, const Geometry* geom, int icomp, int ncomp) + { + mf->SumBoundary(icomp, ncomp, geom->periodicity()); + } + + void amrex_fi_multifab_average_sync (MultiFab* mf, const Geometry* geom) + { + mf->AverageSync(geom->periodicity()); + } + // iMultiFab void amrex_fi_new_imultifab (iMultiFab*& imf, const BoxArray*& ba, diff --git a/Src/F_Interfaces/Base/AMReX_multifab_mod.F90 b/Src/F_Interfaces/Base/AMReX_multifab_mod.F90 index 76e27a93eec..19fa340fa62 100644 --- a/Src/F_Interfaces/Base/AMReX_multifab_mod.F90 +++ b/Src/F_Interfaces/Base/AMReX_multifab_mod.F90 @@ -44,10 +44,13 @@ module amrex_multifab_module amrex_multifab_parallel_copy_cg generic :: fill_boundary => amrex_multifab_fill_boundary, amrex_multifab_fill_boundary_c generic :: override_sync => amrex_multifab_override_sync, amrex_multifab_override_sync_mask + generic :: sum_boundary => amrex_multifab_sum_boundary, amrex_multifab_sum_boundary_c + procedure :: average_sync => amrex_multifab_average_sync procedure, private :: amrex_multifab_fill_boundary, amrex_multifab_fill_boundary_c, & amrex_multifab_parallel_copy, amrex_multifab_parallel_copy_c, amrex_multifab_parallel_copy_cg, & amrex_multifab_assign, amrex_multifab_install, amrex_multifab_dataptr_iter, & - amrex_multifab_dataptr_int, amrex_multifab_override_sync, amrex_multifab_override_sync_mask + amrex_multifab_dataptr_int, amrex_multifab_override_sync, amrex_multifab_override_sync_mask, & + amrex_multifab_sum_boundary, amrex_multifab_sum_boundary_c, amrex_multifab_average_sync #if !defined(__GFORTRAN__) || (__GNUC__ > 4) final :: amrex_multifab_destroy #endif @@ -244,6 +247,19 @@ subroutine amrex_fi_multifab_override_sync_mask (mf, geom, msk) bind(c) implicit none type(c_ptr), value :: mf, geom, msk end subroutine amrex_fi_multifab_override_sync_mask + + subroutine amrex_fi_multifab_sum_boundary (mf, geom, icomp, ncomp) bind(c) + import + implicit none + type(c_ptr), value :: mf, geom + integer, value :: icomp, ncomp + end subroutine amrex_fi_multifab_sum_boundary + + subroutine amrex_fi_multifab_average_sync (mf, geom) bind(c) + import + implicit none + type(c_ptr), value :: mf, geom + end subroutine amrex_fi_multifab_average_sync end interface interface @@ -563,7 +579,7 @@ subroutine amrex_multifab_fill_boundary_c (this, geom, c, nc, cross) lcross = 0 end if end if - call amrex_fi_multifab_fill_boundary (this%p, geom%p, c-1, nc, lcross) + call amrex_fi_multifab_fill_boundary(this%p, geom%p, c-1, nc, lcross) end subroutine amrex_multifab_fill_boundary_c subroutine amrex_multifab_write (mf, name) @@ -596,6 +612,25 @@ subroutine amrex_multifab_override_sync_mask (this, geom, msk) call amrex_fi_multifab_override_sync_mask(this%p, geom%p, msk%p) end subroutine amrex_multifab_override_sync_mask + subroutine amrex_multifab_sum_boundary (this, geom) + class(amrex_multifab) :: this + type(amrex_geometry), intent(in) :: geom + call this%amrex_multifab_sum_boundary_c(geom, 1, this%nc) + end subroutine amrex_multifab_sum_boundary + + subroutine amrex_multifab_sum_boundary_c (this, geom, c, nc) + class(amrex_multifab) :: this + type(amrex_geometry), intent(in) :: geom + integer, intent(in) :: c, nc + call amrex_fi_multifab_sum_boundary(this%p, geom%p, c-1, nc) + end subroutine amrex_multifab_sum_boundary_c + + subroutine amrex_multifab_average_sync (this, geom) + class(amrex_multifab) :: this + type(amrex_geometry), intent(in) :: geom + call amrex_fi_multifab_average_sync(this%p, geom%p) + end subroutine amrex_multifab_average_sync + !------ imultifab routines ------! subroutine amrex_imultifab_build (imf, ba, dm, nc, ng)