Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F100717043
util.hpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Feb 2, 03:53
Size
6 KB
Mime Type
text/x-c
Expires
Tue, Feb 4, 03:53 (2 d)
Engine
blob
Format
Raw Data
Handle
24017176
Attached To
rLAMMPS lammps
util.hpp
View Options
#pragma once
#ifndef __UTIL_HPP__
#define __UTIL_HPP__
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <memory>
#include <cmath>
#include <complex>
#include <limits>
/// \file util.hpp
/// \brief Utility functions and constant integer class like an enum class.
/// \author Kyungjoo Kim (kyukim@sandia.gov)
///
/// This provides utility functions for implementing mini-app for incomplete
/// sparse matrix factorization with task-data parallelism e.g., parameter
/// classes, error handling, ostream << overloading.
///
/// Note: The reference of the "static const int" members in the enum-like
/// classes should not be used as function arguments but their values only.
using namespace std;
namespace Tacho {
#undef CHKERR
#define CHKERR(ierr) \
if (ierr != 0) { cout << endl << ">> Error in " << __FILE__ << ", " << __LINE__ << " : " << ierr << endl; }
#define MSG_NOT_YET_IMPLEMENTED ">> Not yet implemented"
#define MSG_INVALID_INPUT(what) ">> Invaid input argument: " #what
#define MSG_INVALID_TEMPLATE_ARGS ">> Invaid template arguments"
#define ERROR(msg) \
{ cout << endl << ">> Error in " << __FILE__ << ", " << __LINE__ << endl << msg << endl; }
// control id
#undef Ctrl
#define Ctrl(name,algo,variant) name<algo,variant>
// control leaf
#undef CtrlComponent
#define CtrlComponent(name,algo,variant,component,id) \
Ctrl(name,algo,variant)::component[id]
// control recursion
#undef CtrlDetail
#define CtrlDetail(name,algo,variant,component) \
CtrlComponent(name,algo,variant,component,0),CtrlComponent(name,algo,variant,component,1),name
/// \class GraphHelper
class GraphHelper {
public:
static const int DefaultRandomSeed = -1;
};
/// \class Partition
/// \brief Matrix partition parameters.
class Partition {
public:
static const int Top = 101;
static const int Bottom = 102;
static const int Left = 201;
static const int Right = 202;
static const int TopLeft = 401;
static const int TopRight = 402;
static const int BottomLeft = 403;
static const int BottomRight = 404;
};
/// \class Uplo
/// \brief Matrix upper/lower parameters.
class Uplo {
public:
static const int Upper = 501;
static const int Lower = 502;
};
/// \class Side
/// \brief Matrix left/right parameters.
class Side {
public:
static const int Left = 601;
static const int Right = 602;
};
/// \class Diag
/// \brief Matrix unit/non-unit diag parameters.
class Diag {
public:
static const int Unit = 701;
static const int NonUnit = 702;
};
/// \class Trans
/// \brief Matrix upper/lower parameters.
class Trans {
public:
static const int Transpose = 801;
static const int ConjTranspose = 802;
static const int NoTranspose = 803;
};
/// \class Loop
/// \brief outer/innner parameters
class Loop {
public:
static const int Outer = 901;
static const int Inner = 902;
static const int Fused = 903;
};
class Variant {
public:
static const int One = 1;
static const int Two = 2;
static const int Three = 3;
static const int Four = 4;
};
/// \class AlgoChol
/// \brief Algorithmic variants in sparse factorization and sparse BLAS operations.
class AlgoChol {
public:
// One side factorization on flat matrices
static const int Dummy = 1000;
static const int Unblocked = 1001;
static const int UnblockedOpt = 1002;
static const int Blocked = 1101; // testing only
static const int RightLookByBlocks = 1201; // backbone structure is right looking
static const int ByBlocks = RightLookByBlocks;
static const int NestedDenseBlock = 1211;
static const int NestedDenseByBlocks = 1212;
static const int RightLookDenseByBlocks = 1221;
static const int DenseByBlocks = RightLookDenseByBlocks;
static const int ExternalLapack = 1231;
static const int ExternalPardiso = 1232;
};
// aliasing name space
typedef AlgoChol AlgoTriSolve;
class AlgoBlasLeaf {
public:
// One side factorization on flat matrices
static const int ForFactorBlocked = 2001;
// B and C are dense matrices and used for solve phase
static const int ForTriSolveBlocked = 2011;
static const int ExternalBlas = 2021;
};
class AlgoGemm : public AlgoBlasLeaf {
public:
static const int DenseByBlocks = 2101;
};
class AlgoTrsm : public AlgoBlasLeaf {
public:
static const int DenseByBlocks = 2201;
};
class AlgoHerk : public AlgoBlasLeaf {
public:
static const int DenseByBlocks = 2301;
};
/// \brief Interface for overloaded stream operators.
template<typename T>
inline
ostream& operator<<(ostream &os, const unique_ptr<T> &p) {
return p->showMe(os);
}
/// \class Disp
/// \brief Interface for the stream operator.
class Disp {
friend ostream& operator<<(ostream &os, const Disp &disp);
public:
Disp() { }
virtual ostream& showMe(ostream &os) const {
return os;
}
};
/// \brief Implementation of the overloaded stream operator.
inline
ostream& operator<<(ostream &os, const Disp &disp) {
return disp.showMe(os);
}
template<typename T> struct NumericTraits {};
template<>
struct NumericTraits<float> {
typedef float real_type;
static real_type epsilon() { return numeric_limits<float>::epsilon(); }
};
template<>
struct NumericTraits<double> {
typedef double real_type;
static real_type epsilon() { return numeric_limits<double>::epsilon(); }
};
template<>
struct NumericTraits<complex<float> > {
typedef float real_type;
static real_type epsilon() { return numeric_limits<float>::epsilon(); }
};
template<>
struct NumericTraits<complex<double> > {
typedef double real_type;
static real_type epsilon() { return numeric_limits<double>::epsilon(); }
};
}
#endif
Event Timeline
Log In to Comment