diff --git a/CMakeLists.txt b/CMakeLists.txt index e2506dd04..dc0654760 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,12 @@ if((CMAKE_BUILD_TYPE STREQUAL "Debug") OR set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") endif() +if (CMAKE_HOST_APPLE) + # Fix linker flags for OSX to use classic linker on XCode 15.0+: + # https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Linking + set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS} -Wl,-ld_classic") +endif() + set(CAROM_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") set(CAROM_VERSION_MINOR "${PROJECT_VERSION_MINOR}") set(CAROM_VERSION_PATCHLEVEL "${PROJECT_VERSION_PATCH}") diff --git a/examples/dmd/de_dg_advection_greedy.cpp b/examples/dmd/de_dg_advection_greedy.cpp index d9e8045d9..ad7191b20 100644 --- a/examples/dmd/de_dg_advection_greedy.cpp +++ b/examples/dmd/de_dg_advection_greedy.cpp @@ -251,11 +251,8 @@ class FE_Evolution : public TimeDependentOperator virtual ~FE_Evolution(); }; -// 1. Initialize MPI. -MPI_Session mpi; -int num_procs = mpi.WorldSize(); -int myid = mpi.WorldRank(); //MFEM variables +int num_procs, myid; const char *mesh_file = "../data/periodic-hexagon.mesh"; int ser_ref_levels = 2; int par_ref_levels = 0; @@ -367,7 +364,7 @@ double simulation() ode_solver = new SDIRK34Solver; break; default: - if (mpi.Root()) + if (myid == 0) { cout << "Unknown ODE solver type: " << ode_solver_type << '\n'; } @@ -405,7 +402,7 @@ double simulation() ParFiniteElementSpace *fes = new ParFiniteElementSpace(pmesh, &fec); HYPRE_BigInt global_vSize = fes->GlobalTrueVSize(); - if (mpi.Root()) + if (myid == 0) { cout << "Number of unknowns: " << global_vSize << endl; } @@ -549,11 +546,11 @@ double simulation() sout.open(vishost, visport); if (!sout) { - if (mpi.Root()) + if (myid == 0) cout << "Unable to connect to GLVis server at " << vishost << ':' << visport << endl; visualization = false; - if (mpi.Root()) + if (myid == 0) { cout << "GLVis visualization disabled.\n"; } @@ -790,7 +787,7 @@ double simulation() if (done || ti % vis_steps == 0) { - if (mpi.Root()) + if (myid == 0) { cout << "time step: " << ti << ", time: " << t << endl; } @@ -1141,6 +1138,10 @@ class RelativeDifferenceCostFunction : public CAROM::IOptimizable int main(int argc, char *argv[]) { + // 1. Initialize MPI. + mfem::Mpi::Init(); + num_procs = Mpi::WorldSize(); + myid = Mpi::WorldRank(); cout.precision(precision); // 2. Parse command-line options. @@ -1251,19 +1252,19 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } Device device(device_config); - if (mpi.Root()) { + if (myid == 0) { device.Print(); } diff --git a/examples/dmd/dg_advection.cpp b/examples/dmd/dg_advection.cpp index 6bb905ac0..1abdfef3d 100644 --- a/examples/dmd/dg_advection.cpp +++ b/examples/dmd/dg_advection.cpp @@ -233,9 +233,9 @@ class FE_Evolution : public TimeDependentOperator int main(int argc, char *argv[]) { // 1. Initialize MPI. - MPI_Session mpi; - int num_procs = mpi.WorldSize(); - int myid = mpi.WorldRank(); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. problem = 0; @@ -322,19 +322,19 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } Device device(device_config); - if (mpi.Root()) { + if (myid == 0) { device.Print(); } @@ -385,7 +385,7 @@ int main(int argc, char *argv[]) ode_solver = new SDIRK34Solver; break; default: - if (mpi.Root()) + if (myid == 0) { cout << "Unknown ODE solver type: " << ode_solver_type << '\n'; } @@ -423,7 +423,7 @@ int main(int argc, char *argv[]) ParFiniteElementSpace *fes = new ParFiniteElementSpace(pmesh, &fec); HYPRE_BigInt global_vSize = fes->GlobalTrueVSize(); - if (mpi.Root()) + if (myid == 0) { cout << "Number of unknowns: " << global_vSize << endl; } @@ -563,11 +563,11 @@ int main(int argc, char *argv[]) sout.open(vishost, visport); if (!sout) { - if (mpi.Root()) + if (myid == 0) cout << "Unable to connect to GLVis server at " << vishost << ':' << visport << endl; visualization = false; - if (mpi.Root()) + if (myid == 0) { cout << "GLVis visualization disabled.\n"; } @@ -628,7 +628,7 @@ int main(int argc, char *argv[]) if (done || ti % vis_steps == 0) { - if (mpi.Root()) + if (myid == 0) { cout << "time step: " << ti << ", time: " << t << endl; } diff --git a/examples/dmd/dg_euler.cpp b/examples/dmd/dg_euler.cpp index 6a4f85510..f88d03813 100644 --- a/examples/dmd/dg_euler.cpp +++ b/examples/dmd/dg_euler.cpp @@ -131,7 +131,9 @@ double max_char_speed; int main(int argc, char *argv[]) { // 1. Initialize MPI. - MPI_Session mpi(argc, argv); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. problem = 1; @@ -197,12 +199,12 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) { + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) { + if (myid == 0) { args.PrintOptions(cout); } @@ -234,7 +236,7 @@ int main(int argc, char *argv[]) ode_solver = new RK6Solver; break; default: - if (mpi.Root()) + if (myid == 0) { cout << "Unknown ODE solver type: " << ode_solver_type << '\n'; } @@ -273,7 +275,7 @@ int main(int argc, char *argv[]) MFEM_ASSERT(fes.GetOrdering() == Ordering::byNODES, ""); HYPRE_BigInt glob_size = vfes.GlobalTrueVSize(); - if (mpi.Root()) { + if (myid == 0) { cout << "Number of unknowns: " << glob_size << endl; } @@ -299,7 +301,7 @@ int main(int argc, char *argv[]) // Output the initial solution. { ostringstream mesh_name; - mesh_name << "vortex-mesh." << setfill('0') << setw(6) << mpi.WorldRank(); + mesh_name << "vortex-mesh." << setfill('0') << setw(6) << myid; ofstream mesh_ofs(mesh_name.str().c_str()); mesh_ofs.precision(precision); mesh_ofs << pmesh; @@ -309,7 +311,7 @@ int main(int argc, char *argv[]) ParGridFunction uk(&fes, u_block.GetBlock(k)); ostringstream sol_name; sol_name << "vortex-" << k << "-init." - << setfill('0') << setw(6) << mpi.WorldRank(); + << setfill('0') << setw(6) << myid; ofstream sol_ofs(sol_name.str().c_str()); sol_ofs.precision(precision); sol_ofs << uk; @@ -342,19 +344,19 @@ int main(int argc, char *argv[]) sout.open(vishost, visport); if (!sout) { - if (mpi.Root()) + if (myid == 0) { cout << "Unable to connect to GLVis server at " << vishost << ':' << visport << endl; } visualization = false; - if (mpi.Root()) { + if (myid == 0) { cout << "GLVis visualization disabled.\n"; } } else { - sout << "parallel " << mpi.WorldSize() << " " << mpi.WorldRank() << "\n"; + sout << "parallel " << num_procs << " " << myid << "\n"; sout.precision(precision); sout << "solution\n" << pmesh << mom; sout << flush; @@ -486,14 +488,14 @@ int main(int argc, char *argv[]) if (done || ti % vis_steps == 0) { - if (mpi.Root()) + if (myid == 0) { cout << "time step: " << ti << ", time: " << t << endl; } if (visualization) { MPI_Barrier(pmesh.GetComm()); - sout << "parallel " << mpi.WorldSize() << " " << mpi.WorldRank() << "\n"; + sout << "parallel " << num_procs << " " << myid << "\n"; sout << "solution\n" << pmesh << mom << flush; } if (visit) @@ -506,7 +508,7 @@ int main(int argc, char *argv[]) } tic_toc.Stop(); - if (mpi.Root()) { + if (myid == 0) { cout << " done, " << tic_toc.RealTime() << "s." << endl; } @@ -517,7 +519,7 @@ int main(int argc, char *argv[]) ParGridFunction uk(&fes, u_block.GetBlock(k)); ostringstream sol_name; sol_name << "vortex-" << k << "-final." - << setfill('0') << setw(6) << mpi.WorldRank(); + << setfill('0') << setw(6) << myid; ofstream sol_ofs(sol_name.str().c_str()); sol_ofs.precision(precision); sol_ofs << uk; @@ -527,13 +529,13 @@ int main(int argc, char *argv[]) if (t_final == 2.0) { const double error = sol.ComputeLpError(2, u0); - if (mpi.Root()) { + if (myid == 0) { cout << "Solution error: " << error << endl; } } // 13. Calculate the DMD modes. - if (mpi.WorldRank() == 0 && rdim != -1 && ef != -1) + if (myid == 0 && rdim != -1 && ef != -1) { std::cout << "Both rdim and ef are set. ef will be ignored." << std::endl; } @@ -542,7 +544,7 @@ int main(int argc, char *argv[]) if (rdim != -1) { - if (mpi.WorldRank() == 0) + if (myid == 0) { std::cout << "Creating DMD with rdim: " << rdim << std::endl; } @@ -553,7 +555,7 @@ int main(int argc, char *argv[]) } else if (ef != -1) { - if (mpi.WorldRank() == 0) + if (myid == 0) { std::cout << "Creating DMD with energy fraction: " << ef << std::endl; } @@ -575,7 +577,7 @@ int main(int argc, char *argv[]) true_solution_e = u_block.GetBlock(3).GetData(); // 14. Predict using DMD. - if (mpi.WorldRank() == 0) + if (myid == 0) { std::cout << "Predicting density, momentum, and energy using DMD" << std::endl; } @@ -680,7 +682,7 @@ int main(int argc, char *argv[]) double tot_true_solution_e_norm = sqrt(InnerProduct(MPI_COMM_WORLD, true_solution_e, true_solution_e)); - if (mpi.WorldRank() == 0) + if (myid == 0) { std::cout << "Relative error of DMD density (dens) at t_final: " << t_final << " is " << tot_diff_norm_dens / tot_true_solution_dens_norm << std::endl; diff --git a/examples/dmd/local_dw_csv.cpp b/examples/dmd/local_dw_csv.cpp index 4dd83031a..9a79c6c16 100644 --- a/examples/dmd/local_dw_csv.cpp +++ b/examples/dmd/local_dw_csv.cpp @@ -59,9 +59,9 @@ int main(int argc, char *argv[]) cout.precision(precision); // 1. Initialize MPI. - MPI_Session mpi; - int num_procs = mpi.WorldSize(); - int myid = mpi.WorldRank(); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. bool train = true; @@ -141,13 +141,13 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } @@ -166,7 +166,7 @@ int main(int argc, char *argv[]) outputPath += "/" + string(basename); } - if (mpi.Root()) { + if (myid == 0) { const char path_delim = '/'; string::size_type pos = 0; do { diff --git a/examples/dmd/local_tw_csv.cpp b/examples/dmd/local_tw_csv.cpp index 976017f7d..d6356f260 100644 --- a/examples/dmd/local_tw_csv.cpp +++ b/examples/dmd/local_tw_csv.cpp @@ -76,9 +76,9 @@ int main(int argc, char *argv[]) cout.precision(precision); // 1. Initialize MPI. - MPI_Session mpi; - int num_procs = mpi.WorldSize(); - int myid = mpi.WorldRank(); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. bool train = true; @@ -165,13 +165,13 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } @@ -188,7 +188,7 @@ int main(int argc, char *argv[]) outputPath += "/" + string(basename); } - if (mpi.Root()) { + if (myid == 0) { const char path_delim = '/'; string::size_type pos = 0; do { diff --git a/examples/dmd/parametric_dw_csv.cpp b/examples/dmd/parametric_dw_csv.cpp index 7222ea85f..7ca9ce830 100644 --- a/examples/dmd/parametric_dw_csv.cpp +++ b/examples/dmd/parametric_dw_csv.cpp @@ -67,9 +67,9 @@ int main(int argc, char *argv[]) cout.precision(precision); // 1. Initialize MPI. - MPI_Session mpi; - int num_procs = mpi.WorldSize(); - int myid = mpi.WorldRank(); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. bool offline = false; @@ -155,13 +155,13 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } @@ -180,7 +180,7 @@ int main(int argc, char *argv[]) outputPath += "/" + string(basename); } - if (mpi.Root()) { + if (myid == 0) { const char path_delim = '/'; string::size_type pos = 0; do { diff --git a/examples/dmd/parametric_tw_csv.cpp b/examples/dmd/parametric_tw_csv.cpp index 9e6399a60..1b132f8d9 100644 --- a/examples/dmd/parametric_tw_csv.cpp +++ b/examples/dmd/parametric_tw_csv.cpp @@ -95,9 +95,9 @@ int main(int argc, char *argv[]) cout.precision(precision); // 1. Initialize MPI. - MPI_Session mpi; - int num_procs = mpi.WorldSize(); - int myid = mpi.WorldRank(); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. bool offline = false; @@ -213,13 +213,13 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } @@ -238,7 +238,7 @@ int main(int argc, char *argv[]) outputPath += "/" + string(basename); } - if (mpi.Root()) { + if (myid == 0) { const char path_delim = '/'; string::size_type pos = 0; do { diff --git a/examples/prom/dg_advection_global_rom.cpp b/examples/prom/dg_advection_global_rom.cpp index 18dc48ea0..ab06e3548 100644 --- a/examples/prom/dg_advection_global_rom.cpp +++ b/examples/prom/dg_advection_global_rom.cpp @@ -272,9 +272,9 @@ class FE_Evolution : public TimeDependentOperator int main(int argc, char *argv[]) { // 1. Initialize MPI. - MPI_Session mpi; - int num_procs = mpi.WorldSize(); - int myid = mpi.WorldRank(); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. problem = 3; @@ -380,13 +380,13 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } @@ -404,7 +404,7 @@ int main(int argc, char *argv[]) } Device device(device_config); - if (mpi.Root()) { + if (myid == 0) { device.Print(); } @@ -455,7 +455,7 @@ int main(int argc, char *argv[]) ode_solver = new SDIRK34Solver; break; default: - if (mpi.Root()) + if (myid == 0) { cout << "Unknown ODE solver type: " << ode_solver_type << '\n'; } @@ -492,7 +492,7 @@ int main(int argc, char *argv[]) ParFiniteElementSpace *fes = new ParFiniteElementSpace(pmesh, &fec); HYPRE_BigInt global_vSize = fes->GlobalTrueVSize(); - if (mpi.Root()) + if (myid == 0) { cout << "Number of unknowns: " << global_vSize << endl; } @@ -639,11 +639,11 @@ int main(int argc, char *argv[]) sout.open(vishost, visport); if (!sout) { - if (mpi.Root()) + if (myid == 0) cout << "Unable to connect to GLVis server at " << vishost << ':' << visport << endl; visualization = false; - if (mpi.Root()) + if (myid == 0) { cout << "GLVis visualization disabled.\n"; } @@ -655,7 +655,7 @@ int main(int argc, char *argv[]) sout << "solution\n" << *pmesh << *u; sout << "pause\n"; sout << flush; - if (mpi.Root()) + if (myid == 0) cout << "GLVis visualization paused." << " Press space (in the GLVis window) to resume it.\n"; } @@ -828,7 +828,7 @@ int main(int argc, char *argv[]) if (done || ti % vis_steps == 0) { - if (mpi.Root()) + if (myid == 0) { cout << "time step: " << ti << ", time: " << t << endl; } @@ -847,7 +847,7 @@ int main(int argc, char *argv[]) { if (online) { - if (mpi.Root()) + if (myid == 0) cout << "WARNING: FOM lifting for visualization is slow." << endl; CAROM::Vector u_hat_final_carom(u_hat->GetData(), u_hat->Size(), false); diff --git a/examples/prom/dg_advection_local_rom_matrix_interp.cpp b/examples/prom/dg_advection_local_rom_matrix_interp.cpp index 93f8236e7..abbe6621c 100644 --- a/examples/prom/dg_advection_local_rom_matrix_interp.cpp +++ b/examples/prom/dg_advection_local_rom_matrix_interp.cpp @@ -283,9 +283,9 @@ class FE_Evolution : public TimeDependentOperator int main(int argc, char *argv[]) { // 1. Initialize MPI. - MPI_Session mpi; - int num_procs = mpi.WorldSize(); - int myid = mpi.WorldRank(); + Mpi::Init(); + const int num_procs = Mpi::WorldSize(); + const int myid = Mpi::WorldRank(); // 2. Parse command-line options. problem = 3; @@ -401,19 +401,19 @@ int main(int argc, char *argv[]) args.Parse(); if (!args.Good()) { - if (mpi.Root()) + if (myid == 0) { args.PrintUsage(cout); } return 1; } - if (mpi.Root()) + if (myid == 0) { args.PrintOptions(cout); } Device device(device_config); - if (mpi.Root()) { + if (myid == 0) { device.Print(); } @@ -476,7 +476,7 @@ int main(int argc, char *argv[]) ode_solver = new SDIRK34Solver; break; default: - if (mpi.Root()) + if (myid == 0) { cout << "Unknown ODE solver type: " << ode_solver_type << '\n'; } @@ -516,7 +516,7 @@ int main(int argc, char *argv[]) ParFiniteElementSpace *fes = new ParFiniteElementSpace(pmesh, &fec); HYPRE_BigInt global_vSize = fes->GlobalTrueVSize(); - if (mpi.Root()) + if (myid == 0) { cout << "Number of unknowns: " << global_vSize << endl; } @@ -663,11 +663,11 @@ int main(int argc, char *argv[]) sout.open(vishost, visport); if (!sout) { - if (mpi.Root()) + if (myid == 0) cout << "Unable to connect to GLVis server at " << vishost << ':' << visport << endl; visualization = false; - if (mpi.Root()) + if (myid == 0) { cout << "GLVis visualization disabled.\n"; } @@ -679,7 +679,7 @@ int main(int argc, char *argv[]) sout << "solution\n" << *pmesh << *u; sout << "pause\n"; sout << flush; - if (mpi.Root()) + if (myid == 0) cout << "GLVis visualization paused." << " Press space (in the GLVis window) to resume it.\n"; } @@ -937,7 +937,7 @@ int main(int argc, char *argv[]) if (done || ti % vis_steps == 0) { - if (mpi.Root()) + if (myid == 0) { cout << "time step: " << ti << ", time: " << t << endl; } diff --git a/scripts/setup.sh b/scripts/setup.sh index fd0d86596..d263ab266 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -153,7 +153,6 @@ ROM_CFLAGS="${CFLAGS}" ROM_CXXFLAGS="${CXXFLAGS}" unset CFLAGS unset CXXFLAGS -unset CPPFLAGS # Install MFEM cd $LIB_DIR @@ -165,7 +164,7 @@ if [[ $BUILD_TYPE == "Debug" ]]; then if [[ $UPDATE_LIBS == "true" ]]; then cd mfem_debug git pull - make -j 8 pdebug BASE_FLAGS="${ROM_CFLAGS}" STATIC=NO SHARED=YES MFEM_USE_MPI=YES MFEM_USE_GSLIB=${MG} MFEM_USE_LAPACK=${MFEM_USE_LAPACK:-"NO"} MFEM_USE_METIS=YES MFEM_USE_METIS_5=YES METIS_DIR="$METIS_DIR" METIS_OPT="$METIS_OPT" METIS_LIB="$METIS_LIB" MFEM_USE_SUPERLU=${MFEM_USE_SUPERLU:-"NO"} SUPERLU_DIR="$SUPERLU_DIR" SUPERLU_OPT="$SUPERLU_OPT" SUPERLU_LIB="$SUPERLU_LIB" + make -j 8 pdebug CPPFLAGS="${ROM_CXXFLAGS}" STATIC=NO SHARED=YES MFEM_USE_MPI=YES MFEM_USE_GSLIB=${MG} MFEM_USE_LAPACK=${MFEM_USE_LAPACK:-"NO"} MFEM_USE_METIS=YES MFEM_USE_METIS_5=YES METIS_DIR="$METIS_DIR" METIS_OPT="$METIS_OPT" METIS_LIB="$METIS_LIB" MFEM_USE_SUPERLU=${MFEM_USE_SUPERLU:-"NO"} SUPERLU_DIR="$SUPERLU_DIR" SUPERLU_OPT="$SUPERLU_OPT" SUPERLU_LIB="$SUPERLU_LIB" check_result $? mfem-debug-installation fi cd $LIB_DIR @@ -182,7 +181,7 @@ else # NOTE(kevin): v4.5.2-dev commit. This is the mfem version used by PyMFEM v4.5.2.0. # This version matching is required to support pylibROM-PyMFEM interface. git checkout 00b2a0705f647e17a1d4ffcb289adca503f28d42 - make -j 8 parallel BASE_FLAGS="${ROM_CFLAGS}" STATIC=NO SHARED=YES MFEM_USE_MPI=YES MFEM_USE_GSLIB=${MG} MFEM_USE_LAPACK=${MFEM_USE_LAPACK:-"NO"} MFEM_USE_METIS=YES MFEM_USE_METIS_5=YES METIS_DIR="$METIS_DIR" METIS_OPT="$METIS_OPT" METIS_LIB="$METIS_LIB" MFEM_USE_SUPERLU=${MFEM_USE_SUPERLU:-"NO"} SUPERLU_DIR="$SUPERLU_DIR" SUPERLU_OPT="$SUPERLU_OPT" SUPERLU_LIB="$SUPERLU_LIB" + make -j 8 parallel CPPFLAGS="${ROM_CXXFLAGS}" STATIC=NO SHARED=YES MFEM_USE_MPI=YES MFEM_USE_GSLIB=${MG} MFEM_USE_LAPACK=${MFEM_USE_LAPACK:-"NO"} MFEM_USE_METIS=YES MFEM_USE_METIS_5=YES METIS_DIR="$METIS_DIR" METIS_OPT="$METIS_OPT" METIS_LIB="$METIS_LIB" MFEM_USE_SUPERLU=${MFEM_USE_SUPERLU:-"NO"} SUPERLU_DIR="$SUPERLU_DIR" SUPERLU_OPT="$SUPERLU_OPT" SUPERLU_LIB="$SUPERLU_LIB" check_result $? mfem-parallel-installation fi cd $LIB_DIR