LibMeshInit::~LibMeshInit() { // We can't delete, finalize, etc. more than once without // reinitializing in between libmesh_exceptionless_assert(!libMesh::closed()); // Delete reference counted singleton(s) Singleton::cleanup(); // Clear the thread task manager we started task_scheduler.reset(); // Let's be sure we properly close on every processor at once: libmesh_parallel_only(this->comm()); // Force the \p ReferenceCounter to print // its reference count information. This allows // us to find memory leaks. By default the // \p ReferenceCounter only prints its information // when the last created object has been destroyed. // That does no good if we are leaking memory! ReferenceCounter::print_info (); // Print an informative message if we detect a memory leak if (ReferenceCounter::n_objects() != 0) { libMesh::err << "Memory leak detected!" << std::endl; #if !defined(LIBMESH_ENABLE_REFERENCE_COUNTING) || defined(NDEBUG) libMesh::err << "Compile in DEBUG mode with --enable-reference-counting" << std::endl << "for more information" << std::endl; #endif } // print the perflog to individual processor's file. libMesh::perflog.print_log(); // Now clear the logging object, we don't want it to print // a second time during the PerfLog destructor. libMesh::perflog.clear(); // Reconnect the output streams // (don't do this, or we will get messages from objects // that go out of scope after the following return) //std::cout.rdbuf(std::cerr.rdbuf()); // Set the initialized() flag to false libMeshPrivateData::_is_initialized = false; if (libMesh::on_command_line ("--redirect-stdout")) { // If stdout/stderr were redirected to files, reset them now. libMesh::out.rdbuf (out_buf); libMesh::err.rdbuf (err_buf); } // If we built our own output streams, we want to clean them up. if (libMesh::on_command_line ("--separate-libmeshout")) { delete libMesh::out.get(); delete libMesh::err.get(); libMesh::out.reset(std::cout); libMesh::err.reset(std::cerr); } #ifdef LIBMESH_ENABLE_EXCEPTIONS // Reset the old terminate handler; maybe the user code wants to // keep doing C++ stuff after closing libMesh stuff. std::set_terminate(old_terminate_handler); #endif if (libMesh::on_command_line("--enable-fpe")) libMesh::enableFPE(false); #if defined(LIBMESH_HAVE_PETSC) // Allow the user to bypass PETSc finalization if (!libMesh::on_command_line ("--disable-petsc") #if defined(LIBMESH_HAVE_MPI) && !libMesh::on_command_line ("--disable-mpi") #endif ) { # if defined(LIBMESH_HAVE_SLEPC) if (libmesh_initialized_slepc) SlepcFinalize(); # else if (libmesh_initialized_petsc) PetscFinalize(); # endif } #endif #if defined(LIBMESH_HAVE_MPI) // Allow the user to bypass MPI finalization if (!libMesh::on_command_line ("--disable-mpi")) { this->_comm.clear(); #ifndef LIBMESH_DISABLE_COMMWORLD Parallel::Communicator_World.clear(); #endif if (libmesh_initialized_mpi) MPI_Finalize(); } #endif }
MeshBase::~MeshBase() { this->clear(); libmesh_exceptionless_assert (!libMesh::closed()); }
UnstructuredMesh::~UnstructuredMesh () { // this->clear (); // Nothing to clear at this level libmesh_exceptionless_assert (!libMesh::closed()); }
LibMeshInit::~LibMeshInit() { // Every processor had better be ready to exit at the same time. // This would be a libmesh_parallel_only() function, except that // libmesh_parallel_only() uses libmesh_assert() which throws an // exception() which causes compilers to scream about exceptions // inside destructors. // Even if we're not doing parallel_only debugging, we don't want // one processor to try to exit until all others are done working. this->comm().barrier(); // We can't delete, finalize, etc. more than once without // reinitializing in between libmesh_exceptionless_assert(!libMesh::closed()); // Delete reference counted singleton(s) Singleton::cleanup(); // Clear the thread task manager we started task_scheduler.reset(); // Force the \p ReferenceCounter to print // its reference count information. This allows // us to find memory leaks. By default the // \p ReferenceCounter only prints its information // when the last created object has been destroyed. // That does no good if we are leaking memory! ReferenceCounter::print_info (); // Print an informative message if we detect a memory leak if (ReferenceCounter::n_objects() != 0) { libMesh::err << "Memory leak detected!" << std::endl; #if !defined(LIBMESH_ENABLE_REFERENCE_COUNTING) || defined(NDEBUG) libMesh::err << "Compile in DEBUG mode with --enable-reference-counting" << std::endl << "for more information" << std::endl; #endif } // print the perflog to individual processor's file. libMesh::perflog.print_log(); // Now clear the logging object, we don't want it to print // a second time during the PerfLog destructor. libMesh::perflog.clear(); // Reconnect the output streams // (don't do this, or we will get messages from objects // that go out of scope after the following return) //std::cout.rdbuf(std::cerr.rdbuf()); // Set the initialized() flag to false libMeshPrivateData::_is_initialized = false; if (libMesh::on_command_line ("--redirect-stdout") || libMesh::on_command_line ("--redirect-output")) { // If stdout/stderr were redirected to files, reset them now. libMesh::out.rdbuf (out_buf); libMesh::err.rdbuf (err_buf); } // If we built our own output streams, we want to clean them up. if (libMesh::on_command_line ("--separate-libmeshout")) { delete libMesh::out.get(); delete libMesh::err.get(); libMesh::out.reset(std::cout); libMesh::err.reset(std::cerr); } #ifdef LIBMESH_ENABLE_EXCEPTIONS // Reset the old terminate handler; maybe the user code wants to // keep doing C++ stuff after closing libMesh stuff. std::set_terminate(old_terminate_handler); #endif if (libMesh::on_command_line("--enable-fpe")) libMesh::enableFPE(false); #if defined(LIBMESH_HAVE_PETSC) // Allow the user to bypass PETSc finalization if (!libMesh::on_command_line ("--disable-petsc") #if defined(LIBMESH_HAVE_MPI) && !libMesh::on_command_line ("--disable-mpi") #endif ) { # if defined(LIBMESH_HAVE_SLEPC) if (libmesh_initialized_slepc) SlepcFinalize(); # else if (libmesh_initialized_petsc) PetscFinalize(); # endif } #endif #if defined(LIBMESH_HAVE_MPI) && defined(LIBMESH_HAVE_VTK) _vtk_mpi_controller->Finalize(/*finalized_externally=*/1); _vtk_mpi_controller->Delete(); #endif #if defined(LIBMESH_HAVE_MPI) // Allow the user to bypass MPI finalization if (!libMesh::on_command_line ("--disable-mpi")) { this->_comm.clear(); if (libmesh_initialized_mpi) { // We can't just libmesh_assert here because destructor, // but we ought to report any errors unsigned int error_code = MPI_Finalize(); if (error_code != MPI_SUCCESS) { char error_string[MPI_MAX_ERROR_STRING+1]; int error_string_len; MPI_Error_string(error_code, error_string, &error_string_len); std::cerr << "Failure from MPI_Finalize():\n" << error_string << std::endl; } } } #endif }