SundanceUserDefFunctor.hpp
Go to the documentation of this file.
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_USERDEFFUNCTOR_H
00032 #define SUNDANCE_USERDEFFUNCTOR_H
00033 
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceMap.hpp"
00036 #include "SundanceMultiSet.hpp"
00037 #include "PlayaExceptions.hpp"
00038 #include "Teuchos_Array.hpp"
00039 #include "Teuchos_RefCountPtr.hpp"
00040 
00041 
00042 
00043 namespace Sundance
00044 {
00045 using namespace Sundance;
00046 using namespace Teuchos;
00047 
00048 
00049 
00050 
00051 class EvalVector;
00052 class EvalManager;
00053 
00054 /**
00055  * UserDefFunctor defines an interface for callbacks used to implement
00056  * user-defined nonlinear operators in the Sundance Expr system.
00057  */
00058 class UserDefFunctor
00059 {
00060 public:
00061   /** ctor */
00062   UserDefFunctor(const std::string& name, int domainDim, int rangeDim) ;
00063 
00064   /** */
00065   virtual ~UserDefFunctor(){;}
00066 
00067   /** */
00068   const std::string& name(int elemIndex) const {return elemNames_[elemIndex];}
00069 
00070   /** */
00071   const std::string& name() const {return name_;}
00072 
00073 
00074   /** */
00075   virtual void evaluationCallback(int nPoints, int maxDiffOrder,
00076     const double** in,
00077     double** out) const = 0 ;
00078 
00079   /** */
00080   virtual void eval0(const Array<double>& in, double* outVals) const ;
00081 
00082   /**
00083    * Evaluate the expression and its derivative. The values should be put into
00084    * the outVals array. The derivatives should be put into the outDerivs array,
00085    * ordered with the domain index running fastest. That is, 
00086    * \f[
00087    * outDerivs[i*N_R + j] = \frac{\partial F_i}{\partial q_j}
00088    * \f]
00089    */
00090   virtual void eval1(const Array<double>& in, double* outVals, 
00091     double* outDerivs) const ;
00092 
00093     
00094 
00095   /** */
00096   int domainDim() const {return domainDim_;}
00097 
00098   /** */
00099   int rangeDim() const {return rangeDim_;}
00100 
00101   /** */
00102   virtual int maxOrder() const = 0 ;
00103 
00104   /** */
00105   void reset() const ;
00106 
00107 private:
00108   const std::string name_;
00109   Array<string> elemNames_;
00110   const int domainDim_;
00111   const int rangeDim_;
00112 };
00113 
00114 
00115 }
00116 
00117 
00118 #endif

Site Contact