/* nag_lapackeig_zhpgst (f08tsc) Example Program. * * Copyright 2025 Numerical Algorithms Group. * * Mark 31.1, 2025. */ #include<nag.h> #include<stdio.h> intmain(void){ /* Scalars */ Integeri,j,n,ap_len,bp_len,d_len,e_len,tau_len; Integerexit_status=0; NagErrorfail; Nag_UploTypeuplo; Nag_OrderTypeorder; /* Arrays */ charnag_enum_arg[40]; Complex*ap=0,*bp=0,*tau=0; double*d=0,*e=0; #ifdef NAG_COLUMN_MAJOR #define A_UPPER(I, J) ap[J * (J - 1) / 2 + I - 1] #define A_LOWER(I, J) ap[(2 * n - J) * (J - 1) / 2 + I - 1] #define B_UPPER(I, J) bp[J * (J - 1) / 2 + I - 1] #define B_LOWER(I, J) bp[(2 * n - J) * (J - 1) / 2 + I - 1] order=Nag_ColMajor; #else #define A_LOWER(I, J) ap[I * (I - 1) / 2 + J - 1] #define A_UPPER(I, J) ap[(2 * n - I) * (I - 1) / 2 + J - 1] #define B_LOWER(I, J) bp[I * (I - 1) / 2 + J - 1] #define B_UPPER(I, J) bp[(2 * n - I) * (I - 1) / 2 + J - 1] order=Nag_RowMajor; #endif INIT_FAIL(fail); printf("nag_lapackeig_zhpgst (f08tsc) Example Program Results\n\n"); /* Skip heading in data file */ scanf("%*[^\n] "); scanf("%"NAG_IFMT"%*[^\n] ",&n); ap_len=n*(n+1)/2; bp_len=n*(n+1)/2; d_len=n; e_len=n-1; tau_len=n; /* Allocate memory */ if(!(ap=NAG_ALLOC(ap_len,Complex))|| !(bp=NAG_ALLOC(bp_len,Complex))||!(d=NAG_ALLOC(d_len,double))|| !(e=NAG_ALLOC(e_len,double))||!(tau=NAG_ALLOC(tau_len,Complex))){ printf("Allocation failure\n"); exit_status=-1; gotoEND; } /* Read A and B from data file */ scanf("%39s%*[^\n] ",nag_enum_arg); /* nag_enum_name_to_value (x04nac). * Converts NAG enum member name to value */ uplo=(Nag_UploType)nag_enum_name_to_value(nag_enum_arg); if(uplo==Nag_Upper){ for(i=1;i<=n;++i){ for(j=i;j<=n;++j){ scanf(" ( %lf , %lf )",&A_UPPER(i,j).re,&A_UPPER(i,j).im); } } scanf("%*[^\n] "); for(i=1;i<=n;++i){ for(j=i;j<=n;++j){ scanf(" ( %lf , %lf )",&B_UPPER(i,j).re,&B_UPPER(i,j).im); } } scanf("%*[^\n] "); }else{ for(i=1;i<=n;++i){ for(j=1;j<=i;++j){ scanf(" ( %lf , %lf )",&A_LOWER(i,j).re,&A_LOWER(i,j).im); } } scanf("%*[^\n] "); for(i=1;i<=n;++i){ for(j=1;j<=i;++j){ scanf(" ( %lf , %lf )",&B_LOWER(i,j).re,&B_LOWER(i,j).im); } } scanf("%*[^\n] "); } /* Compute the Cholesky factorization of B */ /* nag_lapacklin_zpptrf (f07grc). * Cholesky factorization of complex Hermitian * positive-definite matrix, packed storage */ nag_lapacklin_zpptrf(order,uplo,n,bp,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapacklin_dpptrf (f07gdc).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Reduce the problem to standard form C*y = lambda*y, storing */ /* the result in A */ /* nag_lapackeig_zhpgst (f08tsc). * Reduction to standard form of complex Hermitian-definite * generalized eigenproblem Ax = lambda Bx, ABx = lambda x * or BAx = lambda x, packed storage, B factorized by * nag_lapacklin_zpptrf (f07grc) */ nag_lapackeig_zhpgst(order,Nag_Compute_1,uplo,n,ap,bp,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapackeig_zhpgst (f08tsc).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Reduce C to tridiagonal form T = (Q^T)*C*Q */ /* nag_lapackeig_zhptrd (f08gsc). * Unitary reduction of complex Hermitian matrix to real * symmetric tridiagonal form, packed storage */ nag_lapackeig_zhptrd(order,uplo,n,ap,d,e,tau,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapackeig_zhptrd (f08gsc).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Calculate the eigenvalues of T (same as C) */ /* nag_lapackeig_dsterf (f08jfc). * All eigenvalues of real symmetric tridiagonal matrix, * root-free variant of QL or QR */ nag_lapackeig_dsterf(n,d,e,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapackeig_dsterf (f08jfc).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Print eigenvalues */ printf("Eigenvalues\n"); for(i=1;i<=n;++i) printf("%8.4f%s",d[i-1],i%9==0||i==n?"\n":" "); printf("\n"); END: NAG_FREE(ap); NAG_FREE(bp); NAG_FREE(d); NAG_FREE(e); NAG_FREE(tau); returnexit_status; }