From 0b1bc2f5fc5c5765acf5d101657f6af4c1f6af70 Mon Sep 17 00:00:00 2001 From: Weiqun Zhang Date: Mon, 24 Jul 2017 17:31:27 -0700 Subject: [PATCH] Fortran: allow main in Fortran --- GNUmakefile.in | 2 ++ Src/Base/AMReX_ParallelDescriptor.cpp | 10 +++++++++- Src/F_Interfaces/Base/AMReX_base_mod.F90 | 11 ++--------- Src/F_Interfaces/Base/AMReX_fi_main.cpp | 6 ------ Src/F_Interfaces/Base/Make.package | 3 +++ Tutorials/Basic/main_F/GNUmakefile | 21 +++++++++++++++++++++ Tutorials/Basic/main_F/Make.package | 1 + Tutorials/Basic/main_F/main.F90 | 22 ++++++++++++++++++++++ 8 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 Tutorials/Basic/main_F/GNUmakefile create mode 100644 Tutorials/Basic/main_F/Make.package create mode 100644 Tutorials/Basic/main_F/main.F90 diff --git a/GNUmakefile.in b/GNUmakefile.in index e8c3a5ca9b2..62f09f68205 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -1,4 +1,6 @@ +USE_AMREX_FI_MAIN = FALSE + AMREX_HOME := $(shell pwd) include $(AMREX_HOME)/Tools/GNUMake/Make.defs diff --git a/Src/Base/AMReX_ParallelDescriptor.cpp b/Src/Base/AMReX_ParallelDescriptor.cpp index fefed2fe78d..2b4aa688f89 100644 --- a/Src/Base/AMReX_ParallelDescriptor.cpp +++ b/Src/Base/AMReX_ParallelDescriptor.cpp @@ -43,6 +43,11 @@ extern "C" { #include #endif +namespace +{ + static int call_mpi_finalize = 0; +} + namespace amrex { namespace ParallelDescriptor @@ -288,6 +293,7 @@ ParallelDescriptor::StartParallel (int* argc, if ( ! sflag) { BL_MPI_REQUIRE( MPI_Init(argc, argv) ); + call_mpi_finalize = 1; } BL_MPI_REQUIRE( MPI_Comm_dup(mpi_comm, &m_comm_all) ); @@ -343,7 +349,9 @@ ParallelDescriptor::EndParallel () } #endif - BL_MPI_REQUIRE( MPI_Finalize() ); + if (call_mpi_finalize) { + BL_MPI_REQUIRE( MPI_Finalize() ); + } } /* Given `rk_clrd', i.e. the rank in the colored `comm', return the diff --git a/Src/F_Interfaces/Base/AMReX_base_mod.F90 b/Src/F_Interfaces/Base/AMReX_base_mod.F90 index 22d407e1324..fc00bba90b0 100644 --- a/Src/F_Interfaces/Base/AMReX_base_mod.F90 +++ b/Src/F_Interfaces/Base/AMReX_base_mod.F90 @@ -3,6 +3,8 @@ module amrex_base_module use iso_c_binding + use amrex_init_module + use amrex_error_module use amrex_fort_module use amrex_box_module @@ -25,13 +27,4 @@ module amrex_base_module use mempool_module -contains - - subroutine amrex_fi_init () bind(c) - end subroutine amrex_fi_init - - - subroutine amrex_fi_finalize () bind(c) - end subroutine amrex_fi_finalize - end module amrex_base_module diff --git a/Src/F_Interfaces/Base/AMReX_fi_main.cpp b/Src/F_Interfaces/Base/AMReX_fi_main.cpp index 6479f7522ac..921bc232b3e 100644 --- a/Src/F_Interfaces/Base/AMReX_fi_main.cpp +++ b/Src/F_Interfaces/Base/AMReX_fi_main.cpp @@ -3,8 +3,6 @@ #include extern "C" { - void amrex_fi_init(); - void amrex_fi_finalize(); void amrex_fmain(); } @@ -12,15 +10,11 @@ int main (int argc, char* argv[]) { amrex::Initialize(argc,argv); - amrex_fi_init(); - BL_PROFILE_VAR("main()", pmain); amrex_fmain(); BL_PROFILE_VAR_STOP(pmain); - amrex_fi_finalize(); - amrex::Finalize(); } diff --git a/Src/F_Interfaces/Base/Make.package b/Src/F_Interfaces/Base/Make.package index 25dee8baac2..1f9498beff8 100644 --- a/Src/F_Interfaces/Base/Make.package +++ b/Src/F_Interfaces/Base/Make.package @@ -6,12 +6,15 @@ ifeq ($(USE_AMREX_FI_MAIN),TRUE) CEXE_sources += AMReX_fi_main.cpp endif +F90EXE_sources += AMReX_init_mod.F90 + F90EXE_sources += AMReX_parallel_mod.F90 F90EXE_sources += AMReX_base_mod.F90 AMReX_box_mod.F90 AMReX_boxarray_mod.F90 AMReX_distromap_mod.F90 F90EXE_sources += AMReX_geometry_mod.F90 AMReX_multifab_mod.F90 AMReX_plotfile_mod.F90 F90EXE_sources += AMReX_multifabutil_mod.F90 AMReX_physbc_mod.F90 AMReX_fab_mod.F90 +CEXE_sources += AMReX_init_fi.cpp CEXE_sources += AMReX_box_fi.cpp AMReX_boxarray_fi.cpp AMReX_distromap_fi.cpp AMReX_geometry_fi.cpp CEXE_sources += AMReX_multifab_fi.cpp AMReX_vismf_fi.cpp AMReX_plotfile_fi.cpp CEXE_sources += AMReX_multifabutil_fi.cpp AMReX_physbc_fi.cpp diff --git a/Tutorials/Basic/main_F/GNUmakefile b/Tutorials/Basic/main_F/GNUmakefile new file mode 100644 index 00000000000..7c7d1067f70 --- /dev/null +++ b/Tutorials/Basic/main_F/GNUmakefile @@ -0,0 +1,21 @@ +AMREX_HOME ?= ../../../ + +DEBUG = FALSE +DEBUG = TRUE + +DIM = 3 + +COMP = gnu + +USE_MPI = TRUE +USE_OMP = FALSE + +USE_AMREX_FI_MAIN = FALSE + +include $(AMREX_HOME)/Tools/GNUMake/Make.defs + +include ./Make.package +include $(AMREX_HOME)/Src/Base/Make.package +include $(AMREX_HOME)/Src/F_Interfaces/Base/Make.package + +include $(AMREX_HOME)/Tools/GNUMake/Make.rules diff --git a/Tutorials/Basic/main_F/Make.package b/Tutorials/Basic/main_F/Make.package new file mode 100644 index 00000000000..c13d655327b --- /dev/null +++ b/Tutorials/Basic/main_F/Make.package @@ -0,0 +1 @@ +F90EXE_sources += main.F90 diff --git a/Tutorials/Basic/main_F/main.F90 b/Tutorials/Basic/main_F/main.F90 new file mode 100644 index 00000000000..d991769ddfd --- /dev/null +++ b/Tutorials/Basic/main_F/main.F90 @@ -0,0 +1,22 @@ + +program main + + use mpi + use amrex_base_module + + implicit none + + integer :: ierr + + call mpi_init(ierr) + + call amrex_init() + + + + + call amrex_finalize() + + call mpi_finalize() + +end program main