/* nag_lapackeig_dsygst (f08sec) Example Program. * * Copyright 2025 Numerical Algorithms Group. * * Mark 31.1, 2025. */ #include<nag.h> #include<stdio.h> intmain(void){ /* Scalars */ Integeri,j,n,pda,pdb,d_len,e_len,tau_len; Integerexit_status=0; NagErrorfail; Nag_UploTypeuplo; Nag_OrderTypeorder; /* Arrays */ charnag_enum_arg[40]; double*a=0,*b=0,*d=0,*e=0,*tau=0; #ifdef NAG_COLUMN_MAJOR #define A(I, J) a[(J - 1) * pda + I - 1] #define B(I, J) b[(J - 1) * pdb + I - 1] order=Nag_ColMajor; #else #define A(I, J) a[(I - 1) * pda + J - 1] #define B(I, J) b[(I - 1) * pdb + J - 1] order=Nag_RowMajor; #endif INIT_FAIL(fail); printf("nag_lapackeig_dsygst (f08sec) Example Program Results\n\n"); /* Skip heading in data file */ scanf("%*[^\n] "); scanf("%"NAG_IFMT"%*[^\n] ",&n); #ifdef NAG_COLUMN_MAJOR pda=n; pdb=n; #else pda=n; pdb=n; #endif d_len=n; e_len=n-1; tau_len=n-1; /* Allocate memory */ if(!(a=NAG_ALLOC(n*n,double))||!(b=NAG_ALLOC(n*n,double))|| !(d=NAG_ALLOC(d_len,double))||!(e=NAG_ALLOC(e_len,double))|| !(tau=NAG_ALLOC(tau_len,double))){ 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",&A(i,j)); } scanf("%*[^\n] "); for(i=1;i<=n;++i){ for(j=i;j<=n;++j) scanf("%lf",&B(i,j)); } scanf("%*[^\n] "); }else{ for(i=1;i<=n;++i){ for(j=1;j<=i;++j) scanf("%lf",&A(i,j)); } scanf("%*[^\n] "); for(i=1;i<=n;++i){ for(j=1;j<=i;++j) scanf("%lf",&B(i,j)); } scanf("%*[^\n] "); } /* Compute the Cholesky factorization of B */ /* nag_lapacklin_dpotrf (f07fdc). * Cholesky factorization of real symmetric * positive-definite matrix */ nag_lapacklin_dpotrf(order,uplo,n,b,pdb,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapacklin_dpotrf (f07fdc).\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_dsygst (f08sec). * Reduction to standard form of real symmetric-definite * generalized eigenproblem Ax = lambda Bx, ABx = lambda x * or BAx = lambda x, B factorized by nag_lapacklin_dpotrf (f07fdc) */ nag_lapackeig_dsygst(order,Nag_Compute_1,uplo,n,a,pda,b,pdb,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapackeig_dsygst (f08sec).\n%s\n",fail.message); exit_status=1; gotoEND; } /* Reduce C to tridiagonal form T = (Q^T)*C*Q */ /* nag_lapackeig_dsytrd (f08fec). * Orthogonal reduction of real symmetric matrix to * symmetric tridiagonal form */ nag_lapackeig_dsytrd(order,uplo,n,a,pda,d,e,tau,&fail); if(fail.code!=NE_NOERROR){ printf("Error from nag_lapackeig_dsytrd (f08fec).\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?"\n":" "); printf("\n"); END: NAG_FREE(a); NAG_FREE(b); NAG_FREE(d); NAG_FREE(e); NAG_FREE(tau); returnexit_status; }