Date: 2026-03-09T09:12:04+00:00

Actual source code: test3.c

      1: /*
      2:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      3:    SLEPc - Scalable Library for Eigenvalue Problem Computations
      4:    Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain

      6:    This file is part of SLEPc.
      7:    SLEPc is distributed under a 2-clause BSD license (see LICENSE).
      8:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      9: */

     11: static char help[] = "Test SVD with user-provided initial vectors.\n\n"
     12:   "The command line options are:\n"
     13:   "  -n <n>, where <n> = row dimension.\n"
     14:   "  -m <m>, where <m> = column dimension.\n\n";

     16: #include <slepcsvd.h>

     18: /*
     19:    This example computes the singular values of a rectangular nxm Grcar matrix:

     21:               |  1  1  1  1               |
     22:               | -1  1  1  1  1            |
     23:               |    -1  1  1  1  1         |
     24:           A = |       .  .  .  .  .       |
     25:               |          .  .  .  .  .    |
     26:               |            -1  1  1  1  1 |
     27:               |               -1  1  1  1 |

     29:  */

     31: int main(int argc,char **argv)
     32: {
     33:   Mat            A;               /* Grcar matrix */
     34:   SVD            svd;             /* singular value solver context */
     35:   Vec            v0,w0;           /* initial vectors */
     36:   Vec            *U,*V;
     37:   PetscInt       N=35,M=30,Istart,Iend,i,col[5],nconv;
     38:   PetscScalar    value[] = { -1, 1, 1, 1, 1 };
     39:   PetscReal      lev1=0.0,lev2=0.0,tol=PETSC_SMALL;
     40:   PetscBool      skiporth=PETSC_FALSE;

     42:   PetscFunctionBeginUser;
     43:   PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
     44:   PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&N,NULL));
     45:   PetscCall(PetscOptionsGetInt(NULL,NULL,"-m",&M,NULL));
     46:   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nSVD of a rectangular Grcar matrix, %" PetscInt_FMT "x%" PetscInt_FMT "\n\n",N,M));
     47:   PetscCall(PetscOptionsGetBool(NULL,NULL,"-skiporth",&skiporth,NULL));

     49:   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     50:         Generate the matrix
     51:      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

     53:   PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
     54:   PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,M));
     55:   PetscCall(MatSetFromOptions(A));

     57:   PetscCall(MatGetOwnershipRange(A,&Istart,&Iend));
     58:   for (i=Istart;i<Iend;i++) {
     59:     col[0]=i-1; col[1]=i; col[2]=i+1; col[3]=i+2; col[4]=i+3;
     60:     if (i==0) PetscCall(MatSetValues(A,1,&i,PetscMin(4,M-i+1),col+1,value+1,INSERT_VALUES));
     61:     else PetscCall(MatSetValues(A,1,&i,PetscMin(5,M-i+1),col,value,INSERT_VALUES));
     62:   }
     63:   PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
     64:   PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));

     66:   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     67:              Create the SVD context and solve the problem
     68:      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

     70:   PetscCall(SVDCreate(PETSC_COMM_WORLD,&svd));
     71:   PetscCall(SVDSetOperators(svd,A,NULL));
     72:   PetscCall(SVDSetFromOptions(svd));

     74:   /*
     75:      Set the initial vectors. This is optional, if not done the initial
     76:      vectors are set to random values
     77:   */
     78:   PetscCall(MatCreateVecs(A,&v0,&w0));
     79:   PetscCall(VecSet(v0,1.0));
     80:   PetscCall(VecSet(w0,1.0));
     81:   PetscCall(SVDSetInitialSpaces(svd,1,&v0,1,&w0));

     83:   /*
     84:      Compute solution
     85:   */
     86:   PetscCall(SVDSolve(svd));
     87:   PetscCall(SVDErrorView(svd,SVD_ERROR_RELATIVE,NULL));

     89:   /*
     90:      Check orthonormality of computed singular vectors
     91:   */
     92:   PetscCall(SVDGetConverged(svd,&nconv));
     93:   if (nconv>1) {
     94:     PetscCall(VecDuplicateVecs(w0,nconv,&U));
     95:     PetscCall(VecDuplicateVecs(v0,nconv,&V));
     96:     for (i=0;i<nconv;i++) PetscCall(SVDGetSingularTriplet(svd,i,NULL,U[i],V[i]));
     97:     if (!skiporth) {
     98:       PetscCall(VecCheckOrthonormality(U,nconv,NULL,nconv,NULL,NULL,&lev1));
     99:       PetscCall(VecCheckOrthonormality(V,nconv,NULL,nconv,NULL,NULL,&lev2));
    100:     }
    101:     if (lev1+lev2<20*tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Level of orthogonality below the tolerance\n"));
    102:     else PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Level of orthogonality: %g (U) %g (V)\n",(double)lev1,(double)lev2));
    103:     PetscCall(VecDestroyVecs(nconv,&U));
    104:     PetscCall(VecDestroyVecs(nconv,&V));
    105:   }

    107:   /*
    108:      Free work space
    109:   */
    110:   PetscCall(VecDestroy(&v0));
    111:   PetscCall(VecDestroy(&w0));
    112:   PetscCall(SVDDestroy(&svd));
    113:   PetscCall(MatDestroy(&A));
    114:   PetscCall(SlepcFinalize());
    115:   return 0;
    116: }

    118: /*TEST

    120:    testset:
    121:       args: -svd_nsv 4
    122:       output_file: output/test3_1.out
    123:       filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/" | sed -e "s/22200/22201/"
    124:       test:
    125:          suffix: 1_lanczos
    126:          args: -svd_type lanczos
    127:       test:
    128:          suffix: 1_lanczos_one
    129:          args: -svd_type lanczos -svd_lanczos_oneside
    130:       test:
    131:          suffix: 1_trlanczos
    132:          args: -svd_type trlanczos -svd_trlanczos_locking {{0 1}}
    133:       test:
    134:          suffix: 1_trlanczos_one
    135:          args: -svd_type trlanczos -svd_trlanczos_oneside
    136:       test:
    137:          suffix: 1_trlanczos_one_mgs
    138:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
    139:       test:
    140:          suffix: 1_trlanczos_one_always
    141:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
    142:       test:
    143:          suffix: 1_cross
    144:          args: -svd_type cross
    145:       test:
    146:          suffix: 1_cross_exp
    147:          args: -svd_type cross -svd_cross_explicitmatrix
    148:       test:
    149:          suffix: 1_cyclic
    150:          args: -svd_type cyclic
    151:          requires: !__float128
    152:       test:
    153:          suffix: 1_cyclic_exp
    154:          args: -svd_type cyclic -svd_cyclic_explicitmatrix
    155:          requires: !__float128
    156:       test:
    157:          suffix: 1_lapack
    158:          args: -svd_type lapack
    159:       test:
    160:          suffix: 1_randomized
    161:          args: -svd_type randomized
    162:       test:
    163:          suffix: 1_primme
    164:          args: -svd_type primme
    165:          requires: primme

    167:    testset:
    168:       args: -svd_implicittranspose -svd_nsv 4 -svd_tol 1e-5
    169:       output_file: output/test3_1.out
    170:       filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/" | sed -e "s/22200/22201/"
    171:       test:
    172:          suffix: 2_lanczos
    173:          args: -svd_type lanczos -svd_conv_norm
    174:       test:
    175:          suffix: 2_lanczos_one
    176:          args: -svd_type lanczos -svd_lanczos_oneside
    177:       test:
    178:          suffix: 2_trlanczos
    179:          args: -svd_type trlanczos
    180:       test:
    181:          suffix: 2_trlanczos_one
    182:          args: -svd_type trlanczos -svd_trlanczos_oneside
    183:       test:
    184:          suffix: 2_trlanczos_one_mgs
    185:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
    186:       test:
    187:          suffix: 2_trlanczos_one_always
    188:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
    189:       test:
    190:          suffix: 2_cross
    191:          args: -svd_type cross
    192:       test:
    193:          suffix: 2_cross_exp
    194:          args: -svd_type cross -svd_cross_explicitmatrix
    195:          requires: !complex
    196:       test:
    197:          suffix: 2_cyclic
    198:          args: -svd_type cyclic -svd_tol 1e-9
    199:          requires: double
    200:       test:
    201:          suffix: 2_lapack
    202:          args: -svd_type lapack
    203:       test:
    204:          suffix: 2_randomized
    205:          args: -svd_type randomized

    207:    testset:
    208:       args: -svd_nsv 4 -mat_type aijcusparse
    209:       requires: cuda
    210:       output_file: output/test3_1.out
    211:       filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/"
    212:       test:
    213:          suffix: 3_cuda_lanczos
    214:          args: -svd_type lanczos
    215:       test:
    216:          suffix: 3_cuda_lanczos_one
    217:          args: -svd_type lanczos -svd_lanczos_oneside
    218:       test:
    219:          suffix: 3_cuda_trlanczos
    220:          args: -svd_type trlanczos
    221:       test:
    222:          suffix: 3_cuda_trlanczos_one
    223:          args: -svd_type trlanczos -svd_trlanczos_oneside
    224:       test:
    225:          suffix: 3_cuda_trlanczos_one_mgs
    226:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
    227:       test:
    228:          suffix: 3_cuda_trlanczos_one_always
    229:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
    230:       test:
    231:          suffix: 3_cuda_cross
    232:          args: -svd_type cross
    233:       test:
    234:          suffix: 3_cuda_cyclic
    235:          args: -svd_type cyclic
    236:       test:
    237:          suffix: 3_cuda_cyclic_exp
    238:          args: -svd_type cyclic -svd_cyclic_explicitmatrix
    239:       test:
    240:          suffix: 3_cuda_randomized
    241:          args: -svd_type randomized

    243:    test:
    244:       suffix: 4
    245:       args: -svd_type lapack -svd_nsv 4
    246:       output_file: output/test3_1.out
    247:       filter: sed -e "s/15129/15128/" | sed -e "s/21798/21797/"
    248:       nsize: 2

    250:    test:
    251:       suffix: 5
    252:       args: -svd_nsv 4 -svd_view_values draw -svd_monitor draw::draw_lg
    253:       requires: x
    254:       output_file: output/test3_1.out

    256:    testset:
    257:       args: -svd_nsv 4 -mat_type aijhipsparse
    258:       requires: hip
    259:       output_file: output/test3_1.out
    260:       filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/"
    261:       test:
    262:          suffix: 6_hip_lanczos
    263:          args: -svd_type lanczos
    264:       test:
    265:          suffix: 6_hip_lanczos_one
    266:          args: -svd_type lanczos -svd_lanczos_oneside
    267:       test:
    268:          suffix: 6_hip_trlanczos
    269:          args: -svd_type trlanczos
    270:       test:
    271:          suffix: 6_hip_trlanczos_one
    272:          args: -svd_type trlanczos -svd_trlanczos_oneside
    273:       test:
    274:          suffix: 6_hip_trlanczos_one_mgs
    275:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
    276:       test:
    277:          suffix: 6_hip_trlanczos_one_always
    278:          args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
    279:       test:
    280:          suffix: 6_hip_cross
    281:          args: -svd_type cross
    282:       test:
    283:          suffix: 6_hip_cyclic
    284:          args: -svd_type cyclic
    285:       test:
    286:          suffix: 6_hip_cyclic_exp
    287:          args: -svd_type cyclic -svd_cyclic_explicitmatrix
    288:       test:
    289:          suffix: 6_hip_randomized
    290:          args: -svd_type randomized

    292: TEST*/