Actual source code: bvec3.c

      1: /*
      2:    Implements the sequential vectors.
      3: */

      5: #include <../src/vec/vec/impls/dvecimpl.h>
      6: /*MC
      7:    VECSEQ - VECSEQ = "seq" - The basic sequential vector

      9:    Options Database Keys:
     10: . -vec_type seq - sets the vector type to VECSEQ during a call to VecSetFromOptions()

     12:   Level: beginner

     14: .seealso: `VecCreate()`, `VecSetType()`, `VecSetFromOptions()`, `VecCreateSeqWithArray()`, `VECMPI`, `VecType`, `VecCreateMPI()`, `VecCreateSeq()`
     15: M*/

     17: #if defined(PETSC_USE_MIXED_PRECISION)
     18: extern PetscErrorCode VecCreate_Seq_Private(Vec, const float *);
     19: extern PetscErrorCode VecCreate_Seq_Private(Vec, const double *);
     20: #endif

     22: PetscErrorCode VecCreate_Seq(Vec V)
     23: {
     24:   Vec_Seq     *s;
     25:   PetscScalar *array;
     26:   PetscInt     n = PetscMax(V->map->n, V->map->N);
     27:   PetscMPIInt  size;

     29:   PetscFunctionBegin;
     30:   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)V), &size));
     31:   PetscCheck(size <= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot create VECSEQ on more than one process");
     32: #if !defined(PETSC_USE_MIXED_PRECISION)
     33:   PetscCall(PetscShmgetAllocateArray(n, sizeof(PetscScalar), (void **)&array));
     34:   PetscCall(PetscMemzero(array, n * sizeof(PetscScalar)));
     35:   PetscCall(VecCreate_Seq_Private(V, array));

     37:   s                  = (Vec_Seq *)V->data;
     38:   s->array_allocated = array;
     39:   PetscCall(PetscObjectComposedDataSetReal((PetscObject)V, NormIds[NORM_2], 0));
     40:   PetscCall(PetscObjectComposedDataSetReal((PetscObject)V, NormIds[NORM_1], 0));
     41:   PetscCall(PetscObjectComposedDataSetReal((PetscObject)V, NormIds[NORM_INFINITY], 0));

     43: #else
     44:   switch (((PetscObject)V)->precision) {
     45:   case PETSC_PRECISION_SINGLE: {
     46:     float *aarray;

     48:     PetscCall(PetscCalloc1(n, &aarray));
     49:     PetscCall(VecCreate_Seq_Private(V, aarray));

     51:     s                  = (Vec_Seq *)V->data;
     52:     s->array_allocated = (PetscScalar *)aarray;
     53:   } break;
     54:   case PETSC_PRECISION_DOUBLE: {
     55:     double *aarray;

     57:     PetscCall(PetscCalloc1(n, &aarray));
     58:     PetscCall(VecCreate_Seq_Private(V, aarray));

     60:     s                  = (Vec_Seq *)V->data;
     61:     s->array_allocated = (PetscScalar *)aarray;
     62:   } break;
     63:   default:
     64:     SETERRQ(PetscObjectComm((PetscObject)V), PETSC_ERR_SUP, "No support for mixed precision %d", (int)(((PetscObject)V)->precision));
     65:   }
     66: #endif
     67:   PetscFunctionReturn(PETSC_SUCCESS);
     68: }