>"I skimmed most of the messages and it did sound like it would be something >easy to find by looking at the exact code so I was a bit surprised with that last post :)"
Just in case it is something easy to spot I have the code at the bottom of the email highlighted. If you don't need the code you can just ignore the highlighted part of the email. >The linking is a bit unorthodox, indeed I think you had some specific >recommendations for linking to libmesh that hid most of the details, but >actually building it and compiling with it were pretty easy. I turned on some debug info >from the example make script, just copied its invokation of g++ and libtool >and that seems to work for some simple case. This is my first time compiling a libmesh code so I tried to figure out what compiler flags to use in the suggested manner for simple codes (according to http://libmesh.github.io/installation.html) which is libmesh-config --cxx` -o HPeigenproblems_PZ_8_2_16_2 HPeigenproblems_PZ_8_2_16_2.C `libmesh-config --cxxflags --include --ldflags --libs`. This is my first time compiling a libmesh code so I thought maybe I should use a Makefile.am from a regular libmesh example. (My other example files compiled properly) so I was thinking that it might work to follow the instructions for adding a new libmesh example ( https://github.com/libMesh/libmesh/wiki/Adding-a-new-example) which invoves changing the Makefile.am and run.sh from another example file to run the program. I started following the directions for adding a new example and am not sure what line to put into AC_CONFIG_FILES in configure.ac at the top level of libmesh. I would have thought it would have been the directory of the example file I am adding or the Makefile that goes with it but I do not see the directories of any other example programs in AC_CONFIG_FILES within the configure.ac program. Harry Pearce Just in case highlighting doesn't show up on the libmesh users archive, the highlighted code is below: #include <fstream> #include "libmesh.h" #include "mesh.h" #include "libmesh_config.h" //#include "mesh_generation.h" // #include "exodusII_io.h" #include "eigen_system.h" #include "equation_systems.h" // #include "fe.h" // #include "quadrature_gauss.h" // #include "dense_matrix.h" // #include "sparse_matrix.h" // #include "numeric_vector.h" // #include "dof_map.h" #include "libmesh_nullptr.h" #include <string.h> // #include "parallel_algebra.h" //#include "parallel.h" //#include <auto_ptr.h> using namespace libMesh; char prefix[80]; void assemble_mass(EquationSystems& es, const std::string& system_name); int main (int argc, char** argv) { LibMeshInit init (argc, argv); #ifndef LIBMESH_HAVE_SLEPC if (libMesh::processor_id() == 0) std::cerr << "ERROR: This example requires libMesh to be\n" << "compiled with SLEPc eigen solvers support!" << std::endl; return 0; #else #ifdef LIBMESH_DEFAULT_SINGLE_PRECISION libmesh_example_assert(false, "--disable-singleprecision"); #endif if (argc < 3) { if (libMesh::processor_id() == 0) std::cerr << "\nUsage: " << argv[0] << " -n <number of eigen values>" << std::endl; libmesh_error(); } else { std::cout << "Running " << argv[0]; for (int i=1; i<argc; i++) std::cout << " " << argv[i]; std::cout << std::endl << std::endl; } const unsigned int nev = std::atoi(argv[2]); // libmesh_example_assert(3 <= LIBMESH_DIM, "2D support"); Mesh mesh; MeshTools::Generation::build_cube (mesh, 10, 10, 10, -1., 1., -1., 1., -1., 1., HEX27); mesh.print_info(); char xyzfilename[80]; strcpy(prefix,argv[3]); strcpy(xyzfilename,argv[3]); strcat(xyzfilename,".xyz"); std::cout << "Writing nodal xyz coordinates to file: " << xyzfilename << std::endl; std::ofstream xyzfile; xyzfile.open (xyzfilename); MeshBase::const_node_iterator node_it = mesh.nodes_begin(); const MeshBase::const_node_iterator node_end = mesh.nodes_end(); xyzfile << "Number of nodes: " << mesh.n_nodes() << "\n"; for (; node_it != node_end; ++node_it) { //count++; const Point& p = **node_it; const Real px = p(0); const Real py = p(1); xyzfile << px << " " << py << " \n"; } xyzfile.close(); std::cout << "Finished writing nodal xyz coordinates to file: " << xyzfilename << std::endl; EquationSystems equation_systems (mesh); EigenSystem & eigen_system = equation_systems.add_system<EigenSystem> ("Eigensystem"); eigen_system.add_variable("u", SECOND); eigen_system.attach_assemble_function (assemble_mass); equation_systems.parameters.set<unsigned int>("eigenpairs") = nev; equation_systems.parameters.set<unsigned int>("basis vectors") = nev*3; eigen_system.eigen_solver->set_eigensolver_type(KRYLOVSCHUR); // eigen_system.eigen_solver->set_eigensolver_type(LAPACK); eigen_system.eigen_solver->set_position_of_spectrum(SMALLEST_REAL); equation_systems.parameters.set<Real>("linear solver tolerance") = pow(TOLERANCE, 5./3.); equation_systems.parameters.set<unsigned int> ("linear solver maximum iterations") = 1000; eigen_system.set_eigenproblem_type(GHEP); equation_systems.init(); equation_systems.print_info(); eigen_system.solve(); unsigned int nconv = eigen_system.get_n_converged(); std::cout << "Number of converged eigenpairs: " << nconv << "\n" << std::endl; if (nconv != 0) { eigen_system.get_eigenpair(nconv-1); #ifdef LIBMESH_HAVE_EXODUS_API ExodusII_IO (mesh).write_equation_systems ("out.e", equation_systems); #endif // #ifdef LIBMESH_HAVE_EXODUS_API } else { std::cout << "WARNING: Solver did not converge!\n" << nconv << std::endl; } #endif // LIBMESH_HAVE_SLEPC return 0; } void assemble_mass(EquationSystems& es, const std::string& system_name) { char potfilename[80]; strcpy(potfilename,prefix); strcat(potfilename,".pot.out"); std::fstream potfile; potfile.open(potfilename, std::ios::out); if(!potfile) {std::cerr << "Error opening PES output file."; return;} libmesh_assert (system_name == "Eigensystem"); #ifdef LIBMESH_HAVE_SLEPC const MeshBase& mesh = es.get_mesh(); const unsigned int dim = mesh.mesh_dimension(); EigenSystem & eigen_system = es.get_system<EigenSystem> (system_name); FEType fe_type = eigen_system.get_dof_map().variable_type(0); SparseMatrix<Number>& matrix_A = *eigen_system.matrix_A; SparseMatrix<Number>& matrix_B = *eigen_system.matrix_B; AutoPtr<FEBase> fe (FEBase::build(dim, fe_type)); QGauss qrule (dim, fe_type.default_quadrature_order()); fe->attach_quadrature_rule (&qrule); const std::vector<Real>& JxW = fe->get_JxW(); const std::vector<Point>& q_point = fe->get_xyz(); const std::vector<std::vector<Real> >& phi = fe->get_phi(); const std::vector<std::vector<RealGradient> >& dphi = fe->get_dphi(); const DofMap& dof_map = eigen_system.get_dof_map(); DenseMatrix<Number> Me; DenseMatrix<Number> Ke; std::vector<unsigned int> dof_indices; MeshBase::const_element_iterator el = mesh.active_local_elements_begin(); const MeshBase::const_element_iterator end_el = mesh.active_local_elements_end(); std::cout << "Writing PES data to file: " << potfilename << std::endl; double V, gxx, gxy, gyy, gzx, gzy, gzz; for ( ; el != end_el; ++el) { const Elem* elem = *el; dof_map.dof_indices (elem, dof_indices); fe->reinit (elem); Ke.resize (dof_indices.size(), dof_indices.size()); Me.resize (dof_indices.size(), dof_indices.size()); for (unsigned int qp=0; qp<qrule.n_points(); qp++) { const double x = q_point[qp](0); const double y = q_point[qp](1); const double z = q_point[qp](2); /* Doub potpoint(ndim); potpoint[0] = x; potpoint[1] = y; potpoint[2] = z; */ V=x*x + y*y + z*z; gxx=0.10; gyy=1.20; gxy=1.10; gzx=0.003; gzy=0.40; gzz=0.50; potfile << x << '\t' << y << '\t' << z << '\t' << V << '\t' << "\n"; /* const Elem* elem = *el; dof_map.dof_indices (elem, dof_indices); fe->reinit (elem); Ke.resize (dof_indices.size(), dof_indices.size()); Me.resize (dof_indices.size(), dof_indices.size()); */ // for (unsigned int qp=0; qp<qrule.n_points(); qp++) for (unsigned int i=0; i<phi.size(); i++) for (unsigned int j=0; j<phi.size(); j++) { Ke(i,j) += JxW[qp]*( 0.5*( gxx*dphi[i][qp](0)*dphi[j][qp](0) + gyy*dphi[i][qp](1)*dphi[j][qp](1) + gzz*dphi[i][qp](2)*dphi[j][qp](2) + gxy*dphi[i][qp](0)*dphi[j][qp](1) + gxy*dphi[i][qp](1)*dphi[j][qp](0) + gzx*dphi[i][qp](0)*dphi[j][qp](2) + gzx*dphi[i][qp](2)*dphi[j][qp](0) + gzy*dphi[i][qp](1)*dphi[j][qp](2) + gzy*dphi[i][qp](2)*dphi[j][qp](1) // + dgxxdx*dphi[i][qp](0) // + dgyydy*dphi[i][qp](1) // + dgzzdz*dphi[i][qp](2) // + dgxydx*dphi[i][qp](1) // + dgxydy*dphi[i][qp](0) // + dgxzdx*dphi[i][qp](2) // + dgzxdz*dphi[i][qp](0) // + dgyzdy*dphi[i][qp](2) // + dgzydz*dphi[i][qp](1) )*33.71526 + V*phi[i][qp]*phi[j][qp]); Me(i,j) += JxW[qp]*phi[i][qp]*phi[j][qp]; } matrix_A.add_matrix (Ke, dof_indices); matrix_B.add_matrix (Me, dof_indices); } } // end of element loop std::cout << "Finished writing PES data to file: " << potfilename << std::endl; potfile.close(); std::cout << "Matrix A assembly completed! " << "\n" << std::endl; std::cout << "Matrix B assembly completed! " << "\n" << std::endl; std::cout << "Exporting Matrix A in matlab sparse matrix format... " << "\n" << std::endl; char buf1[14]; sprintf (buf1, "A.m"); matrix_A.print_matlab(buf1); std::cout << "Matrix A Exported! " << "\n" << std::endl; // matrix_A.clear(); std::cout << "Matrix A Cleared from Memory! " << "\n" << std::endl; std::cout << "Exporting Matrix B in matlab sparse matrix format... " << "\n" << std::endl; char buf2[14]; sprintf (buf2, "B.m"); matrix_B.print_matlab(buf2); std::cout << "Matrix B Exported! " << "\n" << std::endl; // matrix_B.clear(); std::cout << "Matrix B Cleared from Memory! " << "\n" << std::endl; #endif // LIBMESH_HAVE_SLEPC /** * All done! */ return; On Thu, Aug 4, 2016 at 5:41 PM, Mike Marchywka <marchy...@hotmail.com> wrote: > > > > > ---------------------------------------- > > Date: Thu, 4 Aug 2016 19:11:03 -0500 > > From: royst...@ices.utexas.edu > > To: marchy...@hotmail.com > > CC: libmesh-users@lists.sourceforge.net > > Subject: Re: [Libmesh-users] FW: libmesh problem: libmesh_nullptr was > not declared in scope > > > > > > > > On Thu, 4 Aug 2016, Mike Marchywka wrote: > > > >>> I have not followed the exchange but sometimes I end up including > headers within a namespace or > >>> something. Is libmesh being included within something? Not sure what > that does with some > >>> macros and others not lol. > > > > That was my first guess, too! That's actually why I was asking about > > the config macros - if he was in the nullptr-workaround case, then > > accidentally including a libMesh header within a namespace would have > > exactly the effect seen: the class we define wouldn't exist in the > > global namespace and the compiler wouldn't recognize it. > > I skimmed most of the messages and it did sound like it would be something > easy to find by looking at the exact code so I was a bit surprised with > that last post :) > > For problems in unfamiliar code grep can be amazingly > useful even if you expect 1000's of hits they usually end up being easy to > sort out. > > The linking is a bit unorthodox, indeed I think you had some specific > recommendations for linking to libmesh that hid most of the details, but > actually building it and compiling with it were pretty easy. I turned on > some debug info > from the example make script, just copied its invokation of g++ and libtool > and that seems to work for some simple case. > > > > > > --- > > Roy > > ------------------------------------------------------------ > ------------------ > _______________________________________________ > Libmesh-users mailing list > Libmesh-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libmesh-users > ------------------------------------------------------------------------------ _______________________________________________ Libmesh-users mailing list Libmesh-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libmesh-users