Actual source code: mapreg.c

      1: #define PETSCVEC_DLL
     2:  #include vecimpl.h

      4: PetscFList PetscMapList                       = PETSC_NULL;
      5: PetscTruth PetscMapRegisterAllCalled          = PETSC_FALSE;

      9: /*@C
     10:   PetscMapSetType - Builds a map, for a particular map implementation.

     12:   Collective on PetscMap

     14:   Input Parameters:
     15: + map    - The PetscMap object
     16: - method - The name of the map type

     18:   Options Database Command:
     19: . -map_type <method> - Sets the method; use -help for a list
     20:                        of available methods (for instance, mpi)

     22:   Notes:
     23:   See "petsc/include/vec.h" for available vector types (for instance, MAP_MPI).

     25:   Level: intermediate

     27: .keywords: map, set, type
     28: .seealso PetscMapGetType(), PetscMapCreate()
     29: @*/
     30: PetscErrorCode PETSCVEC_DLLEXPORT PetscMapSetType(PetscMap map, PetscMapType method)
     31: {
     32:   PetscErrorCode (*r)(PetscMap);
     33:   PetscTruth match;

     38:   PetscTypeCompare((PetscObject) map, method, &match);
     39:   if (match) return(0);

     41:   /* Get the function pointers for the method requested */
     42:   if (!PetscMapRegisterAllCalled) {
     43:     PetscMapRegisterAll(PETSC_NULL);
     44:   }
     45:   PetscFListFind(map->comm, PetscMapList, method, (void (**)(void)) &r);
     46:   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown map type: %s", method);
     47:   if (map->ops->destroy) {
     48:     (*map->ops->destroy)(map);
     49:   }
     50:   (*r)(map);
     51:   PetscObjectChangeTypeName((PetscObject) map, method);
     52:   return(0);
     53: }

     57: /*@C
     58:   PetscMapGetType - Gets the map type name (as a string) from the PetscMap.

     60:   Not collective

     62:   Input Parameter:
     63: . map  - The map

     65:   Output Parameter:
     66: . type - The map type name

     68:   Level: intermediate

     70: .keywords: map, get, type, name
     71: .seealso PetscMapSetType(), PetscMapCreate()
     72: @*/
     73: PetscErrorCode PETSCVEC_DLLEXPORT PetscMapGetType(PetscMap map, PetscMapType *type)
     74: {

     80:   if (!PetscMapRegisterAllCalled) {
     81:     PetscMapRegisterAll(PETSC_NULL);
     82:   }
     83:   *type = map->type_name;
     84:   return(0);
     85: }

     87: /*--------------------------------------------------------------------------------------------------------------------*/
     88: /*MC
     89:   PetscMapRegisterDynamic - Adds a new map component implementation

     91:   Synopsis:
     92:   PetscErrorCode PetscMapRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(PetscMap))

     94:   Not Collective

     96:   Input Parameters:
     97: + name        - The name of a new user-defined creation routine
     98: . path        - The path (either absolute or relative) of the library containing this routine
     99: . func_name   - The name of routine to create method context
    100: - create_func - The creation routine itself

    102:   Notes:
    103:   PetscMapRegister() may be called multiple times to add several user-defined maptors

    105:   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.

    107:   Sample usage:
    108: .vb
    109:     PetscMapRegisterDynamic("my_map","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyPetscMapCreate", MyPetscMapCreate);
    110: .ve

    112:   Then, your map type can be chosen with the procedural interface via
    113: .vb
    114:     PetscMapCreate(MPI_Comm, PetscMap *);
    115:     PetscMapSetType(PetscMap,"my_map_name");
    116: .ve
    117:    or at runtime via the option
    118: .vb
    119:     -map_type my_map_name
    120: .ve

    122:   Note: $PETSC_ARCH  occuring in pathname will be replaced with appropriate values.

    124:   Level: advanced

    126: .keywords: PetscMap, register
    127: .seealso: PetscMapRegisterAll(), PetscMapRegisterDestroy()
    128: M*/

    132: PetscErrorCode PETSCVEC_DLLEXPORT PetscMapRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(PetscMap))
    133: {
    134:   char fullname[PETSC_MAX_PATH_LEN];

    138:   PetscStrcpy(fullname, path);
    139:   PetscStrcat(fullname, ":");
    140:   PetscStrcat(fullname, name);
    141:   PetscFListAdd(&PetscMapList, sname, fullname, (void (*)(void)) function);
    142:   return(0);
    143: }

    145: /*--------------------------------------------------------------------------------------------------------------------*/
    148: /*@C
    149:   PetscMapRegisterDestroy - Frees the list of PetscMap methods that were registered by PetscMapRegister().

    151:   Not collective

    153:   Level: advanced

    155: .keywords: map, register, destroy
    156: .seealso: PetscMapRegister(), PetscMapRegisterAll()
    157: @*/
    158: PetscErrorCode PETSCVEC_DLLEXPORT PetscMapRegisterDestroy()
    159: {

    163:   if (PetscMapList) {
    164:     PetscFListDestroy(&PetscMapList);
    165:     PetscMapList = PETSC_NULL;
    166:   }
    167:   PetscMapRegisterAllCalled = PETSC_FALSE;
    168:   return(0);
    169: }