00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <ScalarFunctionDerivative.hpp>
00021 #include <ErrorHandler.hpp>
00022
00023 std::ostream&
00024 ScalarFunctionDerivative::
00025 __put(std::ostream& os) const
00026 {
00027 switch(__direction) {
00028 case ScalarFunctionDerivative::x: {
00029 os << "dx(";
00030 break;
00031 }
00032 case ScalarFunctionDerivative::y: {
00033 os << "dy(";
00034 break;
00035 }
00036 case ScalarFunctionDerivative::z: {
00037 os << "dz(";
00038 break;
00039 }
00040 default: {
00041 throw ErrorHandler(__FILE__,__LINE__,
00042 "unknown derivative direction",
00043 ErrorHandler::unexpected);
00044 }
00045 }
00046 os << *__functionToDerive << ')';
00047 return os;
00048 }
00049
00050
00051 real_t
00052 ScalarFunctionDerivative::
00053 operator()(const TinyVector<3, real_t>& X) const
00054 {
00055 switch(__direction) {
00056 case ScalarFunctionDerivative::x: {
00057 return __functionToDerive->dx(X);
00058 }
00059 case ScalarFunctionDerivative::y: {
00060 return __functionToDerive->dy(X);
00061 break;
00062 }
00063 case ScalarFunctionDerivative::z: {
00064 return __functionToDerive->dz(X);
00065 break;
00066 }
00067 default: {
00068 throw ErrorHandler(__FILE__,__LINE__,
00069 "unknown derivative direction",
00070 ErrorHandler::unexpected);
00071 }
00072 }
00073 return 0;
00074 }
00075
00076 ScalarFunctionDerivative::
00077 ScalarFunctionDerivative(const ScalarFunctionDerivative::Direction& direction,
00078 ConstReferenceCounting<ScalarFunctionBase> functionToDerive)
00079 : ScalarFunctionBase(ScalarFunctionBase::derivate),
00080 __direction(direction)
00081 {
00082 switch(functionToDerive->type()) {
00083 case ScalarFunctionBase::femfunction:
00084 case ScalarFunctionBase::spectral: {
00085 const ScalarFunctionBase* f = functionToDerive;
00086 __functionToDerive = f;
00087 break;
00088 }
00089 default:
00090 if (functionToDerive->type() != ScalarFunctionBase::femfunction) {
00091 std::stringstream errorMsg;
00092
00093 errorMsg << "cannot compute derivative of non discrete functions :-(\n";
00094 errorMsg << "the function " << (*functionToDerive) << " is not of that kind"
00095 << std::ends;
00096
00097 throw ErrorHandler(__FILE__,__LINE__,
00098 errorMsg.str(),
00099 ErrorHandler::normal);
00100
00101 }
00102 }
00103 }
00104
00105 ScalarFunctionDerivative::
00106 ScalarFunctionDerivative(const ScalarFunctionDerivative& f)
00107 : ScalarFunctionBase(f),
00108 __direction(f.__direction),
00109 __functionToDerive(f.__functionToDerive)
00110 {
00111 ;
00112 }
00113
00114 ScalarFunctionDerivative::
00115 ~ScalarFunctionDerivative()
00116 {
00117 ;
00118 }