Skip to content

Commit e122280

Browse files
authored
Add more build options for linear solvers (#4181)
Add two new CMake build options, AMReX_LINEAR_SOLVERS_INCFLO and AMReX_LINEAR_SOLVERS_EM. Both options depend on AMReX_LINEAR_SOLVERS, and are enabled by default when AMReX_LINEAR_SOLVERS is enabled. By default, the cell-centered MLABecLaplacian and MLPoisson solvers are always included. However, these new build options provide finer control over which solvers to build. * AMReX_LINEAR_SOLVERS_INCFLO can be used to control the inclusion of solvers commonly used by incompressible flow codes, such as nodal projection and Navier-Stokes tensor solvers. * AMReX_LINEAR_SOLVERS_EM can be used to control the inclusion of solvers commonly used by electromagnetic applications, such as the curl curl and tensor Laplacian solvers used by WarpX. These options are also available in GNU Make as USE_LINEAR_SOLVERS_INCFLO and USE_LINEAR_SOLVER_EM.
1 parent 6239d25 commit e122280

26 files changed

+1565
-1451
lines changed

.github/workflows/apps.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ jobs:
5252
export AMREX_HOME=${PWD}
5353
export MICROPHYSICS_HOME=${PWD}/Microphysics
5454
cd Castro/Exec/hydro_tests/Sedov/
55-
make -j4 CCACHE=ccache USE_MPI=FALSE
55+
make -j4 CCACHE=ccache USE_MPI=FALSE \
56+
USE_LINEAR_SOLVERS_INCFLO=FALSE \
57+
USE_LINEAR_SOLVERS_EM=FALSE
5658
5759
ccache -s
5860
du -hs ~/.cache/ccache
@@ -92,7 +94,8 @@ jobs:
9294
-DWarpX_QED=OFF \
9395
-DWarpX_OPENPMD=OFF \
9496
-DCMAKE_VERBOSE_MAKEFILE=ON \
95-
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
97+
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
98+
-DAMReX_LINEAR_SOLVER_INCFLO=OFF
9699
cmake --build WarpX/build -j 4
97100
98101
ccache -s

Docs/sphinx_documentation/source/BuildingAMReX.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,12 @@ The list of available options is reported in the :ref:`table <tab:cmakevar>` bel
463463
+------------------------------+-------------------------------------------------+-------------------------+-----------------------+
464464
| AMReX_LINEAR_SOLVERS | Build AMReX linear solvers | YES | YES, NO |
465465
+------------------------------+-------------------------------------------------+-------------------------+-----------------------+
466+
| AMReX_LINEAR_SOLVERS_INCFLO | Build AMReX linear solvers for incompressible | YES | YES, NO |
467+
| | flow | |
468+
+------------------------------+-------------------------------------------------+-------------------------+-----------------------+
469+
| AMReX_LINEAR_SOLVERS_EM | Build AMReX linear solvers for electromagnetic | YES | YES, NO |
470+
| | solvers | |
471+
+------------------------------+-------------------------------------------------+-------------------------+-----------------------+
466472
| AMReX_AMRDATA | Build data services | NO | YES, NO |
467473
+------------------------------+-------------------------------------------------+-------------------------+-----------------------+
468474
| AMReX_AMRLEVEL | Build AmrLevel class | YES | YES, NO |
@@ -681,6 +687,10 @@ A list of AMReX component names and related configure options are shown in the t
681687
+------------------------------+-----------------+
682688
| AMReX_LINEAR_SOLVERS | LSOLVERS |
683689
+------------------------------+-----------------+
690+
| AMReX_LINEAR_SOLVERS_INCFLO | LSOLVERS_INCFLO |
691+
+------------------------------+-----------------+
692+
| AMReX_LINEAR_SOLVERS_EM | LSOLVERS_EM |
693+
+------------------------------+-----------------+
684694
| AMReX_AMRDATA | AMRDATA |
685695
+------------------------------+-----------------+
686696
| AMReX_AMRLEVEL | AMRLEVEL |

Src/Extern/HYPRE/AMReX_Habec_2D_K.H

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <AMReX_EBMultiFabUtil.H>
77
#include <AMReX_MultiCutFab.H>
88
#include <AMReX_EBFabFactory.H>
9-
#include <AMReX_MLEBABecLap_K.H>
9+
#include <AMReX_MLLinOp_K.H>
1010
#endif
1111

1212
namespace amrex {

Src/Extern/HYPRE/AMReX_Habec_3D_K.H

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include <AMReX_EBMultiFabUtil.H>
77
#include <AMReX_MultiCutFab.H>
88
#include <AMReX_EBFabFactory.H>
9-
#include <AMReX_MLEBABecLap_K.H>
9+
#include <AMReX_MLLinOp_K.H>
1010
#endif
1111

1212
namespace amrex {

Src/LinearSolvers/CMakeLists.txt

Lines changed: 56 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ foreach(D IN LISTS AMReX_SPACEDIM)
1616
MLMG/AMReX_MLLinOp_K.H
1717
MLMG/AMReX_MLCellLinOp.H
1818
MLMG/AMReX_MLNodeLinOp.H
19+
MLMG/AMReX_MLNodeLinOp_K.H
20+
MLMG/AMReX_MLNodeLinOp_${D}D_K.H
1921
MLMG/AMReX_MLNodeLinOp.cpp
2022
MLMG/AMReX_MLCellABecLap.H
2123
MLMG/AMReX_MLCellABecLap_K.H
@@ -31,30 +33,6 @@ foreach(D IN LISTS AMReX_SPACEDIM)
3133
MLMG/AMReX_MLPoisson.H
3234
MLMG/AMReX_MLPoisson_K.H
3335
MLMG/AMReX_MLPoisson_${D}D_K.H
34-
MLMG/AMReX_MLNodeLaplacian.H
35-
MLMG/AMReX_MLNodeLaplacian.cpp
36-
MLMG/AMReX_MLNodeLaplacian_sync.cpp
37-
MLMG/AMReX_MLNodeLaplacian_sten.cpp
38-
MLMG/AMReX_MLNodeLaplacian_misc.cpp
39-
MLMG/AMReX_MLNodeLap_K.H
40-
MLMG/AMReX_MLNodeLap_${D}D_K.H
41-
MLMG/AMReX_MLNodeTensorLaplacian.H
42-
MLMG/AMReX_MLNodeTensorLaplacian.cpp
43-
MLMG/AMReX_MLNodeTensorLap_K.H
44-
MLMG/AMReX_MLNodeTensorLap_${D}D_K.H
45-
MLMG/AMReX_MLTensorOp.H
46-
MLMG/AMReX_MLTensorOp.cpp
47-
MLMG/AMReX_MLTensorOp_grad.cpp
48-
MLMG/AMReX_MLTensor_K.H
49-
MLMG/AMReX_MLTensor_${D}D_K.H
50-
MLMG/AMReX_MLEBNodeFDLaplacian.H
51-
MLMG/AMReX_MLEBNodeFDLaplacian.cpp
52-
MLMG/AMReX_MLEBNodeFDLap_K.H
53-
MLMG/AMReX_MLEBNodeFDLap_${D}D_K.H
54-
MLMG/AMReX_MLNodeABecLaplacian.H
55-
MLMG/AMReX_MLNodeABecLaplacian.cpp
56-
MLMG/AMReX_MLNodeABecLap_K.H
57-
MLMG/AMReX_MLNodeABecLap_${D}D_K.H
5836
AMReX_GMRES.H
5937
AMReX_GMRES_MLMG.H
6038
)
@@ -68,30 +46,72 @@ foreach(D IN LISTS AMReX_SPACEDIM)
6846
)
6947
endif ()
7048

71-
if (NOT D EQUAL 1)
49+
if (AMReX_LINEAR_SOLVERS_EM)
50+
if (NOT D EQUAL 1 AND AMReX_LINEAR_SOLVERS_EM)
51+
target_sources(amrex_${D}d
52+
PRIVATE
53+
MLMG/AMReX_MLCurlCurl.H
54+
MLMG/AMReX_MLCurlCurl.cpp
55+
MLMG/AMReX_MLCurlCurl_K.H
56+
)
57+
endif ()
58+
7259
target_sources(amrex_${D}d
7360
PRIVATE
74-
MLMG/AMReX_MLCurlCurl.H
75-
MLMG/AMReX_MLCurlCurl.cpp
76-
MLMG/AMReX_MLCurlCurl_K.H
77-
)
61+
MLMG/AMReX_MLEBNodeFDLaplacian.H
62+
MLMG/AMReX_MLEBNodeFDLaplacian.cpp
63+
MLMG/AMReX_MLEBNodeFDLap_K.H
64+
MLMG/AMReX_MLEBNodeFDLap_${D}D_K.H
65+
MLMG/AMReX_MLNodeTensorLaplacian.H
66+
MLMG/AMReX_MLNodeTensorLaplacian.cpp
67+
MLMG/AMReX_MLNodeTensorLap_K.H
68+
MLMG/AMReX_MLNodeTensorLap_${D}D_K.H
69+
)
70+
endif ()
71+
72+
if (AMReX_LINEAR_SOLVERS_INCFLO)
73+
target_sources(amrex_${D}d
74+
PRIVATE
75+
MLMG/AMReX_MLNodeABecLaplacian.H
76+
MLMG/AMReX_MLNodeABecLaplacian.cpp
77+
MLMG/AMReX_MLNodeABecLap_K.H
78+
MLMG/AMReX_MLNodeABecLap_${D}D_K.H
79+
MLMG/AMReX_MLNodeLaplacian.H
80+
MLMG/AMReX_MLNodeLaplacian.cpp
81+
MLMG/AMReX_MLNodeLaplacian_sync.cpp
82+
MLMG/AMReX_MLNodeLaplacian_sten.cpp
83+
MLMG/AMReX_MLNodeLaplacian_misc.cpp
84+
MLMG/AMReX_MLNodeLap_K.H
85+
MLMG/AMReX_MLNodeLap_${D}D_K.H
86+
MLMG/AMReX_MLTensorOp.H
87+
MLMG/AMReX_MLTensorOp.cpp
88+
MLMG/AMReX_MLTensorOp_grad.cpp
89+
MLMG/AMReX_MLTensor_K.H
90+
MLMG/AMReX_MLTensor_${D}D_K.H
91+
)
7892
endif ()
7993

8094
if (AMReX_EB AND NOT D EQUAL 1)
8195
target_sources(amrex_${D}d
8296
PRIVATE
83-
MLMG/AMReX_MLNodeLaplacian_eb.cpp
8497
MLMG/AMReX_MLEBABecLap.H
8598
MLMG/AMReX_MLEBABecLap.cpp
8699
MLMG/AMReX_MLEBABecLap_F.cpp
87100
MLMG/AMReX_MLEBABecLap_K.H
88101
MLMG/AMReX_MLEBABecLap_${D}D_K.H
89-
MLMG/AMReX_MLEBTensorOp.H
90-
MLMG/AMReX_MLEBTensorOp.cpp
91-
MLMG/AMReX_MLEBTensorOp_bc.cpp
92-
MLMG/AMReX_MLEBTensor_K.H
93-
MLMG/AMReX_MLEBTensor_${D}D_K.H
94102
)
103+
104+
if (AMReX_LINEAR_SOLVERS_INCFLO)
105+
target_sources(amrex_${D}d
106+
PRIVATE
107+
MLMG/AMReX_MLNodeLaplacian_eb.cpp
108+
MLMG/AMReX_MLEBTensorOp.H
109+
MLMG/AMReX_MLEBTensorOp.cpp
110+
MLMG/AMReX_MLEBTensorOp_bc.cpp
111+
MLMG/AMReX_MLEBTensor_K.H
112+
MLMG/AMReX_MLEBTensor_${D}D_K.H
113+
)
114+
endif ()
95115
endif ()
96116

97117
if (AMReX_FORTRAN)
@@ -102,7 +122,7 @@ foreach(D IN LISTS AMReX_SPACEDIM)
102122
)
103123
endif ()
104124

105-
if (AMReX_HYPRE)
125+
if (AMReX_HYPRE AND AMReX_LINEAR_SOLVERS_INCFLO)
106126
target_sources(amrex_${D}d
107127
PRIVATE
108128
MLMG/AMReX_MLNodeLaplacian_hypre.cpp

Src/LinearSolvers/MLMG/AMReX_MLEBABecLap_K.H

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,6 @@
66

77
#include <AMReX_EBCellFlag.H>
88

9-
namespace amrex {
10-
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
11-
Real get_dx_eb (Real kappa) noexcept {
12-
return amrex::max(Real(0.3),(kappa*kappa-Real(0.25))/(Real(2.0)*kappa));
13-
}
14-
}
15-
169
#if (AMREX_SPACEDIM == 2)
1710
#include <AMReX_MLEBABecLap_2D_K.H>
1811
#else

Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <AMReX_MLEBNodeFDLaplacian.H>
22
#include <AMReX_MLEBNodeFDLap_K.H>
3-
#include <AMReX_MLNodeLap_K.H>
3+
#include <AMReX_MLNodeLinOp_K.H>
44
#include <AMReX_MLNodeTensorLap_K.H>
55
#include <AMReX_MultiFabUtil.H>
66

Src/LinearSolvers/MLMG/AMReX_MLLinOp_K.H

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,15 @@ void mllinop_apply_innu_zhi (int i, int j, int k,
10531053
}
10541054
}
10551055

1056+
#ifdef AMREX_USE_EB
1057+
1058+
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
1059+
Real get_dx_eb (Real kappa) noexcept {
1060+
return amrex::max(Real(0.3),(kappa*kappa-Real(0.25))/(Real(2.0)*kappa));
1061+
}
1062+
1063+
#endif
1064+
10561065
}
10571066

10581067
#endif

0 commit comments

Comments
 (0)