Date: 2023-01-26T12:17:48+00:00

Actual source code: slepcutil.c
slepc-3.18.2 2023-01-26
Report Typos and Errors

      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: #include <slepc/private/slepcimpl.h>

     13: /*
     14:    Internal functions used to register monitors.
     15:  */
     16: PetscErrorCode SlepcMonitorMakeKey_Internal(const char name[],PetscViewerType vtype,PetscViewerFormat format,char key[])
     17: {
     18:   PetscStrncpy(key,name,PETSC_MAX_PATH_LEN);
     19:   PetscStrlcat(key,":",PETSC_MAX_PATH_LEN);
     20:   PetscStrlcat(key,vtype,PETSC_MAX_PATH_LEN);
     21:   PetscStrlcat(key,":",PETSC_MAX_PATH_LEN);
     22:   PetscStrlcat(key,PetscViewerFormats[format],PETSC_MAX_PATH_LEN);
     23:   return 0;
     24: }

     26: PetscErrorCode PetscViewerAndFormatCreate_Internal(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
     27: {
     28:   PetscViewerAndFormatCreate(viewer,format,vf);
     29:   (*vf)->data = ctx;
     30:   return 0;
     31: }

     33: /*
     34:    Given n vectors in V, this function gets references of them into W.
     35:    If m<0 then some previous non-processed vectors remain in W and must be freed.
     36:  */
     37: PetscErrorCode SlepcBasisReference_Private(PetscInt n,Vec *V,PetscInt *m,Vec **W)
     38: {
     39:   PetscInt       i;

     41:   for (i=0;i<n;i++) PetscObjectReference((PetscObject)V[i]);
     42:   SlepcBasisDestroy_Private(m,W);
     43:   if (n>0) {
     44:     PetscMalloc1(n,W);
     45:     for (i=0;i<n;i++) (*W)[i] = V[i];
     46:     *m = -n;
     47:   }
     48:   return 0;
     49: }

     51: /*
     52:    Destroys a set of vectors.
     53:    A negative value of m indicates that W contains vectors to be destroyed.
     54:  */
     55: PetscErrorCode SlepcBasisDestroy_Private(PetscInt *m,Vec **W)
     56: {
     57:   PetscInt       i;

     59:   if (*m<0) {
     60:     for (i=0;i<-(*m);i++) VecDestroy(&(*W)[i]);
     61:     PetscFree(*W);
     62:   }
     63:   *m = 0;
     64:   return 0;
     65: }

     67: /*@C
     68:    SlepcSNPrintfScalar - Prints a PetscScalar variable to a string of
     69:    given length.

     71:    Not Collective

     73:    Input Parameters:
     74: +  str - the string to print to
     75: .  len - the length of str
     76: .  val - scalar value to be printed
     77: -  exp - to be used within an expression, print leading sign and parentheses
     78:          in case of nonzero imaginary part

     80:    Level: developer

     82: .seealso: PetscSNPrintf()
     83: @*/
     84: PetscErrorCode SlepcSNPrintfScalar(char *str,size_t len,PetscScalar val,PetscBool exp)
     85: {
     86: #if defined(PETSC_USE_COMPLEX)
     87:   PetscReal      re,im;
     88: #endif

     90: #if !defined(PETSC_USE_COMPLEX)
     91:   if (exp) PetscSNPrintf(str,len,"%+g",(double)val);
     92:   else PetscSNPrintf(str,len,"%g",(double)val);
     93: #else
     94:   re = PetscRealPart(val);
     95:   im = PetscImaginaryPart(val);
     96:   if (im!=0.0) {
     97:     if (exp) PetscSNPrintf(str,len,"+(%g%+gi)",(double)re,(double)im);
     98:     else PetscSNPrintf(str,len,"%g%+gi",(double)re,(double)im);
     99:   } else {
    100:     if (exp) PetscSNPrintf(str,len,"%+g",(double)re);
    101:     else PetscSNPrintf(str,len,"%g",(double)re);
    102:   }
    103: #endif
    104:   return 0;
    105: }

    107: /*@C
    108:    SlepcHasExternalPackage - Determine whether SLEPc has been configured with the
    109:    given package.

    111:    Not Collective

    113:    Input Parameter:
    114: .  pkg - external package name

    116:    Output Parameter:
    117: .  has - PETSC_TRUE if SLEPc is configured with the given package, else PETSC_FALSE

    119:    Level: intermediate

    121:    Notes:
    122:    This is basically an alternative for SLEPC_HAVE_XXX whenever a preprocessor macro
    123:    is not available/desirable, e.g. in Python.

    125:    The external package name pkg is e.g. "arpack", "primme".
    126:    It should correspond to the name listed in  ./configure --help

    128:    The lookup is case insensitive, i.e. looking for "ARPACK" or "arpack" is the same.

    130: .seealso: EPSType, SVDType
    131: @*/
    132: PetscErrorCode SlepcHasExternalPackage(const char pkg[], PetscBool *has)
    133: {
    134:   char           pkgstr[128],*loc;
    135:   size_t         cnt;

    137:   PetscSNPrintfCount(pkgstr,sizeof(pkgstr),":%s:",&cnt,pkg);
    139:   PetscStrtolower(pkgstr);
    140: #if defined(SLEPC_HAVE_PACKAGES)
    141:   PetscStrstr(SLEPC_HAVE_PACKAGES,pkgstr,&loc);
    142: #else
    143: #error "SLEPC_HAVE_PACKAGES macro undefined. Please reconfigure"
    144: #endif
    145:   *has = loc? PETSC_TRUE: PETSC_FALSE;
    146:   return 0;
    147: }

    149: /*
    150:    SlepcDebugViewMatrix - prints an array as a matrix, to be used from within a debugger.
    151:    Output can be pasted to Matlab.

    153:      nrows, ncols: size of printed matrix
    154:      Xr, Xi: array to be printed (Xi not referenced in complex scalars)
    155:      ldx: leading dimension
    156:      s: name of Matlab variable
    157:      filename: optionally write output to a file
    158:  */
    159: #if defined(PETSC_USE_DEBUG)
    160: PetscErrorCode SlepcDebugViewMatrix(PetscInt nrows,PetscInt ncols,PetscScalar *Xr,PetscScalar *Xi,PetscInt ldx,const char *s,const char *filename)
    161: {
    162:   PetscInt       i,j;
    163:   PetscViewer    viewer;

    165:   if (filename) PetscViewerASCIIOpen(PETSC_COMM_WORLD,filename,&viewer);
    166:   else PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);
    167:   PetscViewerASCIIPrintf(viewer,"%s = [\n",s);
    168:   for (i=0;i<nrows;i++) {
    169:     for (j=0;j<ncols;j++) {
    170: #if defined(PETSC_USE_COMPLEX)
    171:       PetscViewerASCIIPrintf(viewer,"%.18g+%.18gi ",(double)PetscRealPart(Xr[i+j*ldx]),(double)PetscImaginaryPart(Xr[i+j*ldx]));
    172: #else
    173:       if (Xi) PetscViewerASCIIPrintf(viewer,"%.18g+%.18gi ",(double)Xr[i+j*ldx],(double)Xi[i+j*ldx]);
    174:       else PetscViewerASCIIPrintf(viewer,"%.18g ",(double)Xr[i+j*ldx]);
    175: #endif
    176:     }
    177:     PetscViewerASCIIPrintf(viewer,"\n");
    178:   }
    179:   PetscViewerASCIIPrintf(viewer,"];\n");
    180:   if (filename) PetscViewerDestroy(&viewer);
    181:   return 0;
    182: }
    183: #endif

    185: /*
    186:    SlepcDebugSetMatlabStdout - sets Matlab format in stdout, to be used from within a debugger.
    187:  */
    188: #if defined(PETSC_USE_DEBUG)
    189: PETSC_UNUSED PetscErrorCode SlepcDebugSetMatlabStdout(void)
    190: {
    191:   PetscViewer    viewer;

    193:   PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);
    194:   PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_MATLAB);
    195:   return 0;
    196: }
    197: #endif