|
Rythmos - Transient Integration for Differential Equations
Version of the Day
|
00001 //@HEADER 00002 // *********************************************************************** 00003 // 00004 // Rythmos Package 00005 // Copyright (2006) Sandia Corporation 00006 // 00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00008 // license for use of this work by or on behalf of the U.S. Government. 00009 // 00010 // This library is free software; you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as 00012 // published by the Free Software Foundation; either version 2.1 of the 00013 // License, or (at your option) any later version. 00014 // 00015 // This library is distributed in the hope that it will be useful, but 00016 // WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 // Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public 00021 // License along with this library; if not, write to the Free Software 00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 00023 // USA 00024 // Questions? Contact Todd S. Coffey (tscoffe@sandia.gov) 00025 // 00026 // *********************************************************************** 00027 //@HEADER 00028 00029 #ifndef RYTHMOS_INTERPOLATION_BUFFER_APPENDER_BASE_HPP 00030 #define RYTHMOS_INTERPOLATION_BUFFER_APPENDER_BASE_HPP 00031 00032 #include "Rythmos_InterpolationBufferBase.hpp" 00033 #include "Rythmos_Types.hpp" 00034 #include "Thyra_VectorBase.hpp" 00035 #include "Teuchos_Describable.hpp" 00036 #include "Teuchos_ParameterListAcceptor.hpp" 00037 #include "Teuchos_VerboseObject.hpp" 00038 #include "Teuchos_RCP.hpp" 00039 #include "Teuchos_implicit_cast.hpp" 00040 #include "Teuchos_Assert.hpp" 00041 00042 00043 namespace Rythmos { 00044 00045 00049 template<class Scalar> 00050 class InterpolationBufferAppenderBase 00051 : virtual public Teuchos::Describable 00052 , virtual public Teuchos::ParameterListAcceptor 00053 , virtual public Teuchos::VerboseObject<InterpolationBufferAppenderBase<Scalar> > 00054 { 00055 public: 00056 00082 virtual void append( 00083 const InterpolationBufferBase<Scalar>& interpBuffSource, 00084 const TimeRange<Scalar>& range, 00085 const Ptr<InterpolationBufferBase<Scalar> > &interpBuffSink 00086 ) =0; 00087 00088 protected: 00089 00091 void assertAppendPreconditions( 00092 const InterpolationBufferBase<Scalar>& interpBuffSource, 00093 const TimeRange<Scalar>& range, 00094 const InterpolationBufferBase<Scalar>& interpBuffSink 00095 ) const; 00096 00097 }; 00098 00099 00100 template<class Scalar> 00101 void InterpolationBufferAppenderBase<Scalar>::assertAppendPreconditions( 00102 const InterpolationBufferBase<Scalar>& interpBuffSource, 00103 const TimeRange<Scalar>& appendRange, 00104 const InterpolationBufferBase<Scalar>& interpBuffSink 00105 ) const 00106 { 00107 // If the time range of interpBuffSink is invalid, then its just empty 00108 if (interpBuffSink.getTimeRange().isValid()) { 00109 // Allow the appendRange to sit completely outside the sink range (04/22/09 tscoffe) 00110 // appendRange overlaps at lower end of sink range: 00111 TEUCHOS_TEST_FOR_EXCEPTION( 00112 ( compareTimeValues(appendRange.lower(),interpBuffSink.getTimeRange().lower()) < 0 && 00113 compareTimeValues(appendRange.upper(),interpBuffSink.getTimeRange().lower()) > 0 ), 00114 std::logic_error, 00115 "Error, import range = [" << appendRange.lower() << "," << appendRange.upper() << "] is not a prepend " 00116 "of the base range = [" << interpBuffSink.getTimeRange().lower() << "," << interpBuffSink.getTimeRange().upper() << "] " 00117 "interpolation buffer.\n" 00118 ); 00119 // appendRange overlaps at upper end of sink range: 00120 TEUCHOS_TEST_FOR_EXCEPTION( 00121 ( compareTimeValues(appendRange.lower(),interpBuffSink.getTimeRange().upper()) < 0 && 00122 compareTimeValues(appendRange.upper(),interpBuffSink.getTimeRange().upper()) > 0 ), 00123 std::logic_error, 00124 "Error, import range = [" << appendRange.lower() << "," << appendRange.upper() << "] is not an append " 00125 "of the base range = [" << interpBuffSink.getTimeRange().lower() << "," << interpBuffSink.getTimeRange().upper() << "] " 00126 "interpolation buffer.\n" 00127 ); 00128 } 00129 TEUCHOS_TEST_FOR_EXCEPTION( 00130 compareTimeValues(appendRange.lower(),interpBuffSource.getTimeRange().lower())<0, 00131 std::logic_error, 00132 "Error, append range's lower bound = " << appendRange.lower() << " does not sit inside incoming" 00133 " interpolation buffer's time range = " 00134 "[" << interpBuffSource.getTimeRange().lower() << "," << interpBuffSource.getTimeRange().upper() << "].\n" 00135 ); 00136 TEUCHOS_TEST_FOR_EXCEPTION( 00137 compareTimeValues(interpBuffSource.getTimeRange().upper(),appendRange.upper())<0, 00138 std::logic_error, 00139 "Error, append range's upper bound = " << appendRange.upper() << "does not sit inside incoming" 00140 " interpolation buffer's time range = " 00141 "[" << interpBuffSource.getTimeRange().lower() << "," << interpBuffSource.getTimeRange().upper() << "].\n" 00142 ); 00143 } 00144 00145 00146 } // namespace Rythmos 00147 00148 00149 #endif //RYTHMOS_INTERPOLATION_BUFFER_APPENDER_BASE_HPP
1.7.6.1