Compare commits

...
Author SHA1 Message Date
Tzanio Kolev 4415bda440 StartGLVisServer in MFEM 2026-03-18 19:51:32 -07:00
Jan Nikl 4667cf9d39 Silenced tee. 2026-03-16 13:30:20 -07:00
Jan Nikl 1e6c8ecf56 Removed compilation checks. 2026-03-16 12:54:15 -07:00
Jan Nikl 95c844f519 Replaced tee -p by trap. 2026-03-16 12:30:43 -07:00
Jan Nikl b5b0f2382f Removed unnecessary move of the server. 2026-03-16 12:03:04 -07:00
Jan Nikl bbdc39d605 Added error when run on a non-POSIX platform. 2026-03-16 12:01:22 -07:00
Jan Nikl 7fed49c38b Added visualization server to ex1p. 2026-03-16 10:59:15 -07:00
14 changed files with 419 additions and 64 deletions
+43 -12
View File
@@ -180,6 +180,7 @@ int main(int argc, char *argv[])
real_t K = 5.0;
bool adaptive_lin_rtol = true;
bool visualization = true;
const char *glvis = "";
int vis_steps = 1;
OptionsParser args(argc, argv);
@@ -209,6 +210,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&vis_steps, "-vs", "--visualization-steps",
"Visualize every n-th timestep.");
args.Parse();
@@ -220,6 +223,7 @@ int main(int argc, char *argv[])
}
return 1;
}
if (*glvis) { visualization = true; }
if (myid == 0)
{
args.PrintOptions(cout);
@@ -310,20 +314,47 @@ int main(int argc, char *argv[])
{
char vishost[] = "localhost";
int visport = 19916;
vis_v.open(vishost, visport);
vis_v.precision(8);
visualize(vis_v, pmesh, &x_gf, &v_gf, "Velocity", true);
// Make sure all ranks have sent their 'v' solution before initiating
// another set of GLVis connections (one from each rank):
MPI_Barrier(pmesh->GetComm());
vis_w.open(vishost, visport);
if (vis_w)
if (*glvis)
{
oper.GetElasticEnergyDensity(x_gf, w_gf);
vis_w.precision(8);
visualize(vis_w, pmesh, &x_gf, &w_gf, "Elastic energy density", true);
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
if (myid == 0)
if (visualization)
{
vis_v.open(vishost, visport);
}
if (visualization && !vis_v)
{
if (myid == 0)
{
cout << "Unable to connect to GLVis server at "
<< vishost << ':' << visport << endl;
cout << "GLVis visualization disabled.\n";
}
visualization = false;
}
if (visualization)
{
vis_v.precision(8);
visualize(vis_v, pmesh, &x_gf, &v_gf, "Velocity", true);
// Make sure all ranks have sent their 'v' solution before initiating
// another set of GLVis connections (one from each rank):
MPI_Barrier(pmesh->GetComm());
vis_w.open(vishost, visport);
if (vis_w)
{
oper.GetElasticEnergyDensity(x_gf, w_gf);
vis_w.precision(8);
visualize(vis_w, pmesh, &x_gf, &w_gf, "Elastic energy density",
true);
}
}
if (visualization && myid == 0)
{
cout << "GLVis visualization paused."
<< " Press space (in the GLVis window) to resume it.\n";
+16 -3
View File
@@ -103,6 +103,7 @@ int main(int argc, char *argv[])
real_t kappa = 0.5;
bool visualization = true;
const char *glvis = "";
bool visit = false;
int vis_steps = 5;
bool solve_implicit_state = false;
@@ -133,6 +134,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&visit, "-visit", "--visit-datafiles", "-no-visit",
"--no-visit-datafiles",
"Save data files for VisIt (visit.llnl.gov) visualization.");
@@ -144,6 +147,7 @@ int main(int argc, char *argv[])
args.PrintUsage(cout);
return 1;
}
if (*glvis) { visualization = true; }
args.PrintOptions(cout);
// 2. Read the mesh from the given mesh file. We can handle triangular,
@@ -213,15 +217,24 @@ int main(int argc, char *argv[])
{
char vishost[] = "localhost";
int visport = 19916;
sout.open(vishost, visport);
if (!sout)
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
if (visualization)
{
sout.open(vishost, visport);
}
if (visualization && !sout)
{
cout << "Unable to connect to GLVis server at "
<< vishost << ':' << visport << endl;
visualization = false;
cout << "GLVis visualization disabled.\n";
}
else
else if (visualization)
{
sout.precision(precision);
sout << "solution\n" << *mesh << u_gf;
+12
View File
@@ -82,6 +82,7 @@ int main(int argc, char *argv[])
bool fa = false;
const char *device_config = "cpu";
bool visualization = true;
const char *visserver = "";
bool algebraic_ceed = false;
OptionsParser args(argc, argv);
@@ -106,6 +107,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&visserver, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.Parse();
if (!args.Good())
{
@@ -115,6 +118,7 @@ int main(int argc, char *argv[])
}
return 1;
}
if (*visserver) { visualization = true; }
if (myid == 0)
{
args.PrintOptions(cout);
@@ -301,6 +305,14 @@ int main(int argc, char *argv[])
{
char vishost[] = "localhost";
int visport = 19916;
if (*visserver)
{
int port = StartGLVisServer(visserver, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
socketstream sol_sock(vishost, visport);
sol_sock << "parallel " << num_procs << " " << myid << "\n";
sol_sock.precision(8);
+13 -8
View File
@@ -83,6 +83,7 @@ int main(int argc, char *argv[])
bool herm_conv = true;
bool slu_solver = false;
bool visualization = 1;
const char *glvis = "";
bool mixed = true;
bool pa = false;
const char *device_config = "cpu";
@@ -126,6 +127,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&mixed, "-mixed", "--mixed-mesh", "-hex",
"--hex-mesh", "Mixed mesh of hexahedral mesh.");
args.AddOption(&pa, "-pa", "--partial-assembly", "-no-pa",
@@ -141,6 +144,7 @@ int main(int argc, char *argv[])
}
return 1;
}
if (*glvis) { visualization = true; }
if (!mixed || pa)
{
@@ -171,6 +175,15 @@ int main(int argc, char *argv[])
args.PrintOptions(cout);
}
char vishost[] = "localhost";
int visport = 19916;
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
MFEM_VERIFY(prob >= 0 && prob <=2,
"Unrecognized problem type: " << prob);
@@ -293,8 +306,6 @@ int main(int argc, char *argv[])
// 8c. Send the port bc, computed on the SubMesh, to a GLVis server.
if (visualization && dim == 3)
{
char vishost[] = "localhost";
int visport = 19916;
socketstream port_sock(vishost, visport);
port_sock << "parallel " << num_procs << " " << myid << "\n";
port_sock.precision(8);
@@ -336,8 +347,6 @@ int main(int argc, char *argv[])
if (visualization)
{
char vishost[] = "localhost";
int visport = 19916;
socketstream full_sock(vishost, visport);
full_sock << "parallel " << num_procs << " " << myid << "\n";
full_sock.precision(8);
@@ -549,8 +558,6 @@ int main(int argc, char *argv[])
// 17. Send the solution by socket to a GLVis server.
if (visualization)
{
char vishost[] = "localhost";
int visport = 19916;
socketstream sol_sock_r(vishost, visport);
sol_sock_r << "parallel " << num_procs << " " << myid << "\n";
sol_sock_r.precision(8);
@@ -571,8 +578,6 @@ int main(int argc, char *argv[])
{
ParGridFunction u_t(&fespace);
u_t = u.real();
char vishost[] = "localhost";
int visport = 19916;
socketstream sol_sock(vishost, visport);
sol_sock << "parallel " << num_procs << " " << myid << "\n";
sol_sock.precision(8);
+26 -13
View File
@@ -70,6 +70,7 @@ int main(int argc, char *argv[])
bool pa = false;
const char *device_config = "cpu";
bool visualization = 1;
const char *glvis = "";
bool adios2 = false;
OptionsParser args(argc, argv);
@@ -89,6 +90,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&adios2, "-adios2", "--adios2-streams", "-no-adios2",
"--no-adios2-streams",
"Save data using adios2 streams.");
@@ -101,6 +104,7 @@ int main(int argc, char *argv[])
}
return 1;
}
if (*glvis) { visualization = true; }
if (verbose)
{
args.PrintOptions(cout);
@@ -449,19 +453,28 @@ int main(int argc, char *argv[])
{
char vishost[] = "localhost";
int visport = 19916;
socketstream u_sock(vishost, visport);
u_sock << "parallel " << num_procs << " " << myid << "\n";
u_sock.precision(8);
u_sock << "solution\n" << *pmesh << *u << "window_title 'Velocity'"
<< endl;
// Make sure all ranks have sent their 'u' solution before initiating
// another set of GLVis connections (one from each rank):
MPI_Barrier(pmesh->GetComm());
socketstream p_sock(vishost, visport);
p_sock << "parallel " << num_procs << " " << myid << "\n";
p_sock.precision(8);
p_sock << "solution\n" << *pmesh << *p << "window_title 'Pressure'"
<< endl;
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
if (visualization)
{
socketstream u_sock(vishost, visport);
u_sock << "parallel " << num_procs << " " << myid << "\n";
u_sock.precision(8);
u_sock << "solution\n" << *pmesh << *u << "window_title 'Velocity'"
<< endl;
// Make sure all ranks have sent their 'u' solution before initiating
// another set of GLVis connections (one from each rank):
MPI_Barrier(pmesh->GetComm());
socketstream p_sock(vishost, visport);
p_sock << "parallel " << num_procs << " " << myid << "\n";
p_sock.precision(8);
p_sock << "solution\n" << *pmesh << *p << "window_title 'Pressure'"
<< endl;
}
}
// 20. Free the used memory.
+16 -3
View File
@@ -76,6 +76,7 @@ int main(int argc, char *argv[])
bool smooth_rt = true;
bool restart = false;
bool visualization = true;
const char *glvis = "";
bool rebalance = true;
bool usePRefinement = false;
@@ -108,6 +109,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.Parse();
if (!args.Good())
{
@@ -117,6 +120,7 @@ int main(int argc, char *argv[])
}
return 1;
}
if (*glvis) { visualization = true; }
if (myid == 0)
{
args.PrintOptions(cout);
@@ -236,8 +240,17 @@ int main(int argc, char *argv[])
socketstream sout;
if (visualization)
{
sout.open(vishost, visport);
if (!sout)
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
if (visualization)
{
sout.open(vishost, visport);
}
if (visualization && !sout)
{
if (myid == 0)
{
@@ -248,7 +261,7 @@ int main(int argc, char *argv[])
visualization = false;
}
sout.precision(8);
if (visualization) { sout.precision(8); }
}
// 14. Set up an error estimator. Here we use the Zienkiewicz-Zhu estimator
+16 -3
View File
@@ -156,6 +156,7 @@ int main(int argc, char *argv[])
real_t t_final = 10.0;
real_t dt = 0.01;
bool visualization = true;
const char *glvis = "";
bool visit = false;
bool paraview = false;
bool binary = false;
@@ -194,6 +195,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&visit, "-visit", "--visit-datafiles", "-no-visit",
"--no-visit-datafiles",
"Save data files for VisIt (visit.llnl.gov) visualization.");
@@ -211,6 +214,7 @@ int main(int argc, char *argv[])
args.PrintUsage(cout);
return 1;
}
if (*glvis) { visualization = true; }
args.PrintOptions(cout);
Device device(device_config);
@@ -347,15 +351,24 @@ int main(int argc, char *argv[])
{
char vishost[] = "localhost";
int visport = 19916;
sout.open(vishost, visport);
if (!sout)
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
if (visualization)
{
sout.open(vishost, visport);
}
if (visualization && !sout)
{
cout << "Unable to connect to GLVis server at "
<< vishost << ':' << visport << endl;
visualization = false;
cout << "GLVis visualization disabled.\n";
}
else
else if (visualization)
{
sout.precision(precision);
sout << "solution\n" << mesh << u;
+36 -22
View File
@@ -252,6 +252,7 @@ int main(int argc, char *argv[])
real_t t_final = 10.0;
real_t dt = 0.01;
bool visualization = true;
const char *glvis = "";
bool visit = false;
bool paraview = false;
bool adios2 = false;
@@ -299,6 +300,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&visit, "-visit", "--visit-datafiles", "-no-visit",
"--no-visit-datafiles",
"Save data files for VisIt (visit.llnl.gov) visualization.");
@@ -322,6 +325,7 @@ int main(int argc, char *argv[])
}
return 1;
}
if (*glvis) { visualization = true; }
if (Mpi::Root())
{
args.PrintOptions(cout);
@@ -507,31 +511,42 @@ int main(int argc, char *argv[])
{
char vishost[] = "localhost";
int visport = 19916;
sout.open(vishost, visport);
if (!sout)
if (*glvis)
{
if (Mpi::Root())
{
cout << "Unable to connect to GLVis server at "
<< vishost << ':' << visport << endl;
}
visualization = false;
if (Mpi::Root())
{
cout << "GLVis visualization disabled.\n";
}
int port = StartGLVisServer(glvis, visport);
if (port <= 0) { visualization = false; }
else { visport = port; }
}
else
if (visualization)
{
sout << "parallel " << num_procs << " " << myid << "\n";
sout.precision(precision);
sout << "solution\n" << *pmesh << *u;
sout << "pause\n";
sout << flush;
if (Mpi::Root())
sout.open(vishost, visport);
if (!sout)
{
cout << "GLVis visualization paused."
<< " Press space (in the GLVis window) to resume it.\n";
if (Mpi::Root())
{
cout << "Unable to connect to GLVis server at "
<< vishost << ':' << visport << endl;
}
visualization = false;
if (Mpi::Root())
{
cout << "GLVis visualization disabled.\n";
}
}
else
{
sout << "parallel " << num_procs << " " << myid << "\n";
sout.precision(precision);
sout << "solution\n" << *pmesh << *u;
sout << "pause\n";
sout << flush;
if (Mpi::Root())
{
cout << "GLVis visualization paused."
<< " Press space (in the GLVis window) to resume it.\n";
}
}
}
}
@@ -634,7 +649,6 @@ int main(int argc, char *argv[])
return 0;
}
// Implementation of class FE_Evolution
FE_Evolution::FE_Evolution(ParBilinearForm &M_, ParBilinearForm &K_,
const Vector &b_, PrecType prec_type)
+111
View File
@@ -18,12 +18,18 @@
#include <cstring> // memset, memcpy, strerror
#include <cerrno> // errno
#include <cstdio>
#include <cstdlib>
#include <memory>
#include <sstream>
#include <string>
#ifndef _WIN32
#include <netdb.h> // getaddrinfo
#include <arpa/inet.h> // htons
#include <sys/types.h> // socket, setsockopt, connect, recv, send
#include <sys/socket.h> // socket, setsockopt, connect, recv, send
#include <unistd.h> // close
#include <poll.h>
#define closesocket (::close)
#else
#include <winsock2.h>
@@ -44,6 +50,10 @@ typedef int socklen_t;
// #define MFEM_USE_GNUTLS_DEBUG
#endif
#ifdef MFEM_USE_MPI
#include "communication.hpp"
#endif
namespace mfem
{
@@ -1086,4 +1096,105 @@ socketstream::~socketstream()
#endif
}
#ifndef _WIN32
namespace
{
// Keep the popen() handle alive; popen() must be closed with pclose()
struct GLVisServerDeleter
{
void operator()(FILE *f) const
{
if (f != nullptr)
{
const int ierr = pclose(f);
if (ierr != 0)
{
mfem::err << "GLVis server pclose() returns: " << ierr << std::endl;
}
}
}
};
// Store the server handle
std::unique_ptr<FILE, GLVisServerDeleter> glvis_server;
}
#endif
int StartGLVisServer(const char *glvis_path, int preferred_port, int timeout_ms)
{
if (!glvis_path || !*glvis_path) { return -1; }
if (preferred_port <= 0) { return -1; }
if (timeout_ms < 0) { timeout_ms = 0; }
int port = -1;
#ifdef MFEM_USE_MPI
const bool use_mpi = Mpi::IsInitialized() && !Mpi::IsFinalized();
if (use_mpi && !Mpi::Root())
{
MPI_Bcast(&port, 1, MPI_INT, 0, MPI_COMM_WORLD);
return port;
}
#endif
#ifndef _WIN32
if (GetEnv("MFEM_GLVIS_DEBUG"))
{
mfem::out << "MFEM_GLVIS_DEBUG: starting GLVis: " << glvis_path
<< " -p " << preferred_port << " -no-pr -no-ex" << std::endl;
}
// Keep the shell-based startup path, but wait with poll() so startup failure
// does not block indefinitely.
std::stringstream ss;
ss << "trap '' SIGPIPE && " << glvis_path
<< " -p " << preferred_port
<< " -no-pr -no-ex 2>&1 | grep -m 1 ^GLVIS_SERVER_PORT";
glvis_server.reset(popen(ss.str().c_str(), "r"));
FILE *fglvis = glvis_server.get();
if (fglvis)
{
pollfd pfd{};
pfd.fd = fileno(fglvis);
pfd.events = POLLIN;
int pr = -1;
do
{
pr = poll(&pfd, 1, timeout_ms);
}
while (pr < 0 && errno == EINTR);
constexpr size_t ssize = 256;
char line[ssize];
if (pr > 0 && fgets(line, ssize, fglvis) &&
strncmp(line, "GLVIS_SERVER_PORT=", 18) == 0)
{
port = std::atoi(line + 18);
}
else
{
glvis_server.reset();
}
}
#endif // !_WIN32
if (port <= 0)
{
mfem::err << "Failed to start GLVis server '" << glvis_path
<< "'. Disabling visualization." << std::endl;
}
#ifdef MFEM_USE_MPI
if (use_mpi)
{
MPI_Bcast(&port, 1, MPI_INT, 0, MPI_COMM_WORLD);
}
#endif
return port;
}
} // namespace mfem
+22
View File
@@ -294,6 +294,28 @@ public:
~socketserver() { close(); }
};
/** @brief Start a GLVis server process and return the selected port.
This is the library version of the old `examples/ex1p.cpp` helper.
It starts GLVis with `-no-ex` so it can take the first available port at
or above `preferred_port`. The selected port is expected to be printed as
`GLVIS_SERVER_PORT=<port>` on stderr.
Compared to the old `VisServer::Open()`, this helper does not create a
log file and uses `timeout_ms` to bound the wait for the port line.
When MPI is enabled and initialized, this function starts GLVis on rank 0
and broadcasts the selected port to all ranks in `MPI_COMM_WORLD`.
@param glvis_path Path to the GLVis executable.
@param preferred_port Initial port to try (default: 19916).
@param timeout_ms Max time (milliseconds) to wait for port capture.
On failure, this function prints a diagnostic message and returns -1.
@return The selected port (>0) on success, or -1 on failure. */
MFEM_EXPORT int StartGLVisServer(const char *glvis_path,
int preferred_port = 19916,
int timeout_ms = 5000);
} // namespace mfem
#endif
+10
View File
@@ -155,6 +155,7 @@ int main(int argc, char *argv[])
int amr = 0;
int debug = 0;
int visport = 19916;
const char *glvis = "";
const char *problem = "rod";
OptionsParser args(argc, argv);
@@ -182,6 +183,8 @@ int main(int argc, char *argv[])
args.AddOption(&visualization, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&visit, "-visit", "--visit", "-no-visit", "--no-visit",
"Enable or disable VisIt visualization.");
args.AddOption(&vis_steps, "-vs", "--visualization-steps",
@@ -210,6 +213,7 @@ int main(int argc, char *argv[])
}
return 1;
}
if (*glvis) { visualization = true; }
if (Mpi::Root())
{
args.PrintOptions(cout);
@@ -522,6 +526,12 @@ int main(int argc, char *argv[])
socketstream vis_T, vis_E, vis_B, vis_w, vis_P;
char vishost[] = "localhost";
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
if (visualization)
{
// Make sure all ranks have sent their 'v' solution before initiating
+10
View File
@@ -132,6 +132,7 @@ int main(int argc, char *argv[])
bool visualization = true;
int onlySome = -1;
const char *glvis = "";
int visport = 19916;
vector<socketstream*> sock;
@@ -159,6 +160,8 @@ int main(int argc, char *argv[])
"Enable or disable GLVis visualization.");
args.AddOption(&onlySome, "-only", "--onlySome",
"Only view 10 dofs, starting with the specified one.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&visport, "-p", "--send-port", "Socket for GLVis.");
args.Parse();
if (!args.Good())
@@ -166,9 +169,16 @@ int main(int argc, char *argv[])
args.PrintUsage(cout);
return 1;
}
if (*glvis) { visualization = true; }
{
args.PrintOptions(cout);
}
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; }
else { visualization = false; }
}
if ( eInt > 0 && eInt < 7 )
{
eType = (Element::Type)eInt;
+10
View File
@@ -78,6 +78,7 @@ int main(int argc, char *argv[])
int lorder = 0;
bool vis = true;
bool useH1 = false;
const char *glvis = "";
int visport = 19916;
bool use_pointwise_transfer = false;
const char *device_config = "cpu";
@@ -97,6 +98,8 @@ int main(int argc, char *argv[])
args.AddOption(&vis, "-vis", "--visualization", "-no-vis",
"--no-visualization",
"Enable or disable GLVis visualization.");
args.AddOption(&glvis, "-glvis", "--glvis",
"Path to GLVis binary to start a server.");
args.AddOption(&useH1, "-h1", "--use-h1", "-l2", "--use-l2",
"Use H1 spaces instead of L2.");
args.AddOption(&use_pointwise_transfer, "-t", "--use-pointwise-transfer",
@@ -108,6 +111,13 @@ int main(int argc, char *argv[])
"--no-ea-version", "Use element assembly version.");
args.ParseCheck();
if (*glvis)
{
int port = StartGLVisServer(glvis, visport);
if (port > 0) { visport = port; vis = true; }
else { vis = false; }
}
// Configure device
Device device(device_config);
if (Mpi::Root()) { device.Print(); }
+78
View File
@@ -0,0 +1,78 @@
#!/bin/sh
set -eu
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
run_step()
{
dir=$1
cmd=$2
expect=$3
printf '\nDirectory: %s\n' "$dir"
printf 'Command: %s\n' "$cmd"
printf 'Check/: %s\n' "$expect"
printf 'Press Enter to start (Ctrl-C to stop)... '
IFS= read -r _
(
cd "$ROOT/$dir"
sh -c "$cmd"
)
}
run_step \
examples \
"mpirun -np 4 ./ex1p -glvis ../../glvis/glvis" \
"Expect one parallel GLVis window. Close it when done."
run_step \
examples \
"mpirun -np 4 ./ex5p -m ../data/square-disc.mesh -glvis ../../glvis/glvis" \
"Expect velocity and pressure GLVis windows. Close both when done."
run_step \
examples \
"mpirun -np 4 ./ex6p -m ../data/amr-quad.mesh -glvis ../../glvis/glvis" \
"Expect one persistent AMR GLVis window. Close it when done."
run_step \
examples \
"./ex9 -glvis ../../glvis/glvis" \
"Expect one GLVis window that starts paused. Press space to start, then close it when done."
run_step \
examples \
"mpirun -np 4 ./ex9p -glvis ../../glvis/glvis" \
"Expect one parallel GLVis window that starts paused. Press space to start, then close it when done."
run_step \
examples \
"mpirun -np 4 ./ex10p -glvis ../../glvis/glvis" \
"Expect velocity and elastic-energy windows that start paused. Press space in each as needed, then close them."
run_step \
examples \
"./ex16 -glvis ../../glvis/glvis" \
"Expect one GLVis window that starts paused. Press space to start, then close it when done."
run_step \
examples \
"mpirun -np 4 ./ex35p -glvis ../../glvis/glvis" \
"Expect multiple GLVis windows, including a paused harmonic animation window. Press space there to start, then close all windows."
run_step \
miniapps/electromagnetics \
"mpirun -np 8 ./joule -m cylinder-hex.mesh -p rod -glvis ../../../glvis/glvis" \
"Expect several GLVis field windows. Close them when done."
run_step \
miniapps/tools \
"./display-basis -glvis ../../../glvis/glvis" \
"Expect several basis-function windows plus a terminal prompt. Use 'c' in the terminal menu to close windows and quit."
run_step \
miniapps/tools \
"mpirun -np 4 ./plor-transfer -glvis ../../../glvis/glvis" \
"Expect multiple GLVis windows showing the transfer fields. Close them when done."