Date: 2026-05-01T10:02:17+00:00

Actual source code: test14f.F90

      1: !
      2: !  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      3: !  SLEPc - Scalable Library for Eigenvalue Problem Computations
      4: !  Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
      5: !
      6: !  This file is part of SLEPc.
      7: !  SLEPc is distributed under a 2-clause BSD license (see LICENSE).
      8: !  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      9: !
     10: !  Program usage: mpiexec -n <np> ./test14f [-help] [-n <n>] [all SLEPc options]
     11: !
     12: !  Description: Simple example that tests solving a DSNHEP problem.
     13: !
     14: !  The command line options are:
     15: !    -n <n>, where <n> = matrix size
     16: !
     17: ! ----------------------------------------------------------------------
     18: !
     19: #include <slepc/finclude/slepcds.h>
     20: program test14f
     21:   use slepcds
     22:   implicit none

     24: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     25: ! Declarations
     26: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     28:   Mat                  :: A   ! problem matrix
     29:   DS                   :: ds  ! dense solver context
     30:   PetscInt             :: n, i, ld
     31:   PetscMPIInt          :: rank
     32:   PetscErrorCode       :: ierr
     33:   PetscBool            :: flg
     34:   PetscScalar          :: wr(100), wi(100)
     35:   PetscReal            :: re, im
     36:   PetscScalar, pointer :: aa(:, :)

     38: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     39: ! Beginning of program
     40: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     42:   PetscCallA(SlepcInitialize(PETSC_NULL_CHARACTER, ierr))
     43:   PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
     44:   n = 10
     45:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-n', n, flg, ierr))
     46:   PetscCheckA(n <= 100, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, 'Program currently limited to n=100')

     48:   if (rank == 0) then
     49:     write (*, '(/a,i3,a)') 'Solve a Dense System of type NHEP, n =', n, ' (Fortran)'
     50:   end if

     52: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     53: ! Create DS object
     54: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     56:   PetscCallA(DSCreate(PETSC_COMM_WORLD, ds, ierr))
     57:   PetscCallA(DSSetType(ds, DSNHEP, ierr))
     58:   PetscCallA(DSSetFromOptions(ds, ierr))
     59:   ld = n
     60:   PetscCallA(DSAllocate(ds, ld, ierr))
     61:   PetscCallA(DSSetDimensions(ds, n, 0_PETSC_INT_KIND, 0_PETSC_INT_KIND, ierr))

     63: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     64: ! Fill with Grcar matrix
     65: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     67:   PetscCallA(DSGetMat(ds, DS_MAT_A, A, ierr))
     68:   PetscCallA(MatDenseGetArray(A, aa, ierr))
     69:   call FillUpMatrix(n, aa)
     70:   PetscCallA(MatDenseRestoreArray(A, aa, ierr))
     71:   PetscCallA(DSRestoreMat(ds, DS_MAT_A, A, ierr))
     72:   PetscCallA(DSSetState(ds, DS_STATE_INTERMEDIATE, ierr))

     74: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     75: ! Solve the problem and show eigenvalues
     76: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     78:   PetscCallA(DSSolve(ds, wr, wi, ierr))
     79: ! PetscCallA(DSSort(ds,wr,wi,PETSC_NULL_SCALAR,PETSC_NULL_SCALAR,PETSC_NULL_INTEGER,ierr))

     81:   if (rank == 0) then
     82:     write (*, *) 'Computed eigenvalues ='
     83:     do i = 1, n
     84: #if defined(PETSC_USE_COMPLEX)
     85:       re = PetscRealPart(wr(i))
     86:       im = PetscImaginaryPart(wr(i))
     87: #else
     88:       re = wr(i)
     89:       im = wi(i)
     90: #endif
     91:       if (abs(im) < 1.d-10) then
     92:         write (*, '(a,f8.5)') '  ', re
     93:       else
     94:         write (*, '(a,f8.5,sp,f8.5,a)') '  ', re, im, 'i'
     95:       end if
     96:     end do
     97:   end if

     99: ! *** Clean up
    100:   PetscCallA(DSDestroy(ds, ierr))
    101:   PetscCallA(SlepcFinalize(ierr))

    103: contains

    105:   subroutine FillUpMatrix(n, X)
    106:     PetscInt    :: n, i, j
    107:     PetscScalar :: X(n, n)

    109:     do i = 2, n
    110:       X(i, i - 1) = -1.d0
    111:     end do
    112:     do j = 0, 3
    113:       do i = 1, n - j
    114:         X(i, i + j) = 1.d0
    115:       end do
    116:     end do

    118:   end

    120: end program test14f

    122: !/*TEST
    123: !
    124: !   test:
    125: !      suffix: 1
    126: !      requires: !complex
    127: !
    128: !TEST*/