PetscVecTools.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef _PETSCVECTOOLS_HPP_
00037 #define _PETSCVECTOOLS_HPP_
00038
00039 #include "UblasVectorInclude.hpp"
00040
00041 #include <petscvec.h>
00042
00046 class PetscVecTools
00047 {
00048 public:
00049
00055 static void Finalise(Vec vector);
00056
00062 static void Display(Vec vector);
00063
00069 static void Zero(Vec vector);
00070
00078 static void SetElement(Vec vector, PetscInt row, double value);
00079
00087 static void AddToElement(Vec vector, PetscInt row, double value);
00088
00094 static unsigned GetSize(Vec vector);
00095
00103 static void GetOwnershipRange(Vec vector, PetscInt& lo, PetscInt& hi);
00104
00112 static double GetElement(Vec vector, PetscInt row);
00113
00121 static void AddScaledVector(Vec y, Vec x, double scaleFactor);
00122
00128 static void Scale(Vec vector, double scaleFactor);
00129
00138 static void WAXPY(Vec w, double a, Vec x, Vec y);
00139
00150 template<size_t VECTOR_SIZE>
00151 static void AddMultipleValues(Vec vector, unsigned* vectorIndices, c_vector<double, VECTOR_SIZE>& smallVector)
00152 {
00153 PetscInt indices_owned[VECTOR_SIZE];
00154 PetscInt num_indices_owned = 0;
00155 PetscInt global_row;
00156 PetscInt lo, hi;
00157 GetOwnershipRange(vector, lo, hi);
00158
00159 for (unsigned row = 0; row<VECTOR_SIZE; row++)
00160 {
00161 global_row = vectorIndices[row];
00162 if (global_row >=lo && global_row <hi)
00163 {
00164 indices_owned[num_indices_owned++] = global_row;
00165 }
00166 }
00167
00168 if (num_indices_owned == VECTOR_SIZE)
00169 {
00170 VecSetValues(vector,
00171 num_indices_owned,
00172 indices_owned,
00173 smallVector.data(),
00174 ADD_VALUES);
00175 }
00176 else
00177 {
00178
00179
00180
00181
00182 double values[VECTOR_SIZE];
00183 unsigned num_values_owned = 0;
00184
00185 for (unsigned row = 0; row<VECTOR_SIZE; row++)
00186 {
00187 global_row = vectorIndices[row];
00188 if (global_row >= lo && global_row < hi)
00189 {
00190 values[num_values_owned++] = smallVector(row);
00191 }
00192 }
00193
00194 VecSetValues(vector,
00195 num_indices_owned,
00196 indices_owned,
00197 values,
00198 ADD_VALUES);
00199 }
00200 }
00201
00210 static void SetupInterleavedVectorScatterGather(Vec interleavedVec, VecScatter& rFirstVariableScatterContext, VecScatter& rSecondVariableScatterContext);
00211
00221 static void DoInterleavedVecScatter(Vec interleavedVec, VecScatter firstVariableScatterContext, Vec firstVariableVec, VecScatter secondVariableScatterContext, Vec secondVariableVec);
00222
00232 static void DoInterleavedVecGather(Vec interleavedVec, VecScatter firstVariableScatterContext, Vec firstVariableVec, VecScatter secondVariableScatterContext, Vec secondVariableVec);
00233 };
00234
00235 #endif //_PETSCVECTOOLS_HPP_