LCOV - code coverage report
Current view: top level - src/outputs - ConsoleUtils.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 909fe5 Lines: 302 312 96.8 %
Date: 2025-08-29 20:01:24 Functions: 17 17 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //* This file is part of the MOOSE framework
       2             : //* https://mooseframework.inl.gov
       3             : //*
       4             : //* All rights reserved, see COPYRIGHT for full restrictions
       5             : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
       6             : //*
       7             : //* Licensed under LGPL 2.1, please see LICENSE for details
       8             : //* https://www.gnu.org/licenses/lgpl-2.1.html
       9             : 
      10             : // MOOSE includes
      11             : #include "ConsoleUtils.h"
      12             : 
      13             : #include "AuxiliarySystem.h"
      14             : #include "Conversion.h"
      15             : #include "Executioner.h"
      16             : #include "MoosePreconditioner.h"
      17             : #include "FEProblem.h"
      18             : #include "MooseApp.h"
      19             : #include "MooseMesh.h"
      20             : #include "MooseObject.h"
      21             : #include "NonlinearSystem.h"
      22             : #include "OutputWarehouse.h"
      23             : #include "SystemInfo.h"
      24             : #include "Checkpoint.h"
      25             : #include "InputParameterWarehouse.h"
      26             : #include "Registry.h"
      27             : #include "CommandLine.h"
      28             : #include "Split.h"
      29             : 
      30             : #include <filesystem>
      31             : 
      32             : #include "libmesh/string_to_enum.h"
      33             : #include "libmesh/simple_range.h"
      34             : 
      35             : using namespace libMesh;
      36             : 
      37             : namespace ConsoleUtils
      38             : {
      39             : 
      40             : std::string
      41       28043 : indent(unsigned int spaces)
      42             : {
      43       56086 :   return std::string(spaces, ' ');
      44             : }
      45             : 
      46             : std::string
      47       90211 : outputFrameworkInformation(const MooseApp & app)
      48             : {
      49       90211 :   std::stringstream oss;
      50       90211 :   oss << std::left;
      51             : 
      52       90211 :   oss << app.getSystemInfo().getInfo();
      53             : 
      54       90211 :   oss << "Input File(s):\n";
      55      180698 :   for (const auto & entry : app.getInputFileNames())
      56       90487 :     oss << "  " << std::filesystem::absolute(entry).c_str() << "\n";
      57       90211 :   oss << "\n";
      58             : 
      59       90211 :   const auto & cl = std::as_const(*app.commandLine());
      60             :   // We skip the 0th argument of the main app, i.e., the name used to invoke the program
      61             :   const auto cl_range =
      62      180422 :       as_range(std::next(cl.getEntries().begin(), app.multiAppLevel() == 0), cl.getEntries().end());
      63             : 
      64       90211 :   std::stringstream args_oss;
      65      788424 :   for (const auto & entry : cl_range)
      66      698213 :     if (!entry.hit_param && !entry.subapp_name && entry.name != "-i")
      67      468872 :       args_oss << "  " << cl.formatEntry(entry) << "\n";
      68       90211 :   if (args_oss.str().size())
      69       86697 :     oss << "Command Line Argument(s):\n" << args_oss.str() << "\n";
      70             : 
      71       90211 :   std::stringstream input_args_oss;
      72      788424 :   for (const auto & entry : cl_range)
      73      698213 :     if (entry.hit_param && !entry.subapp_name)
      74      153329 :       input_args_oss << "  " << cl.formatEntry(entry) << "\n";
      75       90211 :   if (input_args_oss.str().size())
      76       79216 :     oss << "Command Line Input Argument(s):\n" << input_args_oss.str() << "\n";
      77             : 
      78       90211 :   const auto checkpoints = app.getOutputWarehouse().getOutputs<Checkpoint>();
      79       90211 :   if (checkpoints.size())
      80             :   {
      81       75526 :     oss << std::left << "Checkpoint:\n";
      82       75526 :     oss << checkpoints[0]->checkpointInfo().str();
      83       75526 :     oss << std::endl;
      84             :   }
      85             : 
      86       90211 :   oss << std::left << "Parallelism:\n"
      87             :       << std::setw(console_field_width)
      88       90211 :       << "  Num Processors: " << static_cast<std::size_t>(app.n_processors()) << '\n'
      89             :       << std::setw(console_field_width)
      90       90211 :       << "  Num Threads: " << static_cast<std::size_t>(libMesh::n_threads()) << std::endl;
      91             : 
      92      180422 :   return oss.str();
      93       90211 : }
      94             : 
      95             : std::string
      96       55772 : outputMeshInformation(FEProblemBase & problem, bool verbose)
      97             : {
      98       55772 :   std::stringstream oss;
      99       55772 :   oss << std::left;
     100             : 
     101       55772 :   const MooseMesh & mesh = problem.mesh();
     102             : 
     103       55772 :   const auto fe_backend = problem.feBackend();
     104             : 
     105       55772 :   if (verbose)
     106             :   {
     107       55409 :     oss << "\nMesh: " << '\n' << std::setw(console_field_width);
     108             : 
     109       55409 :     oss << "  Parallel Type: " << (mesh.isDistributedMesh() ? "distributed" : "replicated");
     110       55409 :     if (fe_backend == Moose::FEBackend::LibMesh)
     111             :     {
     112       55098 :       bool forced = mesh.isParallelTypeForced();
     113       55098 :       bool pre_split = mesh.isSplit();
     114       54472 :       oss << (forced || pre_split ? " (" : "") << (forced ? "forced" : "")
     115         626 :           << (forced && pre_split ? ", " : "") << (pre_split ? "pre-split" : "")
     116      110196 :           << (forced || pre_split ? ")" : "");
     117             :     }
     118       55409 :     oss << '\n';
     119       55409 :     oss << std::setw(console_field_width) << "  Mesh Dimension: " << mesh.dimension() << '\n'
     120       55409 :         << std::setw(console_field_width) << "  Spatial Dimension: " << mesh.spatialDimension()
     121       55409 :         << '\n';
     122             :   }
     123             : 
     124             :   // Nodes, only associated with the mesh in libMesh
     125       55772 :   if (fe_backend == Moose::FEBackend::LibMesh)
     126             :   {
     127       55461 :     if (mesh.n_processors() > 1)
     128             :     {
     129       25432 :       dof_id_type nnodes = mesh.nNodes();
     130       25432 :       dof_id_type nnodes_local = mesh.nLocalNodes();
     131             :       oss << std::setw(console_field_width) << "  Nodes:" << '\n'
     132       25432 :           << std::setw(console_field_width) << "    Total:" << nnodes << '\n';
     133       25432 :       oss << std::setw(console_field_width) << "    Local:" << nnodes_local << '\n';
     134       25432 :       dof_id_type min_nnodes = nnodes_local, max_nnodes = nnodes_local;
     135       25432 :       mesh.comm().min(min_nnodes);
     136       25432 :       mesh.comm().max(max_nnodes);
     137       25432 :       if (mesh.processor_id() == 0)
     138       11886 :         oss << std::setw(console_field_width) << "    Min/Max/Avg:" << min_nnodes << '/'
     139       11886 :             << max_nnodes << '/' << nnodes / mesh.n_processors() << '\n';
     140             :     }
     141             :     else
     142       30029 :       oss << std::setw(console_field_width) << "  Nodes:" << mesh.nNodes() << '\n';
     143             :   }
     144             : 
     145             :   // Elements
     146       55772 :   if (mesh.n_processors() > 1)
     147             :   {
     148       25480 :     dof_id_type nelems = mesh.nActiveElem();
     149       25480 :     dof_id_type nelems_local = mesh.nActiveLocalElem();
     150             :     oss << std::setw(console_field_width) << "  Elems:" << '\n'
     151       25480 :         << std::setw(console_field_width) << "    Total:" << nelems << '\n';
     152       25480 :     oss << std::setw(console_field_width) << "    Local:" << nelems_local << '\n';
     153       25480 :     dof_id_type min_nelems = nelems_local, max_nelems = nelems_local;
     154       25480 :     mesh.comm().min(min_nelems);
     155       25480 :     mesh.comm().max(max_nelems);
     156       25480 :     if (mesh.processor_id() == 0)
     157       11910 :       oss << std::setw(console_field_width) << "    Min/Max/Avg:" << min_nelems << '/' << max_nelems
     158       11910 :           << '/' << nelems / mesh.n_processors() << '\n';
     159             :   }
     160             :   else
     161       30292 :     oss << std::setw(console_field_width) << "  Elems:" << mesh.nActiveElem() << '\n';
     162             : 
     163             :   // P-refinement
     164       55772 :   if (fe_backend == Moose::FEBackend::LibMesh)
     165             :   {
     166       55461 :     if (mesh.maxPLevel() > 0)
     167             :       oss << std::setw(console_field_width)
     168          42 :           << "  Max p-Refinement Level: " << static_cast<std::size_t>(mesh.maxPLevel()) << '\n';
     169       55461 :     if (mesh.maxHLevel() > 0)
     170             :       oss << std::setw(console_field_width)
     171        6393 :           << "  Max h-Refinement Level: " << static_cast<std::size_t>(mesh.maxHLevel()) << '\n';
     172             :   }
     173             : 
     174       55772 :   if (verbose)
     175             :   {
     176             :     oss << std::setw(console_field_width)
     177       55409 :         << "  Num Subdomains: " << static_cast<std::size_t>(mesh.nSubdomains()) << '\n';
     178       55409 :     if (mesh.n_processors() > 1 && fe_backend == Moose::FEBackend::LibMesh)
     179             :     {
     180             :       oss << std::setw(console_field_width)
     181       25258 :           << "  Num Partitions: " << static_cast<std::size_t>(mesh.nPartitions()) << '\n'
     182       25258 :           << std::setw(console_field_width) << "  Partitioner: " << mesh.partitionerName()
     183       25258 :           << (mesh.isPartitionerForced() ? " (forced) " : "") << '\n';
     184       25258 :       if (mesh.skipPartitioning())
     185         700 :         oss << std::setw(console_field_width) << "  Skipping all partitioning!" << '\n';
     186       24558 :       else if (mesh.skipNoncriticalPartitioning())
     187           0 :         oss << std::setw(console_field_width) << "  Skipping noncritical partitioning!" << '\n';
     188             :     }
     189             :   }
     190             : 
     191       55772 :   oss << std::endl;
     192             : 
     193      111544 :   return oss.str();
     194       55772 : }
     195             : 
     196             : std::string
     197       55772 : outputAuxiliarySystemInformation(FEProblemBase & problem)
     198             : {
     199       55772 :   return outputSystemInformationHelper(problem.getAuxiliarySystem().system());
     200             : }
     201             : 
     202             : std::string
     203      111819 : outputSystemInformationHelper(std::stringstream & oss, System & system)
     204             : {
     205      111819 :   oss << std::left;
     206             : 
     207      111819 :   if (system.n_dofs())
     208             :   {
     209       69575 :     oss << std::setw(console_field_width) << "  Num DOFs: " << system.n_dofs() << '\n'
     210       69575 :         << std::setw(console_field_width) << "  Num Local DOFs: " << system.n_local_dofs() << '\n';
     211             : 
     212       69575 :     if (system.n_constrained_dofs())
     213             :     {
     214             :       oss << std::setw(console_field_width)
     215        1246 :           << "  Num Constrained DOFs: " << system.n_constrained_dofs() << '\n'
     216             :           << std::setw(console_field_width)
     217        1246 :           << "  Local Constrained DOFs: " << system.n_local_constrained_dofs() << '\n';
     218             :     }
     219             : 
     220       69575 :     std::streampos begin_string_pos = oss.tellp();
     221       69575 :     std::streampos curr_string_pos = begin_string_pos;
     222       69575 :     oss << std::setw(console_field_width) << "  Variables: ";
     223      159092 :     for (unsigned int vg = 0; vg < system.n_variable_groups(); vg++)
     224             :     {
     225       89517 :       const VariableGroup & vg_description(system.variable_group(vg));
     226             : 
     227       89517 :       if (vg_description.n_variables() > 1)
     228       15442 :         oss << "{ ";
     229       89517 :       if (vg_description.n_variables() > 10)
     230             :       {
     231             :         // when the number of variables in this group is larger than 10, we only output the first
     232             :         // and the last 5 variable names
     233        3252 :         for (unsigned int vn = 0; vn < 5; vn++)
     234             :         {
     235        2710 :           oss << "\"" << vg_description.name(vn) << "\" ";
     236        2710 :           curr_string_pos = oss.tellp();
     237        2710 :           insertNewline(oss, begin_string_pos, curr_string_pos);
     238             :         }
     239         542 :         oss << "... ";
     240         542 :         curr_string_pos = oss.tellp();
     241         542 :         insertNewline(oss, begin_string_pos, curr_string_pos);
     242        3252 :         for (unsigned int vn = vg_description.n_variables() - 5; vn < vg_description.n_variables();
     243             :              vn++)
     244             :         {
     245        2710 :           oss << "\"" << vg_description.name(vn) << "\" ";
     246        2710 :           curr_string_pos = oss.tellp();
     247        2710 :           insertNewline(oss, begin_string_pos, curr_string_pos);
     248             :         }
     249             :       }
     250             :       else
     251      204520 :         for (unsigned int vn = 0; vn < vg_description.n_variables(); vn++)
     252             :         {
     253      115545 :           oss << "\"" << vg_description.name(vn) << "\" ";
     254      115545 :           curr_string_pos = oss.tellp();
     255      115545 :           insertNewline(oss, begin_string_pos, curr_string_pos);
     256             :         }
     257             : 
     258       89517 :       if (vg_description.n_variables() > 1)
     259       15442 :         oss << "} ";
     260             :     }
     261       69575 :     oss << '\n';
     262             : 
     263       69575 :     begin_string_pos = oss.tellp();
     264       69575 :     curr_string_pos = begin_string_pos;
     265       69575 :     oss << std::setw(console_field_width) << "  Finite Element Types: ";
     266             : #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
     267      159092 :     for (unsigned int vg = 0; vg < system.n_variable_groups(); vg++)
     268             :     {
     269             :       oss << "\""
     270       89517 :           << libMesh::Utility::enum_to_string<FEFamily>(
     271       89517 :                  system.get_dof_map().variable_group(vg).type().family)
     272      179034 :           << "\" ";
     273       89517 :       curr_string_pos = oss.tellp();
     274       89517 :       insertNewline(oss, begin_string_pos, curr_string_pos);
     275             :     }
     276       69575 :     oss << '\n';
     277             : #else
     278             :     for (unsigned int vg = 0; vg < system.n_variable_groups(); vg++)
     279             :     {
     280             :       oss << "\""
     281             :           << libMesh::Utility::enum_to_string<FEFamily>(
     282             :                  system.get_dof_map().variable_group(vg).type().family)
     283             :           << "\", \""
     284             :           << libMesh::Utility::enum_to_string<FEFamily>(
     285             :                  system.get_dof_map().variable_group(vg).type().radial_family)
     286             :           << "\" ";
     287             :       curr_string_pos = oss.tellp();
     288             :       insertNewline(oss, begin_string_pos, curr_string_pos);
     289             :     }
     290             :     oss << '\n';
     291             : 
     292             :     begin_string_pos = oss.tellp();
     293             :     curr_string_pos = begin_string_pos;
     294             :     oss << std::setw(console_field_width) << "  Infinite Element Mapping: ";
     295             :     for (unsigned int vg = 0; vg < system.n_variable_groups(); vg++)
     296             :     {
     297             :       oss << "\""
     298             :           << libMesh::Utility::enum_to_string<InfMapType>(
     299             :                  system.get_dof_map().variable_group(vg).type().inf_map)
     300             :           << "\" ";
     301             :       curr_string_pos = oss.tellp();
     302             :       insertNewline(oss, begin_string_pos, curr_string_pos);
     303             :     }
     304             :     oss << '\n';
     305             : #endif
     306             : 
     307       69575 :     begin_string_pos = oss.tellp();
     308       69575 :     curr_string_pos = begin_string_pos;
     309       69575 :     oss << std::setw(console_field_width) << "  Approximation Orders: ";
     310      159092 :     for (unsigned int vg = 0; vg < system.n_variable_groups(); vg++)
     311             :     {
     312             : #ifndef LIBMESH_ENABLE_INFINITE_ELEMENTS
     313             :       oss << "\""
     314      179034 :           << Utility::enum_to_string<Order>(system.get_dof_map().variable_group(vg).type().order)
     315      179034 :           << "\" ";
     316             : #else
     317             :       oss << "\""
     318             :           << Utility::enum_to_string<Order>(system.get_dof_map().variable_group(vg).type().order)
     319             :           << "\", \""
     320             :           << Utility::enum_to_string<Order>(
     321             :                  system.get_dof_map().variable_group(vg).type().radial_order)
     322             :           << "\" ";
     323             : #endif
     324       89517 :       curr_string_pos = oss.tellp();
     325       89517 :       insertNewline(oss, begin_string_pos, curr_string_pos);
     326             :     }
     327       69575 :     oss << "\n" << std::endl;
     328             :   }
     329             : 
     330      111819 :   return oss.str();
     331             : }
     332             : 
     333             : std::string
     334       56047 : outputSolverSystemInformation(FEProblemBase & problem, const unsigned int sys_num)
     335             : {
     336       56047 :   std::stringstream oss;
     337       56047 :   oss << std::left;
     338             : 
     339      112094 :   return outputSystemInformationHelper(oss, problem.getSolverSystem(sys_num).system());
     340       56047 : }
     341             : 
     342             : std::string
     343       55772 : outputSystemInformationHelper(System & system)
     344             : {
     345       55772 :   std::stringstream oss;
     346             : 
     347      111544 :   return outputSystemInformationHelper(oss, system);
     348       55772 : }
     349             : 
     350             : std::string
     351         102 : outputRelationshipManagerInformation(const MooseApp & app)
     352             : {
     353         102 :   std::stringstream oss;
     354         102 :   oss << std::left;
     355             : 
     356         102 :   auto info_strings = app.getRelationshipManagerInfo();
     357         102 :   if (info_strings.size())
     358             :   {
     359         636 :     for (const auto & info_pair : info_strings)
     360             :       oss << std::setw(console_field_width)
     361        1068 :           << "  " + MooseUtils::underscoreToCamelCase(MooseUtils::toLower(info_pair.first), true) +
     362             :                  ":"
     363        1068 :           << info_pair.second << '\n';
     364         102 :     oss << std::endl;
     365             :   }
     366             : 
     367         204 :   return oss.str();
     368         102 : }
     369             : 
     370             : std::string
     371       55409 : outputExecutionInformation(const MooseApp & app, FEProblemBase & problem)
     372             : {
     373             : 
     374       55409 :   std::stringstream oss;
     375       55409 :   oss << std::left;
     376             : 
     377       55409 :   Executioner * exec = app.getExecutioner();
     378             : 
     379             :   oss << "Execution Information:\n"
     380       55409 :       << std::setw(console_field_width) << "  Executioner: " << exec->type() << '\n';
     381             : 
     382       55409 :   std::string time_stepper = exec->getTimeStepperName();
     383       55409 :   if (time_stepper != "")
     384       25775 :     oss << std::setw(console_field_width) << "  TimeStepper: " << time_stepper << '\n';
     385       55409 :   const auto time_integrator_names = exec->getTimeIntegratorNames();
     386       55409 :   if (!time_integrator_names.empty())
     387             :     oss << std::setw(console_field_width)
     388       77007 :         << "  TimeIntegrator(s): " << MooseUtils::join(time_integrator_names, " ") << '\n';
     389             : 
     390             :   oss << std::setw(console_field_width)
     391      166227 :       << std::string("  Solver") +
     392      110818 :              (problem.feBackend() == Moose::FEBackend::LibMesh ? " Mode" : "") + ": ";
     393      111093 :   for (const std::size_t i : make_range(problem.numSolverSystems()))
     394      221636 :     oss << (problem.numSolverSystems() > 1 ? "[" + problem.getSolverSystemNames()[i] + "]: " : "")
     395       55684 :         << problem.solverTypeString(i) << " ";
     396       55409 :   oss << '\n';
     397             : 
     398             :   // Check for a selection of common PETSc pc options on the command line for
     399             :   // all solver systems and all field splits within each nonlinear system
     400       55409 :   std::string pc_desc;
     401      111093 :   for (const std::size_t i : make_range(problem.numSolverSystems()))
     402             :   {
     403      111368 :     std::vector<std::string> splits = {""};
     404       55684 :     if (problem.isSolverSystemNonlinear(i))
     405       54829 :       for (const auto & split : problem.getNonlinearSystemBase(i).getSplits().getObjects())
     406         485 :         splits.push_back("fieldsplit_" + split->name() + "_");
     407             : 
     408      111853 :     for (const std::string & split : splits)
     409             :     {
     410       56169 :       std::string pc_desc_split;
     411       56169 :       const std::string prefix = problem.solverParams(i)._prefix + split;
     412      553178 :       for (const auto & entry : std::as_const(*app.commandLine()).getEntries())
     413     1491027 :         if (entry.name == prefix + "pc_type" || entry.name == prefix + "sub_pc_type" ||
     414     1491027 :             entry.name == prefix + "pc_hypre_type" || entry.name == prefix + "pc_fieldsplit_type")
     415           0 :           pc_desc_split += entry.value ? *entry.value + " " : "unspecified ";
     416             : 
     417       56169 :       if (!pc_desc_split.empty() && prefix.size() > 1)
     418           0 :         pc_desc += "[" + prefix.substr(1, prefix.size() - 2) + "]: ";
     419       56169 :       pc_desc += pc_desc_split;
     420       56169 :     }
     421       55684 :   }
     422             : 
     423             :   // Alert the user any unoverridden options will still be picked up from the input file
     424       55409 :   if (!pc_desc.empty())
     425           0 :     pc_desc += "(see input file for unoverridden options)";
     426             : 
     427             :   // If there are no PETSc pc options on the command line, print the input file options
     428       55409 :   if (pc_desc.empty())
     429       55409 :     pc_desc = problem.getPetscOptions().pc_description;
     430             : 
     431       55409 :   if (!pc_desc.empty())
     432       23779 :     oss << std::setw(console_field_width) << "  PETSc Preconditioner: " << pc_desc << '\n';
     433             : 
     434       55409 :   std::string mpc_desc;
     435      109753 :   for (const std::size_t i : make_range(problem.numNonlinearSystems()))
     436             :   {
     437       54344 :     MoosePreconditioner const * mpc = problem.getNonlinearSystemBase(i).getPreconditioner();
     438       54344 :     if (mpc)
     439             :     {
     440       13448 :       if (problem.numNonlinearSystems() > 1)
     441         268 :         mpc_desc += "[" + problem.getNonlinearSystemNames()[i] + "]: ";
     442       13448 :       mpc_desc += mpc->type() + " ";
     443       13448 :       if (mpc->name().find("_moose_auto") != std::string::npos)
     444        9469 :         mpc_desc += "(auto) ";
     445             :     }
     446             :   }
     447             : 
     448       55409 :   if (!mpc_desc.empty())
     449       13314 :     oss << std::setw(console_field_width) << "  MOOSE Preconditioner: " << mpc_desc << '\n';
     450             : 
     451      110818 :   return oss.str();
     452       55409 : }
     453             : 
     454             : std::string
     455          10 : outputOutputInformation(MooseApp & app)
     456             : {
     457          10 :   std::stringstream oss;
     458          10 :   oss << std::left;
     459             : 
     460          10 :   const std::vector<Output *> outputs = app.getOutputWarehouse().getOutputs<Output>();
     461          10 :   oss << "Outputs:\n";
     462          60 :   for (const auto & out : outputs)
     463             :   {
     464             :     // Display the "execute_on" settings
     465          50 :     const MultiMooseEnum & execute_on = out->executeOn();
     466          50 :     oss << "  " << std::setw(console_field_width - 2) << out->name() << "\"" << execute_on
     467          50 :         << "\"\n";
     468             : 
     469             :     // Display the advanced "execute_on" settings, only if they are different from "execute_on"
     470          50 :     if (out->isAdvanced())
     471             :     {
     472          20 :       const OutputOnWarehouse & adv_on = out->advancedExecuteOn();
     473         140 :       for (const auto & adv_it : adv_on)
     474         120 :         if (execute_on != adv_it.second)
     475         140 :           oss << "    " << std::setw(console_field_width - 4) << adv_it.first + ":" << "\""
     476          70 :               << adv_it.second << "\"" << std::endl;
     477             :     }
     478             :   }
     479             : 
     480          20 :   return oss.str();
     481          10 : }
     482             : 
     483             : std::string
     484          26 : outputPreSMOResidualInformation()
     485             : {
     486          26 :   std::stringstream oss;
     487          26 :   oss << std::left;
     488             : 
     489          26 :   oss << COLOR_BLUE;
     490             :   oss << "Executioner/use_pre_smo_residual is set to true. The pre-SMO residual will be evaluated "
     491             :          "at the beginning of each time step before executing objects that could modify the "
     492             :          "solution, such as preset BCs, predictors, correctors, constraints, and certain user "
     493             :          "objects. The pre-SMO residuals will be prefixed with * and will be used in the relative "
     494          26 :          "convergence check.\n";
     495          26 :   oss << COLOR_DEFAULT;
     496             : 
     497          52 :   return oss.str();
     498          26 : }
     499             : 
     500             : std::string
     501       55422 : outputLegacyInformation(MooseApp & app)
     502             : {
     503       55422 :   std::stringstream oss;
     504       55422 :   oss << std::left;
     505             : 
     506       55422 :   if (app.parameters().get<bool>("use_legacy_material_output"))
     507             :   {
     508           0 :     oss << COLOR_RED << "LEGACY MODES ENABLED:" << COLOR_DEFAULT << '\n';
     509             :     oss << " This application uses the legacy material output option: material properties are "
     510             :            "output only on TIMESTEP_END, not INITIAL. To remove this message, set "
     511             :            "'use_legacy_material_output' to false in this application. If there are gold output "
     512             :            "files that contain material property output for which output occurs on INITIAL, then "
     513             :            "these will generate diffs due to zero values being stored, and these tests should be "
     514             :            "re-golded.\n"
     515           0 :         << COLOR_DEFAULT << std::endl;
     516             :   }
     517             : 
     518       55422 :   if (app.parameters().get<bool>("use_legacy_initial_residual_evaluation_behavior"))
     519             :   {
     520           0 :     oss << COLOR_RED << "LEGACY MODES ENABLED:" << COLOR_DEFAULT << '\n';
     521             :     oss << " This application uses the legacy initial residual evaluation behavior. The legacy "
     522             :            "behavior performs an often times redundant residual evaluation before the solution "
     523             :            "modifying objects are executed prior to the initial (0th nonlinear iteration) residual "
     524             :            "evaluation. The new behavior skips that redundant residual evaluation unless the "
     525             :            "parameter Executioner/use_pre_smo_residual is set to true. To remove this message and "
     526             :            "enable the new behavior, set the parameter "
     527             :            "'use_legacy_initial_residual_evaluation_behavior' to false in *App.C. Some tests that "
     528             :            "rely on the side effects of the legacy behavior may fail/diff and should be "
     529             :            "re-golded.\n"
     530           0 :         << COLOR_DEFAULT << std::endl;
     531             :   }
     532             : 
     533      110844 :   return oss.str();
     534       55422 : }
     535             : 
     536             : std::string
     537          10 : outputDataFilePaths()
     538             : {
     539          10 :   std::stringstream oss;
     540          10 :   oss << "Data File Paths:\n";
     541          20 :   for (const auto & [name, path] : Registry::getDataFilePaths())
     542          10 :     oss << "  " << name << ": " << path << "\n";
     543          20 :   return oss.str() + "\n";
     544          10 : }
     545             : 
     546             : std::string
     547          10 : outputDataFileParams(MooseApp & app)
     548             : {
     549          10 :   std::map<std::string, std::string> values; // for A-Z sort
     550         526 :   for (const auto & object_name_params_pair : app.getInputParameterWarehouse().getInputParameters())
     551             :   {
     552         516 :     const auto & params = object_name_params_pair.second;
     553       13000 :     for (const auto & name_value_pair : *params)
     554             :     {
     555       12484 :       const auto & name = name_value_pair.first;
     556       12484 :       if (const auto path = params->queryDataFileNamePath(name))
     557          40 :         if (params->getHitNode(name))
     558       12484 :           values.emplace(params->paramFullpath(name), path->path);
     559             :     }
     560             :   }
     561             : 
     562          10 :   std::stringstream oss;
     563          10 :   oss << "Data File Parameters:\n";
     564          20 :   for (const auto & [param, value] : values)
     565          10 :     oss << "  " << param << " = " << value << "\n";
     566          20 :   return oss.str() + '\n';
     567          10 : }
     568             : 
     569             : void
     570      368960 : insertNewline(std::stringstream & oss, std::streampos & begin, std::streampos & curr)
     571             : {
     572      368960 :   if (curr - begin > console_line_length)
     573             :   {
     574        6044 :     oss << "\n";
     575        6044 :     begin = oss.tellp();
     576        6044 :     oss << std::setw(console_field_width + 2) << ""; // "{ "
     577             :   }
     578      368960 : }
     579             : 
     580             : std::string
     581       63368 : formatString(std::string message, const std::string & prefix)
     582             : {
     583       63368 :   MooseUtils::indentMessage(prefix, message, COLOR_DEFAULT, true, " ");
     584       63368 :   std::stringstream stream;
     585       63368 :   std::streampos start = stream.tellp();
     586       63368 :   stream << message;
     587       63368 :   std::streampos end = stream.tellp();
     588       63368 :   insertNewline(stream, start, end);
     589       63368 :   auto formatted_string = stream.str();
     590             :   // no need to end with a line break
     591       63368 :   if (formatted_string.back() == '\n')
     592           0 :     formatted_string.pop_back();
     593      126736 :   return formatted_string;
     594       63368 : }
     595             : 
     596             : std::string
     597       13181 : mooseObjectVectorToString(const std::vector<MooseObject *> & objs, const std::string & sep /*=""*/)
     598             : {
     599       13181 :   std::string object_names = "";
     600       13181 :   if (objs.size())
     601             :   {
     602             :     // Gather all the object names
     603       13181 :     std::vector<std::string> names;
     604       13181 :     names.reserve(objs.size());
     605       37916 :     for (const auto & obj : objs)
     606             :     {
     607             :       mooseAssert(obj, "Trying to print a null object");
     608       24735 :       names.push_back(obj->name());
     609             :     }
     610             : 
     611       13181 :     object_names = MooseUtils::join(names, sep);
     612       13181 :   }
     613       13181 :   return object_names;
     614           0 : }
     615             : 
     616             : } // ConsoleUtils namespace

Generated by: LCOV version 1.14