Smith  0.1
Smith is an implicit thermal structural mechanics simulation code.
about.cpp
1 // Copyright (c) Lawrence Livermore National Security, LLC and
2 // other Smith Project Developers. See the top-level LICENSE file for
3 // details.
4 //
5 // SPDX-License-Identifier: (BSD-3-Clause)
6 
8 #include "smith/smith_config.hpp"
9 
10 #include <string_view>
11 #include <vector>
12 
13 #include "mpi.h"
14 #include "axom/config.hpp"
15 #include "axom/core.hpp"
16 #include "axom/fmt.hpp"
17 
18 #include "camp/config.hpp"
19 
20 #ifdef SMITH_USE_CALIPER
21 #include "caliper/caliper-config.h"
22 #endif
23 
24 #ifdef SMITH_USE_CONDUIT
25 #include "conduit_config.h"
26 #endif
27 
28 #ifdef SMITH_USE_HDF5
29 #include "hdf5.h"
30 #endif
31 
32 #ifdef SMITH_USE_LUA
33 #include "lua.h"
34 #endif
35 
36 #include "mfem.hpp"
37 
38 #ifdef SMITH_USE_RAJA
39 #include "RAJA/config.hpp"
40 #endif
41 
42 #ifdef SMITH_USE_UMPIRE
43 #include "umpire/Umpire.hpp"
44 #endif
45 
46 #ifdef SMITH_USE_TRIBOL
47 #include "tribol/config.hpp"
48 #endif
49 
50 #include "smith/smith_config.hpp"
51 #include "smith/infrastructure/git_sha.hpp"
53 
54 namespace smith {
55 
56 std::string about()
57 {
58  using namespace axom::fmt;
59  [[maybe_unused]] constexpr std::string_view on = "ON";
60  [[maybe_unused]] constexpr std::string_view off = "OFF";
61 
62  std::string about = "\n";
63 
64  // Version info
65  about += format("Smith Version: {0}\n", version());
66  about += "\n";
67 
68  // General configuration
69 #ifdef SMITH_DEBUG
70  about += format("Debug Build: {0}\n", on);
71 #else
72  about += format("Debug Build: {0}\n", off);
73 #endif
74 
75 #ifdef SMITH_USE_CUDA
76  about += format("CUDA: {0}\n", on);
77 #else
78  about += format("CUDA: {0}\n", off);
79 #endif
80 
81  about += "\n";
82 
83  //------------------------
84  // Libraries
85  //------------------------
86 
87  // Print out version of enabled libraries and list disabled ones by name
88 
89  std::vector<std::string> disabled_libs;
90 
91  about += "Enabled Libraries:\n";
92 
93  // Axom
94  about += format("Axom Version: {0}\n", axom::getVersion());
95 
96  // Camp
97  about += format("Camp Version: {0}\n", CAMP_VERSION);
98 
99  // Caliper
100 #ifdef SMITH_USE_CALIPER
101  about += format("Caliper Version: {0}\n", CALIPER_VERSION);
102 #else
103  disabled_libs.push_back("Caliper");
104 #endif
105 
106  // Conduit
107 #ifdef SMITH_USE_CONDUIT
108  about += format("Conduit Version: {0}\n", CONDUIT_VERSION);
109 #else
110  disabled_libs.push_back("Conduit");
111 #endif
112 
113  // HDF5
114 #ifdef SMITH_USE_HDF5
115  unsigned int h5_maj, h5_min, h5_rel;
116  std::string h5_version;
117  if (H5get_libversion(&h5_maj, &h5_min, &h5_rel) < 0) {
118  SLIC_ERROR("Failed to retrieve HDF5 version.");
119  } else {
120  h5_version = format("{0}.{1}.{2}", h5_maj, h5_min, h5_rel);
121  }
122  about += format("HDF5 Version: {0}\n", h5_version);
123 #else
124  disabled_libs.push_back("HDF5");
125 #endif
126 
127  // Lua
128 #ifdef SMITH_USE_LUA
129  std::string lua_version{LUA_RELEASE};
130  if (axom::utilities::string::startsWith(lua_version, "Lua ")) {
131  lua_version.erase(0, 4);
132  }
133  about += format("Lua Version: {0}\n", lua_version);
134 #else
135  disabled_libs.push_back("Lua");
136 #endif
137 
138  // MFEM
139  const char* mfem_version = mfem::GetVersionStr();
140  if (mfem_version == nullptr) {
141  SLIC_ERROR("Failed to retrieve MFEM version.");
142  }
143  const char* mfem_sha = mfem::GetGitStr();
144  if (mfem_sha == nullptr) {
145  SLIC_ERROR("Failed to retrieve MFEM Git SHA.");
146  }
147  std::string mfem_full_version = std::string(mfem_version);
148  if (axom::utilities::string::startsWith(mfem_full_version, "MFEM ")) {
149  mfem_full_version.erase(0, 5);
150  }
151  if (mfem_sha[0] != '\0') {
152  mfem_full_version += format(" (Git SHA: {0})", mfem_sha);
153  }
154  about += format("MFEM Version: {0}\n", mfem_full_version);
155 
156  // RAJA
157 #ifdef SMITH_USE_RAJA
158  about += format("RAJA Version: {0}.{1}.{2}\n", RAJA_VERSION_MAJOR, RAJA_VERSION_MINOR, RAJA_VERSION_PATCHLEVEL);
159 #else
160  disabled_libs.push_back("RAJA");
161 #endif
162 
163  // Tribol
164 #ifdef SMITH_USE_TRIBOL
165  about += format("Tribol Version: {0}\n", TRIBOL_VERSION_FULL);
166 #else
167  disabled_libs.push_back("Tribol");
168 #endif
169 
170  // Umpire
171 #ifdef SMITH_USE_UMPIRE
172  about += format("Umpire Version: {0}.{1}.{2}\n", umpire::get_major_version(), umpire::get_minor_version(),
173  umpire::get_patch_version());
174 #else
175  disabled_libs.push_back("Umpire");
176 #endif
177 
178  about += "\n";
179 
180  about += "Disabled Libraries:\n";
181  if (disabled_libs.size() == 0) {
182  about += "None\n";
183  } else {
184  for (auto& lib : disabled_libs) {
185  about += lib + "\n";
186  }
187  }
188 
189  return about;
190 }
191 
192 std::string gitSHA() { return SMITH_GIT_SHA; }
193 
195 {
196  // Add header
197  std::string infoMsg = axom::fmt::format("\n{:*^80}\n", " Smith Run Information ");
198 
199  infoMsg += axom::fmt::format("{0}: {1}\n", "Version", version());
200  infoMsg += axom::fmt::format("{0}: {1}\n", "Build Type", buildType());
201  infoMsg += axom::fmt::format("{0}: {1}\n", "User Name", axom::utilities::getUserName());
202  infoMsg += axom::fmt::format("{0}: {1}\n", "Host Name", axom::utilities::getHostName());
203 
204  auto [count, rank] = getMPIInfo();
205  infoMsg += axom::fmt::format("{0}: {1}\n", "MPI Rank Count", count);
206 
207  // Add footer
208  infoMsg += axom::fmt::format("{:*^80}\n", "*");
209 
210  SLIC_INFO_ROOT(infoMsg);
211  smith::logger::flush();
212 }
213 
214 std::string version(bool add_SHA)
215 {
216  std::string version =
217  axom::fmt::format("v{0}.{1}.{2}", SMITH_VERSION_MAJOR, SMITH_VERSION_MINOR, SMITH_VERSION_PATCH);
218 
219  std::string sha = gitSHA();
220  if (add_SHA && !sha.empty()) {
221  version += "-" + sha;
222  }
223 
224  return version;
225 }
226 
227 std::string compiler() { return axom::fmt::format("{0} version {1}", SMITH_COMPILER_NAME, SMITH_COMPILER_VERSION); }
228 
229 std::string buildType()
230 {
231 #ifdef SMITH_DEBUG
232  return "Debug";
233 #else
234  return "Release";
235 #endif
236 }
237 
238 std::pair<int, int> getMPIInfo(MPI_Comm comm)
239 {
240  int num_procs = 0;
241  int rank = 0;
242  if (MPI_Comm_size(comm, &num_procs) != MPI_SUCCESS) {
243  SLIC_ERROR("Failed to determine number of MPI processes");
244  }
245 
246  if (MPI_Comm_rank(comm, &rank) != MPI_SUCCESS) {
247  SLIC_ERROR("Failed to determine MPI rank");
248  }
249  return {num_procs, rank};
250 }
251 
252 } // namespace smith
This file contains the interface used for retrieving information about how the driver is configured.
This file contains the all the necessary functions and macros required for logging as well as a helpe...
Accelerator functionality.
Definition: smith.cpp:36
std::string version(bool add_SHA)
Returns a string for the version of Smith.
Definition: about.cpp:214
std::string buildType()
Returns a string for the current CMake build type (e.g. Debug, Release)
Definition: about.cpp:229
std::pair< int, int > getMPIInfo(MPI_Comm comm)
Get MPI Info.
Definition: about.cpp:238
std::string compiler()
Returns a string for the current compiler name and version.
Definition: about.cpp:227
std::string about()
Returns a string about the configuration of Smith.
Definition: about.cpp:56
std::string gitSHA()
Returns a string for the Git SHA when the driver was built.
Definition: about.cpp:192
void printRunInfo()
Outputs basic run information to the screen.
Definition: about.cpp:194