Date: 2022-03-31T04:46:42+00:00

Actual source code: const.c

      2: #include <../src/vec/pf/pfimpl.h>

      4: static PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
      5: {
      6:   PetscInt    i;
      7:   PetscScalar v = ((PetscScalar*)value)[0];

      9:   n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]);
     10:   for (i=0; i<n; i++) y[i] = v;
     11:   return 0;
     12: }

     14: static PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
     15: {
     16:   VecSet(y,*((PetscScalar*)value));
     17:   return 0;
     18: }
     19: PetscErrorCode PFView_Constant(void *value,PetscViewer viewer)
     20: {
     21:   PetscBool      iascii;

     23:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
     24:   if (iascii) {
     25: #if !defined(PETSC_USE_COMPLEX)
     26:     PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);
     27: #else
     28:     PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));
     29: #endif
     30:   }
     31:   return 0;
     32: }
     33: static PetscErrorCode PFDestroy_Constant(void *value)
     34: {
     35:   PetscFree(value);
     36:   return 0;
     37: }

     39: static PetscErrorCode PFSetFromOptions_Constant(PetscOptionItems *PetscOptionsObject,PF pf)
     40: {
     41:   PetscScalar    *value = (PetscScalar*)pf->data;

     43:   PetscOptionsHead(PetscOptionsObject,"Constant function options");
     44:   PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,NULL);
     45:   PetscOptionsTail();
     46:   return 0;
     47: }

     49: PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf,void *value)
     50: {
     51:   PetscScalar    *loc;

     53:   PetscMalloc1(2,&loc);
     54:   if (value) loc[0] = *(PetscScalar*)value;
     55:   else loc[0] = 0.0;
     56:   loc[1] = pf->dimout;
     57:   PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);

     59:   pf->ops->setfromoptions = PFSetFromOptions_Constant;
     60:   return 0;
     61: }

     63: /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/

     65: PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*))
     66: {
     67:   PFSet(pf,function,NULL,NULL,NULL,NULL);
     68:   return 0;
     69: }

     71: /* -------------------------------------------------------------------------------------------------------------------*/
     72: static PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
     73: {
     74:   PetscInt i;

     76:   n *= *(PetscInt*)value;
     77:   for (i=0; i<n; i++) y[i] = x[i];
     78:   return 0;
     79: }

     81: static PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
     82: {
     83:   VecCopy(x,y);
     84:   return 0;
     85: }
     86: static PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
     87: {
     88:   PetscBool      iascii;

     90:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
     91:   if (iascii) {
     92:     PetscViewerASCIIPrintf(viewer,"Identity function\n");
     93:   }
     94:   return 0;
     95: }
     96: static PetscErrorCode PFDestroy_Identity(void *value)
     97: {
     98:   PetscFree(value);
     99:   return 0;
    100: }

    102: PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf,void *value)
    103: {
    104:   PetscInt       *loc;

    107:   PetscNew(&loc);
    108:   loc[0] = pf->dimout;
    109:   PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);
    110:   return 0;
    111: }