Date: 2013-07-02T14:39:53+00:00

Actual source code: vecreg.c
petsc-3.4.2 2013-07-02

      2: #include <petsc-private/vecimpl.h>    /*I "petscvec.h"  I*/

      4: PetscFunctionList VecList              = NULL;
      5: PetscBool         VecRegisterAllCalled = PETSC_FALSE;

      9: /*@C
     10:   VecSetType - Builds a vector, for a particular vector implementation.

     12:   Collective on Vec

     14:   Input Parameters:
     15: + vec    - The vector object
     16: - method - The name of the vector type

     18:   Options Database Key:
     19: . -vec_type <type> - Sets the vector type; use -help for a list
     20:                      of available types

     22:   Notes:
     23:   See "petsc/include/petscvec.h" for available vector types (for instance, VECSEQ, VECMPI, or VECSHARED).

     25:   Use VecDuplicate() or VecDuplicateVecs() to form additional vectors of the same type as an existing vector.

     27:   Level: intermediate

     29: .keywords: vector, set, type
     30: .seealso: VecGetType(), VecCreate()
     31: @*/
     32: PetscErrorCode  VecSetType(Vec vec, VecType method)
     33: {
     34:   PetscErrorCode (*r)(Vec);
     35:   PetscBool      match;

     40:   PetscObjectTypeCompare((PetscObject) vec, method, &match);
     41:   if (match) return(0);

     43:   PetscFunctionListFind(VecList,method,&r);
     44:   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown vector type: %s", method);
     45:   if (vec->ops->destroy) {
     46:     (*vec->ops->destroy)(vec);
     47:     vec->ops->destroy = NULL;
     48:   }
     49:   if (vec->map->n < 0 && vec->map->N < 0) {
     50:     vec->ops->create = r;
     51:     vec->ops->load   = VecLoad_Default;
     52:   } else {
     53:     (*r)(vec);
     54:   }
     55:   return(0);
     56: }

     60: /*@C
     61:   VecGetType - Gets the vector type name (as a string) from the Vec.

     63:   Not Collective

     65:   Input Parameter:
     66: . vec  - The vector

     68:   Output Parameter:
     69: . type - The vector type name

     71:   Level: intermediate

     73: .keywords: vector, get, type, name
     74: .seealso: VecSetType(), VecCreate()
     75: @*/
     76: PetscErrorCode  VecGetType(Vec vec, VecType *type)
     77: {

     83:   if (!VecRegisterAllCalled) {
     84:     VecRegisterAll();
     85:   }
     86:   *type = ((PetscObject)vec)->type_name;
     87:   return(0);
     88: }

     91: /*--------------------------------------------------------------------------------------------------------------------*/

     95: /*@C
     96:   VecRegister -  Adds a new vector component implementation

     98:   Not Collective

    100:   Input Parameters:
    101: + name        - The name of a new user-defined creation routine
    102: - create_func - The creation routine itself

    104:   Notes:
    105:   VecRegister() may be called multiple times to add several user-defined vectors

    107:   Sample usage:
    108: .vb
    109:     VecRegister("my_vec",MyVectorCreate);
    110: .ve

    112:   Then, your vector type can be chosen with the procedural interface via
    113: .vb
    114:     VecCreate(MPI_Comm, Vec *);
    115:     VecSetType(Vec,"my_vector_name");
    116: .ve
    117:    or at runtime via the option
    118: .vb
    119:     -vec_type my_vector_name
    120: .ve

    122:   Level: advanced

    124: .keywords: Vec, register

    126: .seealso: VecRegisterAll(), VecRegisterDestroy()
    127: @*/
    128: PetscErrorCode  VecRegister(const char sname[], PetscErrorCode (*function)(Vec))
    129: {

    133:   PetscFunctionListAdd(&VecList,sname,function);
    134:   return(0);
    135: }