|
RTOp Package Browser (Single Doxygen Collection)
Version of the Day
|
00001 // @HEADER 00002 // *********************************************************************** 00003 // 00004 // RTOp: Interfaces and Support Software for Vector Reduction Transformation 00005 // Operations 00006 // Copyright (2006) Sandia Corporation 00007 // 00008 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00009 // license for use of this work by or on behalf of the U.S. Government. 00010 // 00011 // Redistribution and use in source and binary forms, with or without 00012 // modification, are permitted provided that the following conditions are 00013 // met: 00014 // 00015 // 1. Redistributions of source code must retain the above copyright 00016 // notice, this list of conditions and the following disclaimer. 00017 // 00018 // 2. Redistributions in binary form must reproduce the above copyright 00019 // notice, this list of conditions and the following disclaimer in the 00020 // documentation and/or other materials provided with the distribution. 00021 // 00022 // 3. Neither the name of the Corporation nor the names of the 00023 // contributors may be used to endorse or promote products derived from 00024 // this software without specific prior written permission. 00025 // 00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00037 // 00038 // Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov) 00039 // 00040 // *********************************************************************** 00041 // @HEADER 00042 00043 00044 #ifndef RTOPPACK_TYPES_HPP 00045 #define RTOPPACK_TYPES_HPP 00046 00047 00048 #include "RTOp_ConfigDefs.hpp" 00049 #include "Teuchos_Array.hpp" 00050 #include "Teuchos_RCP.hpp" 00051 #include "Teuchos_ArrayRCP.hpp" 00052 #include "Teuchos_Range1D.hpp" 00053 #include "Teuchos_ScalarTraits.hpp" 00054 #include "Teuchos_TypeNameTraits.hpp" 00055 #include "Teuchos_Assert.hpp" 00056 #include "Teuchos_implicit_cast.hpp" 00057 00058 00059 namespace RTOpPack { 00060 00061 00062 // 00063 // Basic types 00064 // 00065 00067 typedef Teuchos_Ordinal Ordinal; 00069 using Teuchos::Ptr; 00071 using Teuchos::RCP; 00073 using Teuchos::ArrayRCP; 00075 using Teuchos::ArrayView; 00077 using Teuchos::Array; 00079 using Teuchos::Range1D; 00081 using Teuchos::ScalarTraits; 00083 using Teuchos::TypeNameTraits; 00084 00086 typedef Teuchos_Ordinal index_type; 00088 typedef char char_type; 00089 00090 00091 // 00092 // Exceptions 00093 // 00094 00095 00097 class UnknownError : public std::logic_error 00098 {public: UnknownError(const std::string& what_arg) : std::logic_error(what_arg) {}}; 00100 class InvalidUsage : public std::logic_error 00101 {public: InvalidUsage(const std::string& what_arg) : std::logic_error(what_arg) {}}; 00103 class InvalidNumVecs : public std::logic_error 00104 {public: InvalidNumVecs(const std::string& what_arg) : std::logic_error(what_arg) {}}; 00106 class InvalidNumTargVecs : public std::logic_error 00107 {public: InvalidNumTargVecs(const std::string& what_arg) : std::logic_error(what_arg) {}}; 00109 class IncompatibleVecs : public std::logic_error 00110 {public: IncompatibleVecs(const std::string& what_arg) : std::logic_error(what_arg) {}}; 00112 class IncompatibleReductObj : public std::logic_error 00113 {public: IncompatibleReductObj(const std::string& what_arg) : std::logic_error(what_arg) {}}; 00114 00115 00116 // 00117 // VectorBase subviews 00118 // 00119 00120 00140 template<class Scalar> 00141 class ConstSubVectorView { 00142 public: 00144 ConstSubVectorView() : globalOffset_(0), subDim_(0), stride_(0) {} 00146 ConstSubVectorView(const ArrayRCP<const Scalar> &values_in) 00147 :globalOffset_(0), subDim_(0), stride_(0) 00148 { initialize(0, values_in.size(), values_in, 1); } 00150 ConstSubVectorView(Ordinal globalOffset_in, Ordinal subDim_in, 00151 const ArrayRCP<const Scalar> &values_in, ptrdiff_t stride_in) 00152 :globalOffset_(0), subDim_(0), stride_(0) 00153 { initialize(globalOffset_in, subDim_in, values_in, stride_in); } 00155 ConstSubVectorView( const ConstSubVectorView<Scalar>& sv ) 00156 :globalOffset_(sv.globalOffset()), subDim_(sv.subDim()), 00157 values_(sv.values()), stride_(sv.stride()) 00158 {} 00160 void initialize(Ordinal globalOffset_in, Ordinal subDim_in, 00161 const ArrayRCP<const Scalar> &values_in, ptrdiff_t stride_in) 00162 { 00163 #ifdef TEUCHOS_DEBUG 00164 TEUCHOS_ASSERT(globalOffset_in >= 0); 00165 if (!is_null(values_in)) { 00166 TEUCHOS_ASSERT(subDim_in >= 0); 00167 TEUCHOS_ASSERT(stride_in != 0); 00168 TEUCHOS_ASSERT( 00169 subDim_in*std::abs(Teuchos::as<int>(stride_in)) - 1 <= values_in.upperOffset()); 00170 TEUCHOS_ASSERT(values_in.lowerOffset() <= 0); 00171 } 00172 else { 00173 TEUCHOS_ASSERT(stride_in == 0); 00174 TEUCHOS_ASSERT(subDim_in==0); 00175 } 00176 #endif 00177 globalOffset_=globalOffset_in; 00178 subDim_=subDim_in; 00179 values_=values_in; 00180 stride_=stride_in; 00181 } 00183 void uninitialize() 00184 { globalOffset_ = 0; subDim_=0; values_ = Teuchos::null; stride_ = 0; } 00186 void setGlobalOffset(Ordinal globalOffset_in) 00187 { 00188 #ifdef TEUCHOS_DEBUG 00189 TEUCHOS_ASSERT(globalOffset_in >= 0); 00190 #endif 00191 globalOffset_ = globalOffset_in; 00192 } 00194 Ordinal globalOffset() const { return globalOffset_; } 00196 Ordinal subDim() const { return subDim_; } 00198 const ArrayRCP<const Scalar> values() const { return values_; } 00200 ptrdiff_t stride() const { return stride_; } 00203 const Scalar& operator[](Ordinal i) const 00204 { 00205 #ifdef TEUCHOS_DEBUG 00206 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(i, 0, subDim_); 00207 #endif 00208 return valuesBegin()[stride_*i]; 00209 } 00212 const Scalar& operator()(Ordinal i) const { return (*this)[i]; } 00213 private: 00214 Ordinal globalOffset_; 00215 Ordinal subDim_; 00216 ArrayRCP<const Scalar> values_; 00217 ptrdiff_t stride_; 00218 const typename ArrayRCP<const Scalar>::iterator valuesBegin() const 00219 { 00220 if (stride_ > 0) 00221 return values_.begin(); 00222 return values_.begin() + (subDim_*std::abs(Teuchos::as<int>(stride_)) - 1); 00223 } 00224 public: 00225 }; 00226 00227 00244 template<class Scalar> 00245 class SubVectorView : public ConstSubVectorView<Scalar> { 00246 public: 00248 SubVectorView() {} 00250 SubVectorView(const ArrayRCP<Scalar> &values_in) 00251 :ConstSubVectorView<Scalar>(values_in) 00252 {} 00254 SubVectorView(Ordinal globalOffset_in, Ordinal subDim_in, 00255 const ArrayRCP<Scalar> &values_in, ptrdiff_t stride_in) 00256 :ConstSubVectorView<Scalar>(globalOffset_in, subDim_in, values_in, stride_in) 00257 {} 00259 SubVectorView(Ordinal subDim_in) 00260 :ConstSubVectorView<Scalar>(0, subDim_in, Teuchos::arcp<Scalar>(subDim_in), 1) 00261 {} 00263 SubVectorView(const SubVectorView<Scalar> & sv) 00264 :ConstSubVectorView<Scalar>(sv) 00265 {} 00267 void initialize(Ordinal globalOffset_in, Ordinal subDim_in, 00268 const ArrayRCP<Scalar> &values_in, ptrdiff_t stride_in) 00269 { ConstSubVectorView<Scalar>::initialize(globalOffset_in, subDim_in, values_in, stride_in); } 00271 const ArrayRCP<Scalar> values() const 00272 { return Teuchos::arcp_const_cast<Scalar>(ConstSubVectorView<Scalar>::values()); } 00275 Scalar& operator[](Ordinal i) const 00276 { return const_cast<Scalar&>(ConstSubVectorView<Scalar>::operator[](i)); } 00279 Scalar& operator()(Ordinal i) const { return (*this)[i]; } 00280 public: 00281 }; 00282 00283 00285 template<class Scalar> 00286 void assign_entries( const Ptr<const SubVectorView<Scalar> > &msv, 00287 const ConstSubVectorView<Scalar> &sv ) 00288 { 00289 #ifdef TEUCHOS_DEBUG 00290 TEUCHOS_ASSERT_EQUALITY(msv->subDim(), sv.subDim()); 00291 #endif 00292 for( int i = 0; i < sv.subDim(); ++i ) { 00293 (*msv)(i) = sv(i); 00294 } 00295 } 00296 00297 00302 template<class Scalar> 00303 std::ostream& operator<<(std::ostream &out, const ConstSubVectorView<Scalar> &sv) 00304 { 00305 out 00306 << "{" 00307 << "globalOffset="<<sv.globalOffset() 00308 << ",subDim="<<sv.subDim() 00309 << ",values="<<sv.values() 00310 << ",stride="<<sv.stride() 00311 << "}"; 00312 return out; 00313 } 00314 00315 00316 // 00317 // MultiVectorBase subviews 00318 // 00319 00320 00342 template<class Scalar> 00343 class ConstSubMultiVectorView { 00344 public: 00346 ConstSubMultiVectorView() 00347 :globalOffset_(0), subDim_(0), colOffset_(0), numSubCols_(0), 00348 leadingDim_(0) 00349 {} 00351 ConstSubMultiVectorView( 00352 Ordinal globalOffset_in, Ordinal subDim_in, 00353 Ordinal colOffset_in, Ordinal numSubCols_in, 00354 const ArrayRCP<const Scalar> &values_in, Ordinal leadingDim_in 00355 ) 00356 :globalOffset_(0), subDim_(0), colOffset_(0), numSubCols_(0), 00357 leadingDim_(0) 00358 { 00359 initialize(globalOffset_in, subDim_in, colOffset_in, numSubCols_in, values_in, 00360 leadingDim_in); 00361 } 00363 ConstSubMultiVectorView( const ConstSubMultiVectorView<Scalar>& smv ) 00364 :globalOffset_(smv.globalOffset()), subDim_(smv.subDim()), 00365 colOffset_(smv.colOffset()), numSubCols_(smv.numSubCols()), 00366 values_(smv.values()), leadingDim_(smv.leadingDim()) 00367 {} 00369 void initialize( 00370 Ordinal globalOffset_in, Ordinal subDim_in, 00371 Ordinal colOffset_in, Ordinal numSubCols_in, 00372 const ArrayRCP<const Scalar> &values_in, Ordinal leadingDim_in 00373 ) 00374 { 00375 #ifdef TEUCHOS_DEBUG 00376 TEUCHOS_ASSERT(globalOffset_in >= 0); 00377 TEUCHOS_ASSERT(colOffset_in >= 0); 00378 if (!is_null(values_in)) { 00379 TEUCHOS_ASSERT(subDim_in >= 0); 00380 TEUCHOS_ASSERT(leadingDim_in >= subDim_in); 00381 TEUCHOS_ASSERT(numSubCols_in*leadingDim_in - 1 <= values_in.upperOffset()); 00382 TEUCHOS_ASSERT(values_in.lowerOffset() <= 0); 00383 } 00384 else { 00385 TEUCHOS_ASSERT(subDim_in == 0); 00386 TEUCHOS_ASSERT(leadingDim_in == 0); 00387 TEUCHOS_ASSERT(numSubCols_in == 0); 00388 } 00389 #endif 00390 globalOffset_=globalOffset_in; 00391 subDim_=subDim_in; 00392 colOffset_=colOffset_in; 00393 numSubCols_=numSubCols_in; 00394 values_=values_in; 00395 leadingDim_=leadingDim_in; 00396 } 00398 void uninitialize() 00399 { 00400 globalOffset_ = 0; subDim_=0; colOffset_=0, numSubCols_=0; 00401 values_=Teuchos::null; leadingDim_=0; 00402 } 00404 void setGlobalOffset(Ordinal globalOffset_in) 00405 { 00406 #ifdef TEUCHOS_DEBUG 00407 TEUCHOS_ASSERT(globalOffset_in >= 0); 00408 #endif 00409 globalOffset_ = globalOffset_in; 00410 } 00412 Ordinal globalOffset() const { return globalOffset_; } 00414 Ordinal subDim() const { return subDim_; } 00416 Ordinal colOffset() const { return colOffset_; } 00418 Ordinal numSubCols() const { return numSubCols_; } 00420 const ArrayRCP<const Scalar> values() const { return values_; } 00422 Ordinal leadingDim() const { return leadingDim_; } 00426 const Scalar& operator()(Ordinal i, Ordinal j) const 00427 { 00428 #ifdef TEUCHOS_DEBUG 00429 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(i, 0, subDim_); 00430 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, numSubCols_ ); 00431 #endif 00432 return values_[ i + leadingDim_*j ]; 00433 } 00437 ConstSubVectorView<Scalar> col( const Ordinal j ) const 00438 { 00439 #ifdef TEUCHOS_DEBUG 00440 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, numSubCols_ ); 00441 #endif 00442 return ConstSubVectorView<Scalar>( 00443 globalOffset(), subDim(), values().persistingView(j*leadingDim(),subDim()), 1 ); 00444 } 00445 private: 00446 Ordinal globalOffset_; 00447 Ordinal subDim_; 00448 Ordinal colOffset_; 00449 Ordinal numSubCols_; 00450 ArrayRCP<const Scalar> values_; 00451 Ordinal leadingDim_; 00452 public: 00453 }; 00454 00455 00472 template<class Scalar> 00473 class SubMultiVectorView : public ConstSubMultiVectorView<Scalar> { 00474 public: 00476 SubMultiVectorView() {} 00478 SubMultiVectorView( 00479 Ordinal numRows_in, Ordinal numCols_in 00480 ) 00481 :ConstSubMultiVectorView<Scalar>(0, numRows_in, 0, numCols_in, 00482 Teuchos::arcp<Scalar>(numRows_in*numCols_in), numRows_in) 00483 {} 00485 SubMultiVectorView( 00486 Ordinal globalOffset_in, Ordinal subDim_in, 00487 Ordinal colOffset_in, Ordinal numSubCols_in, 00488 const ArrayRCP<Scalar> &values_in, Ordinal leadingDim_in 00489 ) 00490 :ConstSubMultiVectorView<Scalar>(globalOffset_in, subDim_in, 00491 colOffset_in, numSubCols_in, values_in, leadingDim_in) 00492 {} 00494 SubMultiVectorView( const SubMultiVectorView<Scalar> & smv) 00495 :ConstSubMultiVectorView<Scalar>(smv) 00496 {} 00498 void initialize( 00499 Ordinal globalOffset_in, Ordinal subDim_in, 00500 Ordinal colOffset_in, Ordinal numSubCols_in, 00501 const ArrayRCP<Scalar> &values_in, Ordinal leadingDim_in 00502 ) 00503 { 00504 ConstSubMultiVectorView<Scalar>::initialize(globalOffset_in, 00505 subDim_in, colOffset_in, numSubCols_in, values_in, leadingDim_in); 00506 } 00508 const ArrayRCP<Scalar> values() const 00509 { 00510 return Teuchos::arcp_const_cast<Scalar>( 00511 ConstSubMultiVectorView<Scalar>::values()); 00512 } 00516 Scalar& operator()(Ordinal i, Ordinal j) const 00517 { return const_cast<Scalar&>(ConstSubMultiVectorView<Scalar>::operator()(i,j)); } 00521 SubVectorView<Scalar> col( const Ordinal j ) const 00522 { 00523 #ifdef TEUCHOS_DEBUG 00524 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j, 0, this->numSubCols()); 00525 #endif 00526 return SubVectorView<Scalar>(this->globalOffset(), this->subDim(), 00527 values().persistingView(j*this->leadingDim(),this->subDim()), 1); 00528 } 00529 public: 00530 }; 00531 00532 00534 template<class Scalar> 00535 void assign_entries( const Ptr<const SubMultiVectorView<Scalar> > &msmv, 00536 const ConstSubMultiVectorView<Scalar> &smv ) 00537 { 00538 #ifdef TEUCHOS_DEBUG 00539 TEUCHOS_ASSERT_EQUALITY(msmv->subDim(), smv.subDim()); 00540 TEUCHOS_ASSERT_EQUALITY(msmv->numSubCols(), smv.numSubCols()); 00541 #endif 00542 for( Ordinal j = 0; j < smv.numSubCols(); ++j ) { 00543 for( Ordinal i = 0; i < smv.subDim(); ++i ) { 00544 (*msmv)(i,j) = smv(i,j); 00545 } 00546 } 00547 } 00548 00549 00550 // 00551 // Primitive Type Traits 00552 // 00553 00554 00565 template <class Scalar, class ConcreteObj> 00566 class PrimitiveTypeTraits { 00567 public: 00569 typedef Scalar primitiveType; 00571 static int numPrimitiveObjs() 00572 { return Scalar::this_type_is_missing_a_specialization(); } 00574 static int numIndexObjs() 00575 { return Scalar::this_type_is_missing_a_specialization(); } 00577 static int numCharObjs() 00578 { return Scalar::this_type_is_missing_a_specialization(); } 00580 static void extractPrimitiveObjs( 00581 const Scalar &obj, 00582 const ArrayView<primitiveType> &primitiveObjs, 00583 const ArrayView<index_type> &indexObjs, 00584 const ArrayView<char> &charObjs 00585 ) 00586 { 00587 Scalar::this_type_is_missing_a_specialization(obj); 00588 } 00590 static void loadPrimitiveObjs( 00591 const ArrayView<const primitiveType> &primitiveObjs, 00592 const ArrayView<const index_type> &indexObjs, 00593 const ArrayView<const char> &charObjs, 00594 const Ptr<Scalar> &obj 00595 ) 00596 { 00597 *obj = Scalar::this_type_is_missing_a_specialization(); 00598 } 00599 }; 00600 00601 00602 00606 template <class Scalar> 00607 class PrimitiveTypeTraits<Scalar, Scalar> { 00608 public: 00610 typedef Scalar primitiveType; 00612 static int numPrimitiveObjs() { return 1; } 00614 static int numIndexObjs() { return 0; } 00616 static int numCharObjs() { return 0; } 00618 static void extractPrimitiveObjs( 00619 const Scalar &obj, 00620 const ArrayView<primitiveType> &primitiveObjs, 00621 const ArrayView<index_type> &indexObjs, 00622 const ArrayView<char> &charObjs 00623 ) 00624 { 00625 assertInput(primitiveObjs, indexObjs, charObjs); 00626 primitiveObjs[0] = obj; 00627 } 00629 static void loadPrimitiveObjs( 00630 const ArrayView<const primitiveType> &primitiveObjs, 00631 const ArrayView<const index_type> &indexObjs, 00632 const ArrayView<const char> &charObjs, 00633 const Ptr<Scalar> &obj 00634 ) 00635 { 00636 assertInput(primitiveObjs, indexObjs, charObjs); 00637 *obj = primitiveObjs[0]; 00638 } 00639 private: 00640 static void assertInput( 00641 const ArrayView<const primitiveType> &primitiveObjs, 00642 const ArrayView<const index_type> &indexObjs, 00643 const ArrayView<const char> &charObjs 00644 ) 00645 { 00646 #ifdef TEUCHOS_DEBUG 00647 TEUCHOS_TEST_FOR_EXCEPT( primitiveObjs.size()!=1 || indexObjs.size()!=0 00648 || charObjs.size()!=0 ); 00649 #endif 00650 } 00651 }; 00652 00653 00655 template <class Scalar> 00656 class PrimitiveTypeTraits<Scalar, index_type> { 00657 public: 00659 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits; 00661 typedef typename ScalarPrimitiveTypeTraits::primitiveType primitiveType; 00663 static int numPrimitiveObjs() { return 0; } 00665 static int numIndexObjs() { return 1; } 00667 static int numCharObjs() { return 0; } 00669 static void extractPrimitiveObjs( 00670 const index_type &obj, 00671 const ArrayView<primitiveType> &primitiveObjs, 00672 const ArrayView<index_type> &indexObjs, 00673 const ArrayView<char> &charObjs 00674 ) 00675 { 00676 assertInput(primitiveObjs, indexObjs, charObjs); 00677 indexObjs[0] = obj; 00678 } 00680 static void loadPrimitiveObjs( 00681 const ArrayView<const primitiveType> &primitiveObjs, 00682 const ArrayView<const index_type> &indexObjs, 00683 const ArrayView<const char> &charObjs, 00684 const Ptr<index_type> &obj 00685 ) 00686 { 00687 assertInput(primitiveObjs, indexObjs, charObjs); 00688 *obj = indexObjs[0]; 00689 } 00690 private: 00691 static void assertInput( 00692 const ArrayView<const primitiveType> &primitiveObjs, 00693 const ArrayView<const index_type> &indexObjs, 00694 const ArrayView<const char> &charObjs 00695 ) 00696 { 00697 #ifdef TEUCHOS_DEBUG 00698 TEUCHOS_TEST_FOR_EXCEPT( primitiveObjs.size()!=0 || indexObjs.size()!=1 00699 || charObjs.size()!=0 ); 00700 #endif 00701 } 00702 }; 00703 00704 00705 #if defined(HAVE_COMPLEX) && defined(HAVE_TEUCHOS_COMPLEX) 00706 00707 00711 template <class Scalar> 00712 class PrimitiveTypeTraits<std::complex<Scalar>, std::complex<Scalar> > { 00713 public: 00715 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits; 00717 typedef typename ScalarPrimitiveTypeTraits::primitiveType primitiveType; 00719 static int numPrimitiveObjs() 00720 { return 2*ScalarPrimitiveTypeTraits::numPrimitiveObjs(); } 00722 static int numIndexObjs() { return 0; } 00724 static int numCharObjs() { return 0; } 00726 static void extractPrimitiveObjs( 00727 const std::complex<Scalar> &obj, 00728 const ArrayView<primitiveType> &primitiveObjs, 00729 const ArrayView<index_type> &indexObjs, 00730 const ArrayView<char> &charObjs 00731 ) 00732 { 00733 using Teuchos::null; 00734 const int numScalarPrimitiveObjs = 00735 ScalarPrimitiveTypeTraits::numPrimitiveObjs(); 00736 assertInput(primitiveObjs, indexObjs, charObjs); 00737 ScalarPrimitiveTypeTraits::extractPrimitiveObjs( 00738 obj.real(), primitiveObjs(0,numScalarPrimitiveObjs), null, null ); 00739 ScalarPrimitiveTypeTraits::extractPrimitiveObjs( 00740 obj.imag(), primitiveObjs(numScalarPrimitiveObjs,numScalarPrimitiveObjs), null, null ); 00741 } 00743 static void loadPrimitiveObjs( 00744 const ArrayView<const primitiveType> &primitiveObjs, 00745 const ArrayView<const index_type> &indexObjs, 00746 const ArrayView<const char> &charObjs, 00747 const Ptr<std::complex<Scalar> > &obj 00748 ) 00749 { 00750 using Teuchos::null; 00751 using Teuchos::outArg; 00752 assertInput(primitiveObjs, indexObjs, charObjs); 00753 const int numScalarPrimitiveObjs = 00754 ScalarPrimitiveTypeTraits::numPrimitiveObjs(); 00755 Scalar real, imag; 00756 ScalarPrimitiveTypeTraits::loadPrimitiveObjs( 00757 primitiveObjs(0,numScalarPrimitiveObjs), null, null, 00758 outArg(real) ); 00759 ScalarPrimitiveTypeTraits::loadPrimitiveObjs( 00760 primitiveObjs(numScalarPrimitiveObjs,numScalarPrimitiveObjs), null, null, 00761 outArg(imag) ); 00762 *obj = std::complex<Scalar>( real, imag ); 00763 } 00764 private: 00765 static void assertInput( 00766 const ArrayView<const primitiveType> &primitiveObjs, 00767 const ArrayView<const index_type> &indexObjs, 00768 const ArrayView<const char> &charObjs 00769 ) 00770 { 00771 #ifdef TEUCHOS_DEBUG 00772 TEUCHOS_TEST_FOR_EXCEPT( 00773 primitiveObjs.size()!=2*ScalarPrimitiveTypeTraits::numPrimitiveObjs() 00774 || indexObjs.size()!=0 00775 || charObjs.size()!=0 ); 00776 #endif 00777 } 00778 }; 00779 00780 00784 template <class Scalar> 00785 class PrimitiveTypeTraits<std::complex<Scalar>, Scalar> { 00786 public: 00788 typedef PrimitiveTypeTraits<Scalar,Scalar> ScalarPrimitiveTypeTraits; 00790 typedef typename ScalarPrimitiveTypeTraits::primitiveType primitiveType; 00792 static int numPrimitiveObjs() 00793 { return ScalarPrimitiveTypeTraits::numPrimitiveObjs(); } 00795 static int numIndexObjs() { return 0; } 00797 static int numCharObjs() { return 0; } 00799 static void extractPrimitiveObjs( 00800 const Scalar &obj, 00801 const ArrayView<primitiveType> &primitiveObjs, 00802 const ArrayView<index_type> &indexObjs, 00803 const ArrayView<char> &charObjs 00804 ) 00805 { 00806 using Teuchos::null; 00807 assertInput(primitiveObjs, indexObjs, charObjs); 00808 ScalarPrimitiveTypeTraits::extractPrimitiveObjs( 00809 obj, primitiveObjs, null, null ); 00810 } 00812 static void loadPrimitiveObjs( 00813 const ArrayView<const primitiveType> &primitiveObjs, 00814 const ArrayView<const index_type> &indexObjs, 00815 const ArrayView<const char> &charObjs, 00816 const Ptr<Scalar > &obj 00817 ) 00818 { 00819 using Teuchos::null; 00820 assertInput(primitiveObjs, indexObjs, charObjs); 00821 ScalarPrimitiveTypeTraits::loadPrimitiveObjs( 00822 primitiveObjs, null, null, obj ); 00823 } 00824 private: 00825 static void assertInput( 00826 const ArrayView<const primitiveType> &primitiveObjs, 00827 const ArrayView<const index_type> &indexObjs, 00828 const ArrayView<const char> &charObjs 00829 ) 00830 { 00831 #ifdef TEUCHOS_DEBUG 00832 TEUCHOS_TEST_FOR_EXCEPT( 00833 primitiveObjs.size()!=ScalarPrimitiveTypeTraits::numPrimitiveObjs() 00834 || indexObjs.size()!=0 00835 || charObjs.size()!=0 ); 00836 #endif 00837 } 00838 }; 00839 00840 00841 #endif // defined(HAVE_COMPLEX) && defined(HAVE_TEUCHOS_COMPLEX) 00842 00843 00844 00845 // 00846 // Forward declaration for templated types 00847 // 00848 00849 00851 template<class Scalar> class RTOpT; 00852 00853 00854 } // namespace RTOpPack 00855 00856 00857 #endif // RTOPPACK_TYPES_HPP
1.7.6.1