Actual source code: vecimplslepc.h

      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: #pragma once

     13: #include <slepcvec.h>
     14: #include <slepc/private/slepcimpl.h>

     16: /* SUBMANSEC = Sys */

     18: #if !defined(PETSC_USE_DEBUG)

     20: #define SlepcValidVecComp(y,arg) do {(void)(y);} while (0)

     22: #else

     24: #define SlepcValidVecComp(y,arg) \
     25:   do { \
     26:     PetscCheck(((Vec_Comp*)(y)->data)->nx>=((Vec_Comp*)(y)->data)->n->n,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Invalid number of subvectors required: Parameter #%d",arg); \
     27:   } while (0)

     29: #endif

     31: /* Contexts for VecComp */
     32: typedef struct {
     33:   PetscInt      n;        /* number of active subvectors */
     34:   PetscInt      N;        /* virtual global size */
     35:   PetscInt      lN;       /* virtual local size */
     36:   PetscInt      friends;  /* number of vectors sharing this structure */
     37: } Vec_Comp_N;

     39: typedef struct {
     40:   Vec           *x;       /* the vectors */
     41:   PetscInt      nx;       /* number of available subvectors */
     42:   Vec_Comp_N    *n;       /* structure shared by friend vectors */
     43: } Vec_Comp;

     45: /* Operations implemented in VecComp */
     46: SLEPC_INTERN PetscErrorCode VecDuplicateVecs_Comp(Vec,PetscInt,Vec*[]);
     47: SLEPC_INTERN PetscErrorCode VecDestroyVecs_Comp(PetscInt,Vec[]);
     48: SLEPC_INTERN PetscErrorCode VecDuplicate_Comp(Vec,Vec*);
     49: SLEPC_INTERN PetscErrorCode VecDestroy_Comp(Vec);
     50: SLEPC_INTERN PetscErrorCode VecSet_Comp(Vec,PetscScalar);
     51: SLEPC_INTERN PetscErrorCode VecView_Comp(Vec,PetscViewer);
     52: SLEPC_INTERN PetscErrorCode VecScale_Comp(Vec,PetscScalar);
     53: SLEPC_INTERN PetscErrorCode VecCopy_Comp(Vec,Vec);
     54: SLEPC_INTERN PetscErrorCode VecSwap_Comp(Vec,Vec);
     55: SLEPC_INTERN PetscErrorCode VecAXPY_Comp(Vec,PetscScalar,Vec);
     56: SLEPC_INTERN PetscErrorCode VecAYPX_Comp(Vec,PetscScalar,Vec);
     57: SLEPC_INTERN PetscErrorCode VecAXPBY_Comp(Vec,PetscScalar,PetscScalar,Vec);
     58: SLEPC_INTERN PetscErrorCode VecMAXPY_Comp(Vec,PetscInt,const PetscScalar*,Vec*);
     59: SLEPC_INTERN PetscErrorCode VecWAXPY_Comp(Vec,PetscScalar,Vec,Vec);
     60: SLEPC_INTERN PetscErrorCode VecAXPBYPCZ_Comp(Vec,PetscScalar,PetscScalar,PetscScalar,Vec,Vec);
     61: SLEPC_INTERN PetscErrorCode VecPointwiseMult_Comp(Vec,Vec,Vec);
     62: SLEPC_INTERN PetscErrorCode VecPointwiseDivide_Comp(Vec,Vec,Vec);
     63: SLEPC_INTERN PetscErrorCode VecGetSize_Comp(Vec,PetscInt*);
     64: SLEPC_INTERN PetscErrorCode VecGetLocalSize_Comp(Vec,PetscInt*);
     65: SLEPC_INTERN PetscErrorCode VecMax_Comp(Vec,PetscInt*,PetscReal*);
     66: SLEPC_INTERN PetscErrorCode VecMin_Comp(Vec,PetscInt*,PetscReal*);
     67: SLEPC_INTERN PetscErrorCode VecSetRandom_Comp(Vec,PetscRandom);
     68: SLEPC_INTERN PetscErrorCode VecConjugate_Comp(Vec);
     69: SLEPC_INTERN PetscErrorCode VecReciprocal_Comp(Vec);
     70: SLEPC_INTERN PetscErrorCode VecMaxPointwiseDivide_Comp(Vec,Vec,PetscReal*);
     71: SLEPC_INTERN PetscErrorCode VecPointwiseMax_Comp(Vec,Vec,Vec);
     72: SLEPC_INTERN PetscErrorCode VecPointwiseMaxAbs_Comp(Vec,Vec,Vec);
     73: SLEPC_INTERN PetscErrorCode VecPointwiseMin_Comp(Vec,Vec,Vec);
     74: SLEPC_INTERN PetscErrorCode VecDotNorm2_Comp_Seq(Vec,Vec,PetscScalar*,PetscScalar*);
     75: SLEPC_INTERN PetscErrorCode VecDotNorm2_Comp_MPI(Vec,Vec,PetscScalar*,PetscScalar*);
     76: SLEPC_INTERN PetscErrorCode VecSqrtAbs_Comp(Vec);
     77: SLEPC_INTERN PetscErrorCode VecAbs_Comp(Vec);
     78: SLEPC_INTERN PetscErrorCode VecExp_Comp(Vec);
     79: SLEPC_INTERN PetscErrorCode VecLog_Comp(Vec);
     80: SLEPC_INTERN PetscErrorCode VecShift_Comp(Vec,PetscScalar);
     81: SLEPC_EXTERN PetscErrorCode VecCreate_Comp(Vec);

     83: /* VecPool */
     84: typedef struct VecPool_ {
     85:   Vec      v;              /* template vector */
     86:   Vec      *vecs;          /* pool of vectors */
     87:   PetscInt n;              /* size of vecs */
     88:   PetscInt used;           /* number of already used vectors */
     89:   PetscInt guess;          /* expected maximum number of vectors */
     90:   struct VecPool_ *next;   /* list of pool of vectors */
     91: } VecPool_;
     92: typedef VecPool_* VecPool;

     94: SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode SlepcVecPoolCreate(Vec,PetscInt,VecPool*);
     95: SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode SlepcVecPoolDestroy(VecPool*);
     96: SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode SlepcVecPoolGetVecs(VecPool,PetscInt,Vec**);
     97: SLEPC_SINGLE_LIBRARY_INTERN PetscErrorCode SlepcVecPoolRestoreVecs(VecPool,PetscInt,Vec**);