{"id":1444,"date":"2021-10-05T14:08:00","date_gmt":"2021-10-05T14:08:00","guid":{"rendered":"https:\/\/nag.com\/?post_type=insights&#038;p=1232"},"modified":"2023-07-05T13:37:23","modified_gmt":"2023-07-05T13:37:23","slug":"feast-a-new-eigensolver-for-the-nag-library","status":"publish","type":"insights","link":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/","title":{"rendered":"FEAST: A New Eigensolver for the <span class=\"nag-n-override\" style=\"margin-left: 0 !important;\"><i>n<\/i><\/span>AG Library"},"content":{"rendered":"<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-8 col-xl-6\">\n            <p>The <span class=\"nag-n-override\" style=\"margin-left: 0 !important;\"><i>n<\/i><\/span>AG Library contains a considerable array of state-of-the-art routines for solving eigenvalue problems. From the dense QR and MR<sup>3<\/sup>\u00a0algorithms of LAPACK (see Chapter\u00a0<a href=\"https:\/\/support.nag.com\/numeric\/nl\/nagdoc_latest\/flhtml\/f08\/f08conts.html\">F08<\/a>) to the ARPACK solvers for sparse eigenproblems (Chapter\u00a0<a href=\"https:\/\/www.support.com\/numeric\/nl\/nagdoc_latest\/flhtml\/f12\/f12conts.html\">F12<\/a>), we have things well covered. It might be a surprise, then, to hear about a new suite of eigensolvers, introduced at Mark 27.3.<\/p>\n<p>The\u00a0<a href=\"http:\/\/www.feast-solver.org\/\">FEAST Eigenvalue Solver<\/a>\u00a0was developed by\u00a0<a href=\"https:\/\/ece.umass.edu\/faculty\/eric-polizzi\">Professor Eric Polizzi<\/a>\u00a0of the University of Massachusetts, along with numerous collaborators. It works in a completely different way from other eigensolvers (more on this shortly) and, as a result, has some very useful properties.<\/p>\n<ul>\n<li>It searches for only those eigenvalues lying within a user-specified contour in the complex plane.<\/li>\n<li>It can be used to solve standard, generalized and polynomial eigenvalue problems.<\/li>\n<li>Solvers are available for complex, real, symmetric, Hermitian, and non-symmetric problems.<\/li>\n<li>It can be used for both large, sparse and small, dense problems.<\/li>\n<\/ul>\n<p>It is the first property above that really differentiates FEAST from other eigensolvers. This is particularly useful when applied to large, sparse eigenproblems when a subset of the spectrum is required. Solvers such as ARPACK are typically only able to find the largest\/smallest magnitude eigenvalues or a specified number of eigenvalues close to a given complex value. Only the FEAST eigensolver can search within a specific contour within which the number of eigenvalues might be unknown. We are aware of several areas in which such functionality is useful, including modelling the oscillations of railway tracks, simulation of fluid flows and electronic structure computations. (If you discover another interesting application, please let us know!)<\/p>\n<p>FEAST works by exploiting the rich mathematics of calculus in the complex plane. In particular, it relies on\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Residue_theorem\">Cauchy&#8217;s residue theorem<\/a>, which states that the integral of a function, \\(f(z)\\), around a closed contour can be found by considering poles of \\(f\\) lying within the contour. The trick, then, is to choose \\(f\\) such that its poles correspond to the required eigenvalues. The FEAST algorithm achieves this by evaluating:<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n\n<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\">\n  <mi>Q<\/mi>\n  <mo>=<\/mo>\n  <mfrac>\n    <mn>1<\/mn>\n    <mrow>\n      <mn>2<\/mn>\n      <mi>&#x03C0;<!-- \u03c0 --><\/mi>\n      <mi>i<\/mi>\n    <\/mrow>\n  <\/mfrac>\n  <msub>\n    <mo>&#x222E;<!-- \u222e --><\/mo>\n    <mi>&#x03B3;<!-- \u03b3 --><\/mi>\n  <\/msub>\n  <mo stretchy=\"false\">(<\/mo>\n  <mi>z<\/mi>\n  <mi>I<\/mi>\n  <mo>&#x2212;<!-- \u2212 --><\/mo>\n  <mi>A<\/mi>\n  <msup>\n    <mo stretchy=\"false\">)<\/mo>\n    <mrow class=\"MJX-TeXAtom-ORD\">\n      <mo>&#x2212;<!-- \u2212 --><\/mo>\n      <mn>1<\/mn>\n    <\/mrow>\n  <\/msup>\n  <mi>Y<\/mi>\n  <mo>,<\/mo>\n<\/math>\n\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-8 col-xl-6\">\n            <p>where \\(\\gamma\\) is a closed contour, \\(A\\) is the \\(n\\times n\\) matrix whose eigenvalues are sought, and \\(Y\\) is an initial guess at the eigenvector subspace. The number of columns of \\(Y\\) is typically taken to be far less than \\(n\\). This means that the matrix \\(Q\\) can then be used by FEAST to form a reduced-size eigenvalue problem for the eigenvalues within the contour.<\/p>\n<p>We will demonstrate FEAST using the Python interfaces to the <span class=\"nag-n-override\" style=\"margin-left: 0 !important;\"><i>n<\/i><\/span>AG Library. The FEAST routines themselves are found in the\u00a0<a href=\"https:\/\/support.nag.com\/numeric\/py\/nagdoc_latest\/naginterfaces.library.sparseig.html\">sparseig<\/a>\u00a0submodule. Let&#8217;s use the matrix\u00a0<a href=\"https:\/\/math.nist.gov\/MatrixMarket\/data\/NEP\/h2plus\/qc324.html\">qc324<\/a>\u00a0from the\u00a0<a href=\"https:\/\/math.nist.gov\/MatrixMarket\/\">Matrix Market<\/a>\u00a0repository. First, we will import a few modules and read in the matrix.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-10 col-xl-10\">\n            <pre><code>import numpy as np\nimport scipy.io\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimport math\nfrom naginterfaces.library import machine, sparse, sparseig\n\nA = scipy.io.mmread('qc324.mtx.gz')\n<\/code><\/pre>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-8 col-xl-6\">\n            <p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1235 size-full\" src=\"https:\/\/nag.com\/wp-content\/uploads\/2021\/10\/figure_1.png\" alt=\"Gershgorin disks\" width=\"640\" height=\"480\" \/><\/p>\n<p class=\"para-sm\"><span class=\"id\">Figure\u00a01:\u00a0<\/span><span class=\"content\">Gershgorin disks for qc324<\/span><\/p>\n<p>In many applications, something is already known about the eigenspace and where to seek eigenvalues. But an alternative approach, which we will illustrate here, is to use\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Gershgorin_circle_theorem\">Gershgorin discs<\/a>\u00a0to guide us. Each Gershgorin disc is centred on one of the diagonal entries of \\(A\\) and has a radius given by the sum of the absolute values of the off-diagonals in the corresponding row. It can be shown that each eigenvalue of \\(A\\) lies within at least one of the Gershgorin discs. Figure\u00a01\u00a0shows the Gershgorin disks for qc324. It was generated using the following code snippet.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-10 col-xl-10\">\n            <pre><code>D = A.diagonal(0)\nn = A.shape[0]\n\nfig, ax = plt.subplots()\nfor i in range(n):\n    x, y = D[i].real, D[i].imag\n    ax.add_artist( plt.Circle((x, y), sum(abs(A.getrow(i).data)) - abs(D[i]), alpha=0.5))<\/code><\/pre>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-8 col-xl-6\">\n            <p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1236 size-full\" src=\"https:\/\/nag.com\/wp-content\/uploads\/2021\/10\/figure_2.png\" alt=\"Contour Choice\" width=\"640\" height=\"480\" \/><\/p>\n<p class=\"para-sm\"><span class=\"id\">Figure\u00a02:\u00a0<\/span><span class=\"content\">Contour choice for qc324<\/span><\/p>\n<p>Let&#8217;s use FEAST to search for eigenvalues in the contour shown in Figure\u00a02, which is an ellipse centred at \\(1.4-0.1i\\), with semi-major and semi-minor axes 0.4 and 0.24 respectively (note that FEAST also allows user-defined contours made up of combinations of lines and arcs, and we have examples of these bundled with the Library). Since the Gershgorin discs are intersecting, it is possible that there are no eigenvalues within this contour \u2014 FEAST will be able to tell us if this is the case.<\/p>\n<p>There is some setup to do before calling the solver. We need to initialize a data handle, which stores data for the suite. Then we set an option determining the eccentricity of the ellipse. Finally, we call a contour setting routine.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-10 col-xl-10\">\n            <pre><code># Initialize the FEAST data handle\nhandle = sparseig.feast_init()\n\n# Use option setting routine to specify axis ratio for ellipse\nsparseig.feast_option(handle, 'Ellipse Contour Ratio = 60')\n\n# Generate contour\nsparseig.feast_gen_contour(handle, complex(1.4, -0.1), 0.4)\n<\/code><\/pre>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-8 col-xl-6\">\n            <p>We are almost ready to call a solver to find the eigenvalues. There are various solvers available, but we will use\u00a0<a href=\"https:\/\/www.support.com\/numeric\/py\/nagdoc_latest\/naginterfaces.library.sparseig.complex_symm_solve.html#naginterfaces.library.sparseig.complex_symm_solve\">feast_complex_symm_solve<\/a>, which is designed for complex symmetric matrices. The solvers use reverse communication, returning to the calling program to solve linear systems and perform matrix multiplications. So first we will declare some functions to perform these operations.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-10 col-xl-10\">\n            <pre><code>def form_matrix(ze, A):\n    \"\"\" Form the sparse matrix ze - A \"\"\"\n    n = A.shape[0]\n    az_tmp = np.concatenate((-A.data,ze*np.ones(n, dtype=np.complex128)))\n    irowz_tmp = np.concatenate((A.row+1,np.arange(1,n+1)))\n    icolz_tmp = np.concatenate((A.col+1,np.arange(1,n+1)))\n    # Sort elements into correct coordinate storage format\n    az, irowz, icolz, _ = sparse.complex_gen_sort(n, az_tmp, irowz_tmp, icolz_tmp, 'S', 'R')\n    return az, irowz, icolz\n\ndef incomplete_lu(az, irowz, icolz, n):\n    \"\"\" Form the incomplete LU factorization of a sparse matrix \"\"\"\n    nnaz = np.size(az)\n    az = np.concatenate((az, np.zeros(2*nnaz)))\n    irowz = np.concatenate((irowz, np.zeros(2*nnaz, dtype=int)))\n    icolz = np.concatenate((icolz, np.zeros(2*nnaz, dtype=int)))\n    az, irowz, icolz, ipivp, ipivq, istr, idiag, _, _\n\t\t= sparse.complex_gen_precon_ilu(nnaz, az, irowz, icolz, n, 0, 0.0, 'P', 'N')\n    return az, irowz, icolz, ipivp, ipivq, istr, idiag\n\ndef solve_lin_sys(\n        nnz_az, az, irowz, icolz, ipivp, ipivq, istr, idiag, y):\n    \"\"\" Solve a sparse linear system \"\"\"\n    n = np.size(y, 0)\n    m0 = np.size(y, 1)\n    w = np.zeros(n, dtype=np.complex128)\n    for i in range(m0):\n        w[0:n] = y[0:n, i]\n        y[0:n, i] = 1.0\n        y[0:n, i], _, _ = sparse.complex_gen_solve_ilu(\n            'RGMRES', nnz_az, az, irowz, icolz, ipivp,\n            ipivq, istr, idiag, w, 30,\n            math.sqrt(machine.precision()), 500, y[0:n, i])\n\ndef sparse_matmul(A, x, z):\n    \"\"\" Perform sparse matrix multiplication \"\"\"\n    n = np.size(x, 0)\n    m0 = np.size(x, 1)\n    for i in range(m0):\n        x[0:n, i] = sparse.complex_gen_matvec(\n            'N', A.data, A.row + 1,\n            A.col + 1, z[0:n,i], 'N')\n\n<\/code><\/pre>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-8 col-xl-6\">\n            <p>The code calling the reverse communication solver is shown below. Depending on the value of\u00a0<code>irevcm<\/code>, we need to either: form \\(ze &#8211; A\\) (where \\(ze\\) is a complex scalar returned by the solver) and factorize it; use the factorization to solve a linear system; or perform a matrix multiplication.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-10 col-xl-10\">\n            <pre><code>irevcm = 0\nze = 0.0 + 0.0j\nm0 = 30\neps = 0.0\nitera = 0\nx = np.zeros((n, m0), dtype=np.complex128)\ny = np.zeros((n, m0), dtype=np.complex128)\nz = np.zeros((n, m0), dtype=np.complex128)\nd = np.zeros(m0, dtype=np.complex128)\nresid = np.zeros(m0, dtype=np.float64)\n\n# Call the reverse communication solver\nwhile True:\n    irevcm, ze, m0, nconv, eps, itera = \\\n        sparseig.feast_complex_symm_solve(\n            handle, irevcm, ze, x,\n            y, m0, d, z, eps, itera, resid)\n\n    if irevcm == 0:\n        break\n\n    if irevcm == 1:\n        # Form the sparse matrix ze - A\n        az, irowz, icolz = form_matrix(ze, A)\n        nnz_az = np.size(az)\n        # Form incomplete LU factorization of ze - A\n        az, irowz, icolz, ipivp, ipivq, istr, idiag = \\\n            incomplete_lu(az, irowz, icolz, n)\n\n    if irevcm == 2:\n        # Solve (ze - A) y = w, with m0 righthand sides\n        solve_lin_sys(nnz_az, az, irowz, icolz, ipivp, ipivq,\n                      istr, idiag, y)\n\n    if irevcm == 3:\n        sparse_matmul(A, x, z) # Compute x &lt;- A z\n\n    if irevcm == 4:\n\t# If we were solving a generalized eigenvalue problem\n\t# then here we would compute x &lt;- Bz\n        x[:,:] = z[:,:] # Compute x &lt;- z\n<\/code><\/pre>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"container content-area-default \">\n    <div class=\"row justify-content--center\">\n        <div class=\"col-12 col-md-10 col-lg-8 col-xl-6\">\n            <p>The eigenvalues that FEAST found within the contour are shown in Figure\u00a03.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1237 size-full\" src=\"https:\/\/nag.com\/wp-content\/uploads\/2021\/10\/figure_3.png\" alt=\"Eigen_values\" width=\"640\" height=\"480\" \/><\/p>\n<p class=\"para-sm\"><span class=\"id\">Figure\u00a03:\u00a0<\/span><span class=\"content\">Eigenvalues of qc324<\/span><\/p>\n<div class=\"field field--name-field-paragraph-text field--type-text-long field--label-hidden field--item\">\n<div class=\"tex2jax_process\">\n<p>FEAST is a highly versatile algorithm, with many additional options and capabilities we didn&#8217;t have space to show in this blog (but which are fully documented online). It is available from Mark 27.3 of the\u00a0<a href=\"https:\/\/www.support.com\/numeric\/py\/nagdoc_latest\/naginterfaces.library.sparseig.html\"><span class=\"nag-n-override\" style=\"margin-left: 0 !important;\"><i>n<\/i><\/span>AG Library for Python<\/a>\u00a0and also in Chapter F12 in the\u00a0<a href=\"https:\/\/www.support.com\/numeric\/nl\/nagdoc_latest\/clhtml\/f12\/f12conts.html\">C interfaces<\/a>\u00a0and\u00a0<a href=\"https:\/\/www.support.com\/numeric\/nl\/nagdoc_latest\/flhtml\/f12\/f12conts.html\">Fortran interfaces<\/a>. <\/p>\n<\/div>\n<\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n\n<div class=\"gbc-title-banner tac tac-lg tac-xl\" style='border-radius: 0px; '>\n    <div class=\"container\" style='border-radius: 0px; '>\n        <div class=\"row justify-content--center\" >\n            <div class=\"col-12\"  >\n                <div class=\"wrap pv-4 \" style=\"0pxbackground-color: \">\n                                <div class=\"col-12 col-md-12 col-lg-12 col-xl-12  banner-content\"  >\n    \n                    \n                    <div class=\"mt-1 mb-1 content\"><\/div>\n\n                    \n                    <a href='' style='background-color: #ff7d21ff; color: #ffffffff; border-radius: 30px; font-weight: 600; ' class='btn mr-1  ' >Try the <span class=\"nag-n-override\" style=\"margin-left: 0 !important;\"><i>n<\/i><\/span>AG\u00ae Library <i class='fas fa-angle-right'><\/i><\/a>                <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The <span class=\"nag-n-override\" style=\"margin-left: 0 !important;\"><i>n<\/i><\/span>AG Library contains a considerable array of state-of-the-art routines for solving eigenvalue problems. From the dense QR and MR3 algorithms of LAPACK to the ARPACK solvers for sparse eigenproblems, we have things well covered. <\/p>\n","protected":false},"author":4,"featured_media":828,"parent":0,"menu_order":0,"template":"","meta":{"content-type":"","footnotes":""},"post-tag":[38,27],"class_list":["post-1444","insights","type-insights","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>FEAST: A New Eigensolver for the NAG Library - nAG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FEAST: A New Eigensolver for the NAG Library - nAG\" \/>\n<meta property=\"og:description\" content=\"The NAG Library contains a considerable array of state-of-the-art routines for solving eigenvalue problems. From the dense QR and MR3 algorithms of LAPACK to the ARPACK solvers for sparse eigenproblems, we have things well covered.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/\" \/>\n<meta property=\"og:site_name\" content=\"nAG\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-05T13:37:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1570\" \/>\n\t<meta property=\"og:image:height\" content=\"988\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@NAGTalk\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/\",\"url\":\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/\",\"name\":\"FEAST: A New Eigensolver for the NAG Library - nAG\",\"isPartOf\":{\"@id\":\"https:\/\/nag.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg\",\"datePublished\":\"2021-10-05T14:08:00+00:00\",\"dateModified\":\"2023-07-05T13:37:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#primaryimage\",\"url\":\"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg\",\"contentUrl\":\"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg\",\"width\":1570,\"height\":988},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/nag.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Insights\",\"item\":\"https:\/\/nag.com\/insights\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"FEAST: A New Eigensolver for the NAG Library\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nag.com\/#website\",\"url\":\"https:\/\/nag.com\/\",\"name\":\"NAG\",\"description\":\"Robust, trusted numerical software and computational expertise.\",\"publisher\":{\"@id\":\"https:\/\/nag.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nag.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nag.com\/#organization\",\"name\":\"Numerical Algorithms Group\",\"alternateName\":\"NAG\",\"url\":\"https:\/\/nag.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nag.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nag.com\/wp-content\/uploads\/2023\/11\/NAG-Logo.png\",\"contentUrl\":\"https:\/\/nag.com\/wp-content\/uploads\/2023\/11\/NAG-Logo.png\",\"width\":1244,\"height\":397,\"caption\":\"Numerical Algorithms Group\"},\"image\":{\"@id\":\"https:\/\/nag.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/NAGTalk\",\"https:\/\/www.linkedin.com\/company\/nag\/\",\"https:\/\/www.youtube.com\/user\/NumericalAlgorithms\",\"https:\/\/github.com\/numericalalgorithmsgroup\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"FEAST: A New Eigensolver for the NAG Library - nAG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/","og_locale":"en_US","og_type":"article","og_title":"FEAST: A New Eigensolver for the NAG Library - nAG","og_description":"The NAG Library contains a considerable array of state-of-the-art routines for solving eigenvalue problems. From the dense QR and MR3 algorithms of LAPACK to the ARPACK solvers for sparse eigenproblems, we have things well covered.","og_url":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/","og_site_name":"nAG","article_modified_time":"2023-07-05T13:37:23+00:00","og_image":[{"width":1570,"height":988,"url":"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@NAGTalk","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/","url":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/","name":"FEAST: A New Eigensolver for the NAG Library - nAG","isPartOf":{"@id":"https:\/\/nag.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#primaryimage"},"image":{"@id":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#primaryimage"},"thumbnailUrl":"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg","datePublished":"2021-10-05T14:08:00+00:00","dateModified":"2023-07-05T13:37:23+00:00","breadcrumb":{"@id":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#primaryimage","url":"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg","contentUrl":"https:\/\/nag.com\/wp-content\/uploads\/2023\/05\/NAG-Library-1.jpg","width":1570,"height":988},{"@type":"BreadcrumbList","@id":"https:\/\/nag.com\/insights\/feast-a-new-eigensolver-for-the-nag-library\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nag.com\/"},{"@type":"ListItem","position":2,"name":"Insights","item":"https:\/\/nag.com\/insights\/"},{"@type":"ListItem","position":3,"name":"FEAST: A New Eigensolver for the NAG Library"}]},{"@type":"WebSite","@id":"https:\/\/nag.com\/#website","url":"https:\/\/nag.com\/","name":"NAG","description":"Robust, trusted numerical software and computational expertise.","publisher":{"@id":"https:\/\/nag.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nag.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nag.com\/#organization","name":"Numerical Algorithms Group","alternateName":"NAG","url":"https:\/\/nag.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nag.com\/#\/schema\/logo\/image\/","url":"https:\/\/nag.com\/wp-content\/uploads\/2023\/11\/NAG-Logo.png","contentUrl":"https:\/\/nag.com\/wp-content\/uploads\/2023\/11\/NAG-Logo.png","width":1244,"height":397,"caption":"Numerical Algorithms Group"},"image":{"@id":"https:\/\/nag.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/NAGTalk","https:\/\/www.linkedin.com\/company\/nag\/","https:\/\/www.youtube.com\/user\/NumericalAlgorithms","https:\/\/github.com\/numericalalgorithmsgroup"]}]}},"_links":{"self":[{"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/insights\/1444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/insights"}],"about":[{"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/types\/insights"}],"author":[{"embeddable":true,"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/users\/4"}],"version-history":[{"count":3,"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/insights\/1444\/revisions"}],"predecessor-version":[{"id":3081,"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/insights\/1444\/revisions\/3081"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/media\/828"}],"wp:attachment":[{"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/media?parent=1444"}],"wp:term":[{"taxonomy":"post-tag","embeddable":true,"href":"https:\/\/nag.com\/wp-json\/wp\/v2\/post-tag?post=1444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}