1
// A class for defining atomic quantities for interscale operations
3
#ifndef PER_PAIR_QUANTITY_H
4
#define PER_PAIR_QUANTITY_H
7
#include "LammpsInterface.h"
8
#include "DependencyManager.h"
9
#include "PerAtomQuantity.h"
15
/** mapping of atomic pairs to pair index value */
16
typedef std::map< std::pair< int,int >,int > PAIR_MAP;
17
typedef std::map< std::pair< int,int >,int >::const_iterator PAIR_MAP_ITERATOR;
18
typedef std::pair< std::pair< int,int >,int > ATOM_PAIR;
22
* @brief Base class maps of pair indices to a single index
25
class PairMap : public DependencyManager {
27
PairMap(LammpsInterface * lammpsInterface, int groupbit);
28
virtual ~PairMap(void);
30
virtual void reset(void) const = 0;
32
void set_quantity() { throw ATC_Error("inappropriate access to pair map");}
34
// lammps communication
35
virtual void post_exchange() {this->force_reset();};
36
virtual void rest_nlocal() {this->force_reset();};
39
int size(void) const {
40
if (this->need_reset()) reset();
41
return nPairs_+nBonds_;
43
int num_bonds(void) const { return nBonds_; }
44
virtual ATOM_PAIR start() const = 0; // const reset / non-const call propagte reset
45
virtual ATOM_PAIR next() const = 0;
46
//ATOM_PAIR& operator++ () {return next();} // prefix ++: no parameter, returns a reference
47
ATOM_PAIR operator++ (int) const {return next();} // postfix ++: dummy parameter, returns a value
48
virtual bool finished() const = 0;
50
LammpsInterface * lammpsInterface_;
55
PairMap();// do not define
58
class PairMapNeighbor : public PairMap {
60
PairMapNeighbor(LammpsInterface * lammpsInterface, int groupbit);
61
virtual ~PairMapNeighbor(void) {};
63
virtual void reset(void) const;
64
virtual ATOM_PAIR start(void) const {
65
if (this->need_reset()) reset();
66
iterator_ = pairMap_.begin(); return *iterator_;}
67
virtual ATOM_PAIR next(void) const {
68
iterator_++; return *iterator_;}
69
virtual bool finished() const {
70
return (iterator_==pairMap_.end());}
72
mutable PAIR_MAP pairMap_;
74
mutable PAIR_MAP_ITERATOR iterator_;
75
PairMapNeighbor();// do not define
78
class PairMapBond : public PairMap {
80
PairMapBond(LammpsInterface * lammpsInterface, int groupbit);
81
virtual ~PairMapBond(void) {};
82
virtual bool need_reset(void) const { return true;}
83
virtual void reset(void) const {nBonds_ = lammpsInterface_->bond_list_length(); };
84
ATOM_PAIR start() const {
86
// if (needs_reset()) propagate_reset()
87
index_ = 0; return atom_pair(index_);}
88
ATOM_PAIR next() const {return atom_pair(++index_);}
89
bool finished() const { return index_==nBonds_; }
90
ATOM_PAIR atom_pair(int n) const {
92
std::pair<int,int> pair_ij(-1,-1); // this is the "end" value
93
ATOM_PAIR p(pair_ij,n);
96
int * bond = (lammpsInterface_->bond_list())[n];
97
std::pair<int,int> pair_ij(bond[0],bond[1]);
98
ATOM_PAIR p(pair_ij,n);
103
PairMapBond();// do not define
106
class PairMapBoth : public PairMapNeighbor {
108
PairMapBoth(LammpsInterface * lammpsInterface, int groupbit);
109
virtual ~PairMapBoth(void) {};
110
virtual bool need_reset(void) const {
111
nBonds_ = lammpsInterface_->bond_list_length();
112
return PairMapNeighbor::need_reset();
114
virtual void reset(void) const {
115
nBonds_ = lammpsInterface_->bond_list_length();
116
PairMapNeighbor::reset();
118
virtual ATOM_PAIR start(void) const {
119
if (need_reset()) reset();
121
iterator_ = pairMap_.begin();
122
return atom_pair(index_); // start with bonds
124
virtual ATOM_PAIR next(void) const {
126
if (index_ < nBonds_) { return atom_pair(index_);}
127
else { if (index_>nBonds_) iterator_++; return *iterator_; }
129
ATOM_PAIR atom_pair(int n) const {
130
int * bond = (lammpsInterface_->bond_list())[n];
131
std::pair<int,int> pair_ij(bond[0],bond[1]);
132
ATOM_PAIR p(pair_ij,n);
135
virtual bool finished() const {
136
return (iterator_==pairMap_.end());}
139
mutable PAIR_MAP_ITERATOR iterator_;
140
PairMapBoth();// do not define
144
* @class DensePerPairQuantity
145
* @brief Base class for objects that manage pair/bond quantities
147
class DensePerPairMatrix : public MatrixDependencyManager<DenseMatrix, double> {
152
DensePerPairMatrix(LammpsInterface * lammpsInterface,
153
const PairMap & pairMap,
157
virtual ~DensePerPairMatrix(){};
159
/** access to a constant dense matrix of the quantity */
160
virtual const DenseMatrix<double> & quantity() const
161
{this->reset(); return MatrixDependencyManager<DenseMatrix, double>::quantity();};
163
/** access to a non-constant dens matrix of the quantity */
164
virtual DenseMatrix<double> & set_quantity()
165
{this->reset(); return MatrixDependencyManager<DenseMatrix, double>::set_quantity();}
167
/** number of columns in quantity */
168
INDEX nCols() const {return nCols_;};
170
/** resets data, if necessary */
171
virtual void reset() const = 0;
175
/** pointer to access Lammps data */
176
LammpsInterface * lammpsInterface_;
178
/** reference to pair map */
179
const PairMap & pairMap_;
181
/** number of columns of the per atom quantity -static */
185
DensePerPairMatrix(); // do not define
190
* @brief f_ab (x) x_ab where (ab) -> p
192
class PairVirial : public DensePerPairMatrix {
196
PairVirial(LammpsInterface * lammpsInterface,
197
const PairMap & pairMap, int nCols);
200
virtual ~PairVirial(){};
202
/** resets data, if necessary */
203
virtual void reset() const = 0;
206
PairVirial(void); // do not define
210
* @brief f_ab (x) x_ab where (ab) -> p
212
class PairVirialEulerian : public PairVirial {
216
PairVirialEulerian(LammpsInterface * lammpsInterface,
217
const PairMap & pairMap);
220
virtual ~PairVirialEulerian(){};
222
/** resets data, if necessary */
223
virtual void reset() const;
226
PairVirialEulerian(void); // do not define
228
class PairVirialLagrangian : public PairVirial {
232
PairVirialLagrangian(LammpsInterface * lammpsInterface,
233
const PairMap & pairMap,
235
// const PerAtomQuantity<double> * x0);
238
virtual ~PairVirialLagrangian(){};
240
/** resets data, if necessary */
241
virtual void reset() const;
243
double ** xRef_; // note difficult to make a ** const
244
// const PerAtomQuantity<double> * xRef_;
247
PairVirialLagrangian(void); // do not define
251
* @class PairPotentialHeatFlux
252
* @brief f_ab v_b where (ab) -> p
254
class PairPotentialHeatFlux : public DensePerPairMatrix {
258
PairPotentialHeatFlux(LammpsInterface * lammpsInterface,
259
const PairMap & pairMap);
262
virtual ~PairPotentialHeatFlux(){};
264
/** resets data, if necessary */
265
virtual void reset() const =0;
268
PairPotentialHeatFlux(void); // do not define
270
class PairPotentialHeatFluxEulerian : public PairPotentialHeatFlux {
274
PairPotentialHeatFluxEulerian(LammpsInterface * lammpsInterface,
275
const PairMap & pairMap);
278
virtual ~PairPotentialHeatFluxEulerian(){};
280
/** resets data, if necessary */
281
virtual void reset() const;
284
PairPotentialHeatFluxEulerian(void); // do not define
287
class PairPotentialHeatFluxLagrangian : public PairPotentialHeatFlux {
291
PairPotentialHeatFluxLagrangian(LammpsInterface * lammpsInterface,
292
const PairMap & pairMap, double ** xRef);
295
virtual ~PairPotentialHeatFluxLagrangian(){};
297
/** resets data, if necessary */
298
virtual void reset() const;
300
double ** xRef_; // note difficult to make a ** const
301
//const PerAtomQuantity<double> * x0_;
304
PairPotentialHeatFluxLagrangian(void); // do not define
308
* @class SparsePerPairMatrix
309
* @brief Base class for objects that manage pair/bond quantities
311
class SparsePerPairMatrix : public MatrixDependencyManager<SparseMatrix, double> {
316
SparsePerPairMatrix(LammpsInterface * lammpsInterface,
317
const PairMap & pairMap);
320
virtual ~SparsePerPairMatrix(){};
322
/** access to a constant dense matrix of the quantity */
323
virtual const SparseMatrix<double> & quantity() const
324
{reset(); return MatrixDependencyManager<SparseMatrix, double>::quantity();};
326
/** access to a non-constant dens matrix of the quantity */
327
virtual SparseMatrix<double> & set_quantity()
328
{reset(); return MatrixDependencyManager<SparseMatrix, double>::set_quantity();}
330
/** resets data, if necessary */
331
virtual void reset() const = 0;
335
/** pointer to access Lammps data */
336
LammpsInterface * lammpsInterface_;
338
/** reference to pair map */
339
const PairMap & pairMap_;
342
SparsePerPairMatrix(); // do not define
347
* @brief Hardy's B_Iab wher (ab) -> p
349
class BondMatrix : public SparsePerPairMatrix {
353
BondMatrix(LammpsInterface * lammpsInterface,
354
const PairMap & pairMap, double ** x_, const class FE_Mesh * feMesh);
357
virtual ~BondMatrix(){};
359
/** resets data, if necessary */
360
virtual void reset() const = 0;
364
const class FE_Mesh * feMesh_;
367
BondMatrix(void); // do not define
371
* @class BondMatrixKernel
372
* @brief Hardy's B_Iab wher (ab) -> p
374
class BondMatrixKernel : public BondMatrix {
378
BondMatrixKernel(LammpsInterface * lammpsInterface,
379
const PairMap & pairMap,
381
const class FE_Mesh * feMesh,
382
const class KernelFunction * kernelFunction);
385
virtual ~BondMatrixKernel(){};
387
/** resets data, if necessary */
388
virtual void reset() const;
391
const class KernelFunction * kernelFunction_;
394
BondMatrixKernel(void); // do not define
398
* @class BondMatrixPartitionOfUnity
399
* @brief Hardy's B_Iab wher (ab) -> p
401
class BondMatrixPartitionOfUnity : public BondMatrix {
405
BondMatrixPartitionOfUnity(LammpsInterface * lammpsInterface,
406
const PairMap & pairMap,
408
const class FE_Mesh * feMesh,
409
const DIAG_MAN * invVol);
412
virtual ~BondMatrixPartitionOfUnity(){};
414
/** resets data, if necessary */
415
virtual void reset() const;
417
const DIAG_MAN * invVols_;
418
static const int lineNgauss_ = 10;
419
double lineXg_[lineNgauss_], lineWg_[lineNgauss_];
421
BondMatrixPartitionOfUnity(void); // do not define