Files
mfem/examples/moonolith/example_utils.hpp
T

108 lines
2.3 KiB
C++

// Copyright (c) 2010-2024, Lawrence Livermore National Security, LLC. Produced
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
// LICENSE and NOTICE for details. LLNL-CODE-806117.
//
// This file is part of the MFEM library. For more information and source code
// availability visit https://mfem.org.
//
// MFEM is free software; you can redistribute it and/or modify it under the
// terms of the BSD-3 license. We welcome feedback and contributions, see file
// CONTRIBUTING.md for details.
#include <algorithm>
#include <assert.h>
#include <cstdlib>
#include <memory>
#ifdef MFEM_USE_MPI
#include <mpi.h>
#endif // MFEM_USE_MPI
#include "mfem.hpp"
inline void check_options(mfem::OptionsParser &args)
{
using namespace std;
using namespace mfem;
int rank = 0;
#ifdef MFEM_USE_MPI
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
#endif // MFEM_USE_MPI
if (!args.Good())
{
if (rank == 0)
{
args.PrintUsage(cout);
}
#ifdef MFEM_USE_MPI
MPI_Finalize();
MPI_Abort(MPI_COMM_WORLD, 1);
#else
abort();
#endif // MFEM_USE_MPI
}
if (rank == 0)
{
args.PrintOptions(cout);
}
}
inline void make_fun(mfem::FiniteElementSpace &fe, mfem::Coefficient &c,
mfem::GridFunction &f)
{
using namespace std;
using namespace mfem;
f.SetSpace(&fe);
f.ProjectCoefficient(c);
f.Update();
}
inline double example_fun(const mfem::Vector &x)
{
using namespace std;
using namespace mfem;
const int n = x.Size();
double ret = 0;
for (int k = 0; k < n; ++k)
{
ret += x(k) * x(k);
}
return sqrt(ret);
}
void vector_fun(const mfem::Vector &x, mfem::Vector &f)
{
const double n = x.Norml2();
f.SetSize(x.Size());
f = n;
}
inline void plot(mfem::Mesh &mesh, mfem::GridFunction &x, std::string title)
{
using namespace std;
using namespace mfem;
int num_procs = 1, rank = 0;
#ifdef MFEM_USE_MPI
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
#endif // MFEM_USE_MPI
char vishost[] = "localhost";
int visport = 19916;
socketstream sol_sock(vishost, visport);
sol_sock << "parallel " << num_procs << " " << rank << "\n";
sol_sock.precision(8);
sol_sock << "solution\n" << mesh << x
<< "window_title '"<< title << "'\n" << flush;
sol_sock << flush;
}