lammps/lib/atc/PerAtomQuantity.h

1470 lines
59 KiB
C++

// A class for defining atomic quantities for interscale operations
#ifndef PER_ATOM_QUANTITY_H
#define PER_ATOM_QUANTITY_H
// ATC_Method headers
#include "LammpsInterface.h"
#include "DependencyManager.h"
#include "PaqAtcUtility.h"
#include <set>
#include <string>
#include <vector>
namespace ATC {
// forward declarations
class ATC_Method;
template <typename TT> class ClonedAtomQuantity;
/**
* @class PerAtomQuantity
* @brief Base class for objects that manage atomic quantities and their AtC interface
*/
template <typename T>
class PerAtomQuantity : public MatrixDependencyManager<DenseMatrix, T> {
public:
// constructor
PerAtomQuantity(ATC_Method * atc, int nCols = 1, AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomQuantity();
/** access to a constant dense matrix of the quantity, indexed by prescribed counts */
virtual const DenseMatrix<T> & quantity() const
{reset(); return MatrixDependencyManager<DenseMatrix, T>::quantity();};
/** access to a non-constant dens matrix of the quantity, indexed by prescribed atom counts */
virtual DenseMatrix<T> & set_quantity()
{reset(); return MatrixDependencyManager<DenseMatrix, T>::set_quantity();}
/** number of columns in quantity */
INDEX nCols() const {return nCols_;};
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const DenseMatrix<T> & target) {PerAtomQuantity<T>::reset(); MatrixDependencyManager<DenseMatrix, T>::operator=(target);};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const DenseMatrix<T> & addition) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator+=(addition);};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator+=(addition);};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const DenseMatrix<T> & subtraction) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator-=(subtraction);};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtraction) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator-=(subtraction);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator/=(divisor);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor) {reset(); MatrixDependencyManager<DenseMatrix, T>::operator/=(divisor);};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {this->set_lammps_to_quantity();};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {(this->quantity_).resize(atc_.nlocal(),nCols_); this->set_quantity_to_lammps();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return nCols_;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer);
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer);
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
/** returns per-atom size of communicated data */
virtual int size_comm() const {return nCols_;};
/** changes size of temperary lammps storage data if transfer is being used */
virtual void grow_lammps_array(int nmax, const std::string & tag);
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j);
/** access type of data this quantity is applied to */
AtomType atom_type() const {return atomType_;};
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {};
/** resets local storage */
virtual void reset_nlocal() { this->force_reset();}
protected:
/** utility object to access ATC methods */
PaqAtcUtility atc_;
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** type of atoms this quantity applies to */
AtomType atomType_;
/** number of columns of the per atom quantity, must be defined in derived class */
int nCols_;
/** map from this quantity's AtC indexing to Lammps indexing for atomic arrays */
const Array<int> & quantityToLammps_;
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).resize(atc_.nlocal(),nCols_); this->needReset_ = false;}};
/** sets the quantity based on a lammps pointer */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const = 0;
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const = 0;
/** point to lammps-style array for data */
T * lammpsScalar_;
/** pointer to lammps-style double array for data */
T ** lammpsVector_;
private:
// do not define
PerAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class LammpsAtomQuantity
// A base class for defining objects that manage
// quantities but the lammps data forms the
// absolute definition for the contained data.
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class LammpsAtomQuantity : public PerAtomQuantity<T> {
public:
// used as a friend so that clones can use it's methods
template <typename TT>
friend class ClonedAtomQuantity;
// constructor
LammpsAtomQuantity(ATC_Method * atc,int nCols = 1, AtomType atomType = INTERNAL) :
PerAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~LammpsAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("LammpsAtomQuantity::set_quantity - Cannot modify shallow per atom quantities outside of manager class"); return this->quantity_;};
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const DenseMatrix<T> & target)
{PerAtomQuantity<T>::operator=(target); this->set_lammps_to_quantity();};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const DenseMatrix<T> & addition)
{PerAtomQuantity<T>::operator+=(addition); this->set_lammps_to_quantity();};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition)
{PerAtomQuantity<T>::operator+=(addition); this->set_lammps_to_quantity();};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const DenseMatrix<T> & subtraction)
{PerAtomQuantity<T>::operator-=(subtraction); this->set_lammps_to_quantity();};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T subtraction)
{PerAtomQuantity<T>::operator-=(subtraction); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & multiplier)
{PerAtomQuantity<T>::operator*=(multiplier); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier)
{PerAtomQuantity<T>::operator*=(multiplier); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & divisor)
{PerAtomQuantity<T>::operator/=(divisor); this->set_lammps_to_quantity();};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor)
{PerAtomQuantity<T>::operator/=(divisor); this->set_lammps_to_quantity();};
/** sets quantity to lammps data, but not needed */
virtual void prepare_exchange() {};
/** packs data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
protected:
virtual void reset() const;
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const = 0;
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const = 0;
private:
// do not define
LammpsAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ShallowAtomQuantity
// A base class for defining objects that manage
// quantities but do not own their own lammps data.
// The lammps data forms the absolute definition
// for the contained data.
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ShallowAtomQuantity : public LammpsAtomQuantity<T> {
public:
// constructor
ShallowAtomQuantity(ATC_Method * atc,int nCols = 1, AtomType atomType = INTERNAL) :
LammpsAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~ShallowAtomQuantity() {};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int /* i */, double */* buffer */) {return 0;};
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int /* i */, double * /* buffer */) {return 0;};
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int /* index */, double * /* buf */,
int /* pbc_flag */, int * /* pbc */) {return 0;};
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int /* index */, double * /* buf */) {return 0;};
/** returns size of per-atom communication */
virtual int size_comm() const {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
virtual void grow_lammps_array(int /* nmax */, const std::string & /* tag */) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int /* i */, int /* j */) {};
protected:
private:
// do not define
ShallowAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ClonedLammpsAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms based on data in
// a LammpsAtomQuantity
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ClonedAtomQuantity : public ShallowAtomQuantity<T> {
public:
// constructor
ClonedAtomQuantity(ATC_Method * atc,
LammpsAtomQuantity<T> * target,
AtomType atomType=INTERNAL) :
ShallowAtomQuantity<T>(atc,target->nCols(),atomType),
target_(target)
{
target_->register_dependence(this);
};
// destructor
virtual ~ClonedAtomQuantity() {};
protected:
/** reference to originating per atom quantity */
LammpsAtomQuantity<T> * target_;
/** sets quantity based on root lammps data */
virtual void set_quantity_to_lammps() const
{
target_->reset(); // make sure target is all the way up to date
ShallowAtomQuantity<T>::set_quantity_to_lammps(); // change appropriate data
}
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const
{
target_->reset(); // make sure target is all the way up to date
ShallowAtomQuantity<T>::set_lammps_to_quantity(); // change appropriate data
target_->propagate_reset();
this->needReset_ = false;
};
/** gets appropriate pointer for lammps data */
virtual T * lammps_scalar() const
{return target_->lammps_scalar();};
/** gets appropriate pointer for lammps data */
virtual T ** lammps_vector() const
{return target_->lammps_vector();};
private:
// do not define
ClonedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedClonedAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms based on data in
// a pointer managed in the standard lammps way.
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedClonedAtomQuantity : public ShallowAtomQuantity<T> {
public:
// constructor
ProtectedClonedAtomQuantity(ATC_Method * atc,
int nCols,
AtomType atomType=INTERNAL) :
ShallowAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~ProtectedClonedAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedClonedAtomQuantity::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DenseMatrix<T> & /* target */)
{throw ATC_Error("ProtectedClonedAtomQuantity::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & /* target */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DenseMatrix<T> & /* addition */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T /* addition */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DenseMatrix<T> & /* subtraction */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T /* subtraction */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & /* multiplier */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T /* multiplier */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & /* divisor */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T /* divisor */)
{throw ATC_Error("ProtectedClonedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
protected:
/** sets lammps data based on the quantity, not needed by this class */
virtual void set_lammps_to_quantity() const {};
/** gets appropriate pointer for lammps data */
virtual T * lammps_scalar() const {return NULL;};
/** gets appropriate pointer for lammps data */
virtual T ** lammps_vector() const {return NULL;};
private:
// do not define
ProtectedClonedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtcAtomQuantity
// A funcational base class for defining objects that
// manage quantities defined at atoms and their AtC
// interface that are defined by AtC classes
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class AtcAtomQuantity : public PerAtomQuantity<T> {
public:
// constructor
AtcAtomQuantity(ATC_Method * atc,
int nCols = 1,
AtomType atomType = INTERNAL) : PerAtomQuantity<T>(atc,nCols,atomType) {};
// destructor
virtual ~AtcAtomQuantity() {};
protected:
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const {return this->lammpsScalar_;};
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return this->lammpsVector_;};
private:
// do not define
AtcAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms internally and do not
// allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedAtomQuantity : public AtcAtomQuantity<T> {
public:
// constructor
ProtectedAtomQuantity(ATC_Method * atc,
int nCols = 1,
AtomType atomType = INTERNAL)
: AtcAtomQuantity<T>(atc, nCols, atomType) {};
// destructor
virtual ~ProtectedAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedAtomQuantity::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DenseMatrix<T> & /* target */)
{throw ATC_Error("ProtectedAtomQuantity::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & /* target */)
{throw ATC_Error("ProtectedAtomQuantity::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DenseMatrix<T> & /* addition */)
{throw ATC_Error("ProtectedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T /* addition */)
{throw ATC_Error("ProtectedAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DenseMatrix<T> & /* subtraction */)
{throw ATC_Error("ProtectedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T /* subtraction */)
{throw ATC_Error("ProtectedAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & /* multiplier */)
{throw ATC_Error("ProtectedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T /* multiplier */)
{throw ATC_Error("ProtectedAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & /* divisor */)
{throw ATC_Error("ProtectedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T /* divisor */)
{throw ATC_Error("ProtectedAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {this->reset(); PerAtomQuantity<T>::set_lammps_to_quantity();};
private:
// do not define
ProtectedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedMappedAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms internally and do not
// allow for reset externally, but are mapped onto a
// subset of internal atoms
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedMappedAtomQuantity : public ProtectedAtomQuantity<T> {
public:
// constructor
ProtectedMappedAtomQuantity(ATC_Method * atc,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
int nCols = 1,
AtomType atomType = INTERNAL)
: ProtectedAtomQuantity<T>(atc, nCols, atomType), atomMap_(atomMap)
{atomMap_->register_dependence(this);};
// destructor
virtual ~ProtectedMappedAtomQuantity() {atomMap_->remove_dependence(this);};
protected:
// methods
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).resize(atomMap_->size(),this->nCols()); this->needReset_ = false;}};
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
// data
/** map from atoms of atomType to desired subset */
MatrixDependencyManager<DenseMatrix, int> * atomMap_;
private:
// do not define
ProtectedMappedAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedLammpsAtomQuantity
// A base class for defining objects that manage
// quantities defined at atoms using lammps storage as
// the definition and do not allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedLammpsAtomQuantity : public LammpsAtomQuantity<T> {
public:
// constructor
ProtectedLammpsAtomQuantity(ATC_Method * atc,
int nCols = 1,
AtomType atomType = INTERNAL)
: LammpsAtomQuantity<T>(atc, nCols, atomType) {};
// destructor
virtual ~ProtectedLammpsAtomQuantity() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DenseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedLammpsAtomQuantity::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DenseMatrix<T> & /* target */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & /* target */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DenseMatrix<T> & /* addition */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T /* addition */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DenseMatrix<T> & /* subtraction */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T /* subtraction */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DenseMatrix<T> & /* multiplier */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T /* multiplier */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DenseMatrix<T> & /* divisor */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T /* divisor */)
{throw ATC_Error("ProtectedLammpsAtomQuantity::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const {return this->lammpsScalar_;};
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return this->lammpsVector_;};
private:
// do not define
ProtectedLammpsAtomQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ConstantQuantity
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ConstantQuantity : public ProtectedAtomQuantity<T> {
public:
// constructor
ConstantQuantity(ATC_Method * atc,
T constant,
int nCols = 1,
AtomType atomType = INTERNAL) : ProtectedAtomQuantity<T>(atc,nCols,atomType), constant_(constant) {};
// destructor
virtual ~ConstantQuantity() {};
// eliminate MPI, use resets instead
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {};
/** resets local AtC storage */
virtual void post_exchange() {this->set_reset();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer */
virtual int pack_exchange(int /* i */, double * /* buffer */) {return 0;};
/** unpacks data after parallel transfer */
virtual int unpack_exchange(int /* i */, double * /* buffer */) {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
virtual void grow_lammps_array(int /* nmax */, const std::string & /* tag */) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int /* i */, int /* j */) {};
protected:
/** resets the data if necessary */
virtual void reset() const {if (this->need_reset()) {PerAtomQuantity<T>::reset(); this->quantity_ = constant_;}};
/** constant to set data to */
T constant_;
private:
// do not define
ConstantQuantity();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ConstantQuantityMapped
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ConstantQuantityMapped : public ProtectedMappedAtomQuantity<T> {
public:
// constructor
ConstantQuantityMapped(ATC_Method * atc,
T constant,
MatrixDependencyManager<DenseMatrix, int> * atomMap,
int nCols = 1,
AtomType atomType = INTERNAL) : ProtectedMappedAtomQuantity<T>(atc,atomMap,nCols,atomType), constant_(constant) {};
// destructor
virtual ~ConstantQuantityMapped() {};
// eliminate MPI, use resets instead
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {};
/** resets local AtC storage */
virtual void post_exchange() {this->set_reset();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer */
virtual int pack_exchange(int /* i */, double * /* buffer */) {return 0;};
/** unpacks data after parallel transfer */
virtual int unpack_exchange(int /* i */, double * /* buffer */) {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
virtual void grow_lammps_array(int /* nmax */, const std::string & /* tag */) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int /* i */, int /* j */) {};
protected:
/** resets the data if necessary */
virtual void reset() const {if (this->need_reset()) {ProtectedMappedAtomQuantity<T>::reset(); this->quantity_ = constant_;}};
/** constant to set data to */
T constant_;
private:
// do not define
ConstantQuantityMapped();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class SummedAtomicQuantity
//--------------------------------------------------------
//--------------------------------------------------------
// Had to define all functions in header, not sure why (JAT, 12/14/11)
template <typename T>
class SummedAtomicQuantity : public ProtectedAtomQuantity<T> {
public:
// constructor
SummedAtomicQuantity(ATC_Method * atcTransfer,
PerAtomQuantity<T> * quantity1,
PerAtomQuantity<T> * quantity2) :
ProtectedAtomQuantity<T>(atcTransfer, quantity1->nCols(), quantity1->atom_type()),
quantity1_(quantity1),
quantity2_(quantity2)
{
if (quantity1_->nCols() != quantity2_->nCols())
throw ATC_Error("SummedAtomicQuantity - dependencies do not have same number of columns");
if (quantity1_->atom_type() != quantity2_->atom_type())
throw ATC_Error("SummedAtomicQuantity - dependencies do not have same atom type");
quantity1_->register_dependence(this);
quantity2_->register_dependence(this);
};
// destructor
virtual ~SummedAtomicQuantity()
{
quantity1_->remove_dependence(this);
quantity2_->remove_dependence(this);
};
protected:
/** resets the data if necessary */
virtual void reset() const
{
if (this->need_reset()) {
PerAtomQuantity<T>::reset();
const DenseMatrix<T> & quantity1(quantity1_->quantity());
const DenseMatrix<T> & quantity2(quantity2_->quantity());
DenseMatrix<T> & myQuantity(this->quantity_);
myQuantity = quantity1;
myQuantity += quantity2;
}
};
/** first quantity */
PerAtomQuantity<T> * quantity1_;
/** second quantity */
PerAtomQuantity<T> * quantity2_;
private:
// do not define
SummedAtomicQuantity();
};
/**
* @class PerAtomDiagonalMatrix
* @brief Base class for objects that manage atomic diagonal matrices and their AtC interface
*/
template <typename T>
class PerAtomDiagonalMatrix : public MatrixDependencyManager<DiagonalMatrix, T> {
public:
// constructor
PerAtomDiagonalMatrix(ATC_Method * atc, AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomDiagonalMatrix();
/** access to a constant dense matrix of the quantity, indexed by prescribed counts */
virtual const DiagonalMatrix<T> & quantity() const
{reset(); return MatrixDependencyManager<DiagonalMatrix, T>::quantity();};
/** access to a non-constant dens matrix of the quantity, indexed by prescribed atom counts */
virtual DiagonalMatrix<T> & set_quantity()
{reset(); return MatrixDependencyManager<DiagonalMatrix, T>::set_quantity();}
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const DiagonalMatrix<T> & target) {PerAtomDiagonalMatrix<T>::reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator=(target);};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const DiagonalMatrix<T> & addition) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator+=(addition);};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator+=(addition);};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const DiagonalMatrix<T> & subtraction) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator-=(subtraction);};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtraction) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator-=(subtraction);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DiagonalMatrix<T> & multiplier) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DiagonalMatrix<T> & divisor) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator/=(divisor);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor) {this->reset(); MatrixDependencyManager<DiagonalMatrix, T>::operator/=(divisor);};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {this->set_lammps_to_quantity();};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {(this->quantity_).resize(atc_.nlocal()); this->set_quantity_to_lammps();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 1;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer);
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer);
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
/** returns per-atom size of communicated data */
virtual int size_comm() const {return 1;};
/** changes size of temperary lammps storage data if transfer is being used */
virtual void grow_lammps_array(int nmax, const std::string & tag);
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j);
/** access type of data this quantity is applied to */
AtomType atom_type() const {return atomType_;};
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {};
/** resets local storage */
virtual void reset_nlocal() { this->force_reset();}
protected:
/** utility object to access ATC methods */
PaqAtcUtility atc_;
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** type of atoms this quantity applies to */
AtomType atomType_;
/** map from this quantity's AtC indexing to Lammps indexing for atomic arrays */
const Array<int> & quantityToLammps_;
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).resize(atc_.nlocal()); this->needReset_ = false;}};
/** sets the quantity based on a lammps pointer */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const = 0;
/** point to lammps-style array for data */
T * lammpsScalar_;
private:
// do not define
PerAtomDiagonalMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtcAtomDiagonalMatrix
// A funcational base class for defining objects that
// manage diagonal matrices defined at atoms and their
// AtC interface that are defined by AtC classes
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class AtcAtomDiagonalMatrix : public PerAtomDiagonalMatrix<T> {
public:
// constructor
AtcAtomDiagonalMatrix(ATC_Method * atc,
AtomType atomType = INTERNAL) : PerAtomDiagonalMatrix<T>(atc,atomType) {};
// destructor
virtual ~AtcAtomDiagonalMatrix() {};
protected:
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T * lammps_scalar() const {return this->lammpsScalar_;};
private:
// do not define
AtcAtomDiagonalMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedAtomDiagonalMatrix
// A base class for defining objects that manage
// diagonal matrixes defined at atoms internally and
// do not allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedAtomDiagonalMatrix : public AtcAtomDiagonalMatrix<T> {
public:
// constructor
ProtectedAtomDiagonalMatrix(ATC_Method * atc,
AtomType atomType = INTERNAL)
: AtcAtomDiagonalMatrix<T>(atc, atomType) {};
// destructor
virtual ~ProtectedAtomDiagonalMatrix() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual DiagonalMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedAtomDiagonalMatrix::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const DiagonalMatrix<T> & /* target */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & /* target */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const DiagonalMatrix<T> & /* addition */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T /* addition */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const DiagonalMatrix<T> & /* subtraction */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T /* subtraction */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const DiagonalMatrix<T> & /* multiplier */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T /* multiplier */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const DiagonalMatrix<T> & /* divisor */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T /* divisor */)
{throw ATC_Error("ProtectedAtomDiagonalMatrix::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {this->reset(); PerAtomDiagonalMatrix<T>::set_lammps_to_quantity();};
private:
// do not define
ProtectedAtomDiagonalMatrix();
};
/**
* @class PerAtomSparseMatrix
* @brief Base class for objects that manage atomic sparse matrices and their AtC interface
*/
template <typename T>
class PerAtomSparseMatrix : public MatrixDependencyManager<SparseMatrix, T> {
public:
// constructor
PerAtomSparseMatrix(ATC_Method * atc, int nCols = 1, int maxEntriesPerRow = 1, AtomType atomType = INTERNAL);
// destructor
virtual ~PerAtomSparseMatrix();
/** access to a constant dense matrix of the quantity, indexed by prescribed counts */
virtual const SparseMatrix<T> & quantity() const
{reset(); return MatrixDependencyManager<SparseMatrix, T>::quantity();};
/** access to a non-constant dens matrix of the quantity, indexed by prescribed atom counts */
virtual SparseMatrix<T> & set_quantity()
{reset(); return MatrixDependencyManager<SparseMatrix, T>::set_quantity();}
/** number of columns in quantity */
INDEX nCols() const {return nCols_;};
/** maximum number of entries per row */
INDEX max_entries_per_row() const {return maxEntriesPerRow_;};
/** sets the Lammps quantity to a given value, input is indexed by AtC atom counts */
virtual void operator=(const SparseMatrix<T> & target) {PerAtomSparseMatrix<T>::reset(); MatrixDependencyManager<SparseMatrix, T>::operator=(target);};
/** adds the given data to the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator+=(const SparseMatrix<T> & addition) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator+=(addition);};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T addition) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator+=(addition);};
/** subtracts the given data from the Lammps quantity, input is indexed by AtC atom counts */
virtual void operator-=(const SparseMatrix<T> & subtraction) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator-=(subtraction);};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(double subtraction) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator-=(subtraction);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T multiplier) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator*=(multiplier);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const SparseMatrix<T> & divisor) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator/=(divisor);};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T divisor) {reset(); MatrixDependencyManager<SparseMatrix, T>::operator/=(divisor);};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {this->set_lammps_to_quantity();};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {(this->quantity_).reset(atc_.nlocal(),nCols_); this->set_quantity_to_lammps();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 2*maxEntriesPerRow_;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int i, double *buffer);
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int i, double *buffer);
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int index, double *buf,
int pbc_flag, int *pbc);
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int index, double *buf);
/** returns per-atom size of communicated data */
virtual int size_comm() const {return 2*maxEntriesPerRow_;};
/** changes size of temperary lammps storage data if transfer is being used */
virtual void grow_lammps_array(int nmax, const std::string & tag);
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int i, int j);
/** access type of data this quantity is applied to */
AtomType atom_type() const {return atomType_;};
/** specialized reset to account for quantities which lammps can change */
virtual void lammps_force_reset() {};
/** resets local storage */
virtual void reset_nlocal() { this->set_reset();};
protected:
/** utility object to access ATC methods */
PaqAtcUtility atc_;
/** pointer to access Lammps data */
LammpsInterface * lammpsInterface_;
/** type of atoms this quantity applies to */
AtomType atomType_;
/** number of columns of the per atom quantity, must be defined in derived class */
int nCols_;
/** maximum number of entries that can be stored in a row */
int maxEntriesPerRow_;
/** map from this quantity's AtC indexing to Lammps indexing for atomic arrays */
const Array<int> & quantityToLammps_;
/** resets data, if necessary */
virtual void reset() const {if (this->needReset_) {(this->quantity_).reset(atc_.nlocal(),nCols_); this->needReset_ = false;}};
/** sets the quantity based on a lammps pointer */
virtual void set_lammps_to_quantity() const;
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const;
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const = 0;
/** gets appropriate data for lammps pointer to column indices */
virtual int ** lammps_column_indices() const = 0;
/** pointer to lammps-style double array for data */
T ** lammpsVector_;
/** stores column indices in lammps-style array */
int ** lammpsColIndices_;
// workspace
mutable DenseVector<T> _values_;
mutable DenseVector<INDEX> _colIndices_;
private:
// do not define
PerAtomSparseMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class AtcAtomSparseMatrix
// A funcational base class for defining objects that
// manage sparse matrices defined at atoms and their
// AtC interface that are defined by AtC classes
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class AtcAtomSparseMatrix : public PerAtomSparseMatrix<T> {
public:
// constructor
AtcAtomSparseMatrix(ATC_Method * atc,
int nCols = 1, int maxEntriesPerRow = 1,
AtomType atomType = INTERNAL) :
PerAtomSparseMatrix<T>(atc,nCols,maxEntriesPerRow,atomType) {};
// destructor
virtual ~AtcAtomSparseMatrix() {};
protected:
// these get the appropriate pointer to local data mimicing lammps storage
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return this->lammpsVector_;};
/** gets appropriate data for lammps pointer to column indices */
virtual int ** lammps_column_indices() const {return this->lammpsColIndices_;};
private:
// do not define
AtcAtomSparseMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedAtomSparseMatrix
// A base class for defining objects that manage
// sparse matrixes defined at atoms internally and
// do not allow for reset externally
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedAtomSparseMatrix : public AtcAtomSparseMatrix<T> {
public:
// constructor
ProtectedAtomSparseMatrix(ATC_Method * atc,
int nCols = 1, int maxEntriesPerRow = 1,
AtomType atomType = INTERNAL)
: AtcAtomSparseMatrix<T>(atc, nCols, maxEntriesPerRow, atomType) {};
// destructor
virtual ~ProtectedAtomSparseMatrix() {};
/** returns a non-const version for manipulations and changes, resets dependent quantities */
virtual SparseMatrix<T> & set_quantity()
{throw ATC_Error("ProtectedAtomSparseMatrix::set_quantity - Cannot modify protected per atom quantities"); return this->quantity_;};
/** sets the quantity to a given value */
virtual void operator=(const SparseMatrix<T> & /* target */)
{throw ATC_Error("ProtectedAtomSparseMatrix::set_quantity - Cannot modify protected per atom quantities");};
/** sets the quantity to a given constant value */
virtual void operator=(const T & /* target */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator= - Cannot modify protected per atom quantities");};
/** adds the given data to the Lammps quantity */
virtual void operator+=(const SparseMatrix<T> & /* addition */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator+= - Cannot modify protected per atom quantities");};
/** adds the scalar data to the Lammps quantity for AtC atoms */
virtual void operator+=(T /* addition */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator+= - Cannot modify protected per atom quantities");};
/** subtracts the given data from the Lammps quantity */
virtual void operator-=(const SparseMatrix<T> & /* subtraction */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator-= - Cannot modify protected per atom quantities");};
/** subtracts the scalar data from the Lammps quantity for AtC atoms */
virtual void operator-=(T /* subtraction */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator-= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(const SparseMatrix<T> & /* multiplier */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator*=(T /* multiplier */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator*= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(const SparseMatrix<T> & /* divisor */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator/= - Cannot modify protected per atom quantities");};
/** multiples the Lammps quantity by the given data, input is indexed in AtC atom counts */
virtual void operator/=(T /* divisor */)
{throw ATC_Error("ProtectedAtomSparseMatrix::operator/= - Cannot modify protected per atom quantities");};
protected:
/** resets the data if necessary */
virtual void reset() const = 0;
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {this->reset(); PerAtomSparseMatrix<T>::set_lammps_to_quantity();};
private:
// do not define
ProtectedAtomSparseMatrix();
};
//--------------------------------------------------------
//--------------------------------------------------------
// Class ProtectedMappedSparseMatrix
// A base class for defining objects that manage
// sparse matrices defined at atoms internally and do
// not allow for reset externally, but are mapped in
// at least one of their dimensions
//--------------------------------------------------------
//--------------------------------------------------------
template <typename T>
class ProtectedMappedAtomSparseMatrix : public ProtectedAtomSparseMatrix<T> {
public:
// constructor
ProtectedMappedAtomSparseMatrix(ATC_Method * atc,
int nCols = 1,
int maxEntriesPerRow = 1,
AtomType atomType = INTERNAL)
: ProtectedAtomSparseMatrix<T>(atc, nCols, maxEntriesPerRow, atomType)
{};
// destructor
virtual ~ProtectedMappedAtomSparseMatrix() {};
/** sets quantity to lammps data, if needed, should be called in pre_exchange */
virtual void prepare_exchange() {};
/** resets AtC local quantity after exchange */
virtual void post_exchange() {this->set_reset();};
/** returns how much lammps memory is used in this function */
virtual int memory_usage() const {return 0;};
/** packs up data for parallel transfer when atoms change processors */
virtual int pack_exchange(int /* i */, double * /* buffer */) {return 0;};
/** unpacks data after parallel transfer when atoms change processors */
virtual int unpack_exchange(int /* i */, double * /* buffer */) {return 0;};
// pack/unpack_comm only valid if the quantity is over all real and processor ghost atoms
/** packs up data for parallel transfer to ghost atoms on other processors */
virtual int pack_comm(int /* index */, double * /* buf */,
int /* pbc_flag */, int * /* pbc */) {return 0;};
/** unpacks data after parallel transfer to ghost atoms on other processors */
virtual int unpack_comm(int /* index */, double * /* buf */) {return 0;};
/** returns per-atom size of communicated data */
virtual int size_comm() const {return 0;};
/** changes size of temperary lammps storage data if transfer is being used */
virtual void grow_lammps_array(int /* nmax */, const std::string & /* tag */) {};
/** rearrange memory of temporary lammps storage data, called from copy_array */
virtual void copy_lammps_array(int /* i */, int /* j */) {};
protected:
// methods
/** sets lammps data based on the quantity */
virtual void set_lammps_to_quantity() const {};
/** sets the quantity based on a lammps pointer */
virtual void set_quantity_to_lammps() const {};
/** gets appropriate data for lammps pointer */
virtual T ** lammps_vector() const {return NULL;};
/** gets appropriate data for lammps pointer to column indices */
virtual int ** lammps_column_indices() const {return NULL;};
private:
// do not define
ProtectedMappedAtomSparseMatrix();
};
}
#include "PerAtomQuantity-inl.h"
#endif