Date: 2020-01-13T11:58:46+00:00

Actual source code: slepcutil.c
slepc-3.12.2 2020-01-13
Report Typos and Errors

      1: /*
      2:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      3:    SLEPc - Scalable Library for Eigenvalue Problem Computations
      4:    Copyright (c) 2002-2019, 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: #include <slepc/private/slepcimpl.h>            /*I "slepcsys.h" I*/

     13: /*@C
     14:    SlepcConvMonitorCreate - Creates a SlepcConvMonitor context.

     16:    Collective on viewer

     18:    Input Parameters:
     19: +  viewer - the viewer where the monitor must send data
     20: -  format - the format

     22:    Output Parameter:
     23: .  ctx - the created context

     25:    Notes:
     26:    The created context is used for EPS, SVD, PEP, and NEP monitor functions that just
     27:    print the iteration numbers at which convergence takes place (XXXMonitorConverged).

     29:    This function increases the reference count of the viewer so you can destroy the
     30:    viewer object after this call.

     32:    Level: developer

     34: .seealso: SlepcConvMonitorDestroy()
     35: @*/
     36: PetscErrorCode SlepcConvMonitorCreate(PetscViewer viewer,PetscViewerFormat format,SlepcConvMonitor *ctx)
     37: {

     41:   PetscObjectReference((PetscObject)viewer);
     42:   PetscNew(ctx);
     43:   (*ctx)->viewer = viewer;
     44:   (*ctx)->format = format;
     45:   return(0);
     46: }

     48: /*@C
     49:    SlepcConvMonitorDestroy - Destroys a SlepcConvMonitor context.

     51:    Collective

     53:    Input Parameters:
     54: .  ctx - the SlepcConvMonitor context to be destroyed.

     56:    Level: developer

     58: .seealso: SlepcConvMonitorCreate()
     59: @*/
     60: PetscErrorCode SlepcConvMonitorDestroy(SlepcConvMonitor *ctx)
     61: {

     65:   if (!*ctx) return(0);
     66:   PetscViewerDestroy(&(*ctx)->viewer);
     67:   PetscFree(*ctx);
     68:   return(0);
     69: }

     71: /*
     72:    Given n vectors in V, this function gets references of them into W.
     73:    If m<0 then some previous non-processed vectors remain in W and must be freed.
     74:  */
     75: PetscErrorCode SlepcBasisReference_Private(PetscInt n,Vec *V,PetscInt *m,Vec **W)
     76: {
     78:   PetscInt       i;

     81:   for (i=0;i<n;i++) {
     82:     PetscObjectReference((PetscObject)V[i]);
     83:   }
     84:   SlepcBasisDestroy_Private(m,W);
     85:   if (n>0) {
     86:     PetscMalloc1(n,W);
     87:     for (i=0;i<n;i++) (*W)[i] = V[i];
     88:     *m = -n;
     89:   }
     90:   return(0);
     91: }

     93: /*
     94:    Destroys a set of vectors.
     95:    A negative value of m indicates that W contains vectors to be destroyed.
     96:  */
     97: PetscErrorCode SlepcBasisDestroy_Private(PetscInt *m,Vec **W)
     98: {
    100:   PetscInt       i;

    103:   if (*m<0) {
    104:     for (i=0;i<-(*m);i++) {
    105:       VecDestroy(&(*W)[i]);
    106:     }
    107:     PetscFree(*W);
    108:   }
    109:   *m = 0;
    110:   return(0);
    111: }

    113: /*@C
    114:    SlepcSNPrintfScalar - Prints a PetscScalar variable to a string of
    115:    given length.

    117:    Not Collective

    119:    Input Parameters:
    120: +  str - the string to print to
    121: .  len - the length of str
    122: .  val - scalar value to be printed
    123: -  exp - to be used within an expression, print leading sign and parentheses
    124:          in case of nonzero imaginary part

    126:    Level: developer
    127: @*/
    128: PetscErrorCode SlepcSNPrintfScalar(char *str,size_t len,PetscScalar val,PetscBool exp)
    129: {
    131: #if defined(PETSC_USE_COMPLEX)
    132:   PetscReal      re,im;
    133: #endif

    136: #if !defined(PETSC_USE_COMPLEX)
    137:   if (exp) {
    138:     PetscSNPrintf(str,len,"%+g",(double)val);
    139:   } else {
    140:     PetscSNPrintf(str,len,"%g",(double)val);
    141:   }
    142: #else
    143:   re = PetscRealPart(val);
    144:   im = PetscImaginaryPart(val);
    145:   if (im!=0.0) {
    146:     if (exp) {
    147:       PetscSNPrintf(str,len,"+(%g%+gi)",(double)re,(double)im);
    148:     } else {
    149:       PetscSNPrintf(str,len,"%g%+gi",(double)re,(double)im);
    150:     }
    151:   } else {
    152:     if (exp) {
    153:       PetscSNPrintf(str,len,"%+g",(double)re);
    154:     } else {
    155:       PetscSNPrintf(str,len,"%g",(double)re);
    156:     }
    157:   }
    158: #endif
    159:   return(0);
    160: }

    162: /*
    163:    SlepcDebugViewMatrix - prints an array as a matrix, to be used from within a debugger.
    164:    Output can be pasted to Matlab.

    166:      nrows, ncols: size of printed matrix
    167:      Xr, Xi: array to be printed (Xi not referenced in complex scalars)
    168:      ldx: leading dimension
    169:      s: name of Matlab variable
    170:      filename: optionally write output to a file
    171:  */
    172: #if defined(PETSC_USE_DEBUG)
    173: PetscErrorCode SlepcDebugViewMatrix(PetscInt nrows,PetscInt ncols,PetscScalar *Xr,PetscScalar *Xi,PetscInt ldx,const char *s,const char *filename)
    174: {
    176:   PetscInt       i,j;
    177:   PetscViewer    viewer;

    180:   if (filename) {
    181:     PetscViewerASCIIOpen(PETSC_COMM_WORLD,filename,&viewer);
    182:   } else {
    183:     PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);
    184:   }
    185:   PetscViewerASCIIPrintf(viewer,"%s = [\n",s);
    186:   for (i=0;i<nrows;i++) {
    187:     for (j=0;j<ncols;j++) {
    188: #if defined(PETSC_USE_COMPLEX)
    189:       PetscViewerASCIIPrintf(viewer,"%.18g+%.18gi ",PetscRealPart(Xr[i+j*ldx]),PetscImaginaryPart(Xr[i+j*ldx]));
    190: #else
    191:       if (Xi) { PetscViewerASCIIPrintf(viewer,"%.18g+%.18gi ",Xr[i+j*ldx],Xi[i+j*ldx]); }
    192:       else { PetscViewerASCIIPrintf(viewer,"%.18g ",Xr[i+j*ldx]); }
    193: #endif
    194:     }
    195:     PetscViewerASCIIPrintf(viewer,"\n");
    196:   }
    197:   PetscViewerASCIIPrintf(viewer,"];\n");
    198:   if (filename) { PetscViewerDestroy(&viewer); }
    199:   return(0);
    200: }
    201: #endif

    203: /*
    204:    SlepcDebugSetMatlabStdout - sets Matlab format in stdout, to be used from within a debugger.
    205:  */
    206: #if defined(PETSC_USE_DEBUG)
    207: PETSC_UNUSED PetscErrorCode SlepcDebugSetMatlabStdout(void)
    208: {
    210:   PetscViewer    viewer;

    213:   PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);
    214:   PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_MATLAB);
    215:   return(0);
    216: }
    217: #endif