Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4415bda440 | ||
|
|
4667cf9d39 | ||
|
|
1e6c8ecf56 | ||
|
|
95c844f519 | ||
|
|
b5b0f2382f | ||
|
|
bbdc39d605 | ||
|
|
7fed49c38b |
+43
-12
@@ -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
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
Executable
+78
@@ -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."
|
||||
Reference in New Issue
Block a user