/usr/include/temp_multivector.h is in libhypre-dev 2.8.0b-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | /*BHEADER**********************************************************************
* Copyright (c) 2008, Lawrence Livermore National Security, LLC.
* Produced at the Lawrence Livermore National Laboratory.
* This file is part of HYPRE. See file COPYRIGHT for details.
*
* HYPRE is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License (as published by the Free
* Software Foundation) version 2.1 dated February 1999.
*
* $Revision: 1.9 $
***********************************************************************EHEADER*/
#ifndef TEMPORARY_MULTIVECTOR_FUNCTION_PROTOTYPES
#define TEMPORARY_MULTIVECTOR_FUNCTION_PROTOTYPES
#include "interpreter.h"
typedef struct
{
hypre_longint numVectors;
HYPRE_Int* mask;
void** vector;
HYPRE_Int ownsVectors;
HYPRE_Int ownsMask;
mv_InterfaceInterpreter* interpreter;
} mv_TempMultiVector;
/*typedef struct mv_TempMultiVector* mv_TempMultiVectorPtr; */
typedef mv_TempMultiVector* mv_TempMultiVectorPtr;
/*******************************************************************/
/*
The above is a temporary implementation of the hypre_MultiVector
data type, just to get things going with LOBPCG eigensolver.
A more proper implementation would be to define hypre_MultiParVector,
hypre_MultiStructVector and hypre_MultiSStructVector by adding a new
record
HYPRE_Int numVectors;
in hypre_ParVector, hypre_StructVector and hypre_SStructVector,
and increasing the size of data numVectors times. Respective
modifications of most vector operations are straightforward
(it is strongly suggested that BLAS routines are used wherever
possible), efficient implementation of matrix-by-multivector
multiplication may be more difficult.
With the above implementation of hypre vectors, the definition
of hypre_MultiVector becomes simply (cf. multivector.h)
typedef struct
{
void* multiVector;
HYPRE_InterfaceInterpreter* interpreter;
} hypre_MultiVector;
with pointers to abstract multivector functions added to the structure
HYPRE_InterfaceInterpreter (cf. HYPRE_interpreter.h; particular values
are assigned to these pointers by functions
HYPRE_ParCSRSetupInterpreter, HYPRE_StructSetupInterpreter and
HYPRE_Int HYPRE_SStructSetupInterpreter),
and the abstract multivector functions become simply interfaces
to the actual multivector functions of the form (cf. multivector.c):
void
hypre_MultiVectorCopy( hypre_MultiVectorPtr src_, hypre_MultiVectorPtr dest_ ) {
hypre_MultiVector* src = (hypre_MultiVector*)src_;
hypre_MultiVector* dest = (hypre_MultiVector*)dest_;
assert( src != NULL && dest != NULL );
(src->interpreter->CopyMultiVector)( src->data, dest->data );
}
*/
/*********************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
void*
mv_TempMultiVectorCreateFromSampleVector( void*, HYPRE_Int n, void* sample );
void*
mv_TempMultiVectorCreateCopy( void*, HYPRE_Int copyValues );
void
mv_TempMultiVectorDestroy( void* );
HYPRE_Int
mv_TempMultiVectorWidth( void* v );
HYPRE_Int
mv_TempMultiVectorHeight( void* v );
void
mv_TempMultiVectorSetMask( void* v, HYPRE_Int* mask );
void
mv_TempMultiVectorClear( void* );
void
mv_TempMultiVectorSetRandom( void* v, HYPRE_Int seed );
void
mv_TempMultiVectorCopy( void* src, void* dest );
void
mv_TempMultiVectorAxpy( double, void*, void* );
void
mv_TempMultiVectorByMultiVector( void*, void*,
HYPRE_Int gh, HYPRE_Int h, HYPRE_Int w, double* v );
void
mv_TempMultiVectorByMultiVectorDiag( void* x, void* y,
HYPRE_Int* mask, HYPRE_Int n, double* diag );
void
mv_TempMultiVectorByMatrix( void*,
HYPRE_Int gh, HYPRE_Int h, HYPRE_Int w, double* v,
void* );
void
mv_TempMultiVectorXapy( void* x,
HYPRE_Int gh, HYPRE_Int h, HYPRE_Int w, double* v,
void* y );
void mv_TempMultiVectorByDiagonal( void* x,
HYPRE_Int* mask, HYPRE_Int n, double* diag,
void* y );
void
mv_TempMultiVectorEval( void (*f)( void*, void*, void* ), void* par,
void* x, void* y );
#ifdef __cplusplus
}
#endif
#endif /* MULTIVECTOR_FUNCTION_PROTOTYPES */
|