00001 /* @HEADER@ */ 00002 // ************************************************************************ 00003 // 00004 // Sundance 00005 // Copyright (2005) Sandia Corporation 00006 // 00007 // Copyright (year first published) Sandia Corporation. Under the terms 00008 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 00009 // retains certain rights in this software. 00010 // 00011 // This library is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Lesser General Public License as 00013 // published by the Free Software Foundation; either version 2.1 of the 00014 // License, or (at your option) any later version. 00015 // 00016 // This library is distributed in the hope that it will be useful, but 00017 // WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00019 // Lesser General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Lesser General Public 00022 // License along with this library; if not, write to the Free Software 00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00024 // USA 00025 // Questions? Contact Kevin Long (krlong@sandia.gov), 00026 // Sandia National Laboratories, Livermore, California, USA 00027 // 00028 // ************************************************************************ 00029 /* @HEADER@ */ 00030 00031 #ifndef SUNDANCE_SUMEXPR_H 00032 #define SUNDANCE_SUMEXPR_H 00033 00034 #include "SundanceBinaryExpr.hpp" 00035 #include "SundanceSumEvaluator.hpp" 00036 00037 namespace Sundance 00038 { 00039 using namespace Sundance; 00040 using namespace Teuchos; 00041 00042 00043 00044 /** 00045 * SumExpr is the internal representation of an addition or subtraction 00046 * node in the expression tree. 00047 */ 00048 class SumExpr : public BinaryExpr, 00049 public GenericEvaluatorFactory<SumExpr, SumEvaluator> 00050 { 00051 public: 00052 /** */ 00053 SumExpr(const RCP<ScalarExpr>& a, 00054 const RCP<ScalarExpr>& b, int sign); 00055 00056 /** virtual dtor */ 00057 virtual ~SumExpr() {;} 00058 00059 /** */ 00060 virtual bool isHungryDiffOp() const ; 00061 00062 /** */ 00063 virtual bool isLinear() const {return true;} 00064 00065 00066 00067 /** 00068 * Indicate whether the expression is linear 00069 * with respect to test functions */ 00070 virtual bool isLinearInTests() const ; 00071 00072 /** 00073 * Indicate whether every term in the expression contains test functions */ 00074 virtual bool everyTermHasTestFunctions() const ; 00075 00076 00077 /** Indicate whether the expression is linear in the given 00078 * functions */ 00079 virtual bool isLinearForm(const Expr& u) const ; 00080 00081 /** Indicate whether the expression is a 00082 * quadratic form in the given functions */ 00083 virtual bool isQuadraticForm(const Expr& u) const ; 00084 00085 /** */ 00086 virtual RCP<ExprBase> getRcp() {return rcp(this);} 00087 00088 /** */ 00089 const Map<Expr, int>& getSumTree() const {return sumTree_;} 00090 00091 protected: 00092 /** */ 00093 virtual bool parenthesizeSelf() const {return true;} 00094 /** */ 00095 virtual bool parenthesizeOperands() const {return false;} 00096 /** */ 00097 virtual const std::string& xmlTag() const ; 00098 /** */ 00099 virtual const std::string& opChar() const ; 00100 00101 private: 00102 Map<Expr, int> sumTree_; 00103 00104 00105 }; 00106 } 00107 #endif