2
// ************************************************************************
5
// Copyright (2005) Sandia Corporation
7
// Copyright (year first published) Sandia Corporation. Under the terms
8
// of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
9
// retains certain rights in this software.
11
// This library is free software; you can redistribute it and/or modify
12
// it under the terms of the GNU Lesser General Public License as
13
// published by the Free Software Foundation; either version 2.1 of the
14
// License, or (at your option) any later version.
16
// This library is distributed in the hope that it will be useful, but
17
// WITHOUT ANY WARRANTY; without even the implied warranty of
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19
// Lesser General Public License for more details.
21
// You should have received a copy of the GNU Lesser General Public
22
// License along with this library; if not, write to the Free Software
23
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25
// Questions? Contact Kevin Long (krlong@sandia.gov),
26
// Sandia National Laboratories, Livermore, California, USA
28
// ************************************************************************
31
#ifndef SUNDANCE_ALGEBRASPECIFIER_HPP
32
#define SUNDANCE_ALGEBRASPECIFIER_HPP
34
#include "SundanceEnumTypeField.hpp"
36
namespace SundanceCore
38
using namespace SundanceUtils;
41
enum AlgebraType {VectorAT, NormalAT, CoordCompAT, ScalarAT};
43
/** AlgebraSpecifier is used to indicate whether a given object represents
44
* a vector, scalar, component of a vector, etc.
46
class AlgebraSpecifier : public EnumTypeField<AlgebraType>
53
AlgebraSpecifier(int direction);
56
AlgebraSpecifier(const AlgebraType& vct);
58
/** Return true iff I am a scalar */
59
bool isScalar() const {return isType(ScalarAT);}
61
/** Return true iff I am a normal component of a vector */
62
bool isNormal() const {return isType(NormalAT);}
64
/** Return true iff I am a vector */
65
bool isVector() const {return isType(VectorAT);}
67
/** Return true iff I am a coordinate component of a vector */
68
bool isCoordinateComponent() const {return isType(CoordCompAT);}
70
/** Return coordinate direction if I am a coordinate component,
71
* otherwise, throw an exception. */
72
int direction() const ;
74
/** Write a string representation */
75
std::string toString() const ;
77
/** Comparison operator for use in sorted containers */
78
bool operator<(const AlgebraSpecifier& other) const ;
84
/** \relates AlgebraSpecifier */
85
AlgebraSpecifier vectorAlgebraSpec();
87
/** \relates AlgebraSpecifier */
88
AlgebraSpecifier scalarAlgebraSpec();
90
/** \relates AlgebraSpecifier */
91
AlgebraSpecifier normalAlgebraSpec();
93
/** \relates AlgebraSpecifier */
94
AlgebraSpecifier coordAlgebraSpec(int dir);
101
/** \relates AlgebraSpecifier */
102
ostream& operator<<(ostream& os, const SundanceCore::AlgebraSpecifier& vcs);
103
/** \relates AlgebraSpecifier */
104
ostream& operator<<(ostream& os, const SundanceCore::AlgebraType& vct);