|
Teko Version of the Day
|
00001 /* 00002 // @HEADER 00003 // 00004 // *********************************************************************** 00005 // 00006 // Teko: A package for block and physics based preconditioning 00007 // Copyright 2010 Sandia Corporation 00008 // 00009 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 00010 // the U.S. Government retains certain rights in this software. 00011 // 00012 // Redistribution and use in source and binary forms, with or without 00013 // modification, are permitted provided that the following conditions are 00014 // met: 00015 // 00016 // 1. Redistributions of source code must retain the above copyright 00017 // notice, this list of conditions and the following disclaimer. 00018 // 00019 // 2. Redistributions in binary form must reproduce the above copyright 00020 // notice, this list of conditions and the following disclaimer in the 00021 // documentation and/or other materials provided with the distribution. 00022 // 00023 // 3. Neither the name of the Corporation nor the names of the 00024 // contributors may be used to endorse or promote products derived from 00025 // this software without specific prior written permission. 00026 // 00027 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY 00028 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00029 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 00030 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE 00031 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00032 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00033 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00034 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00035 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00036 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00037 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00038 // 00039 // Questions? Contact Eric C. Cyr (eccyr@sandia.gov) 00040 // 00041 // *********************************************************************** 00042 // 00043 // @HEADER 00044 00045 */ 00046 00047 #include "Teko_DiagnosticLinearOp.hpp" 00048 00049 #include "Teuchos_TimeMonitor.hpp" 00050 00051 #include "Thyra_MultiVectorStdOps.hpp" 00052 00053 namespace Teko { 00054 00059 DiagnosticLinearOp::DiagnosticLinearOp(const Teuchos::RCP<std::ostream> & ostrm, const ModifiableLinearOp & A,const std::string & diagnosticString) 00060 : outputStream_(ostrm), wrapOpA_(A), diagString_(diagnosticString), timer_(diagnosticString) 00061 { 00062 } 00063 00068 DiagnosticLinearOp::DiagnosticLinearOp(const Teuchos::RCP<std::ostream> & ostrm,const LinearOp & fwdOp, 00069 const ModifiableLinearOp & A,const std::string & diagnosticString) 00070 : outputStream_(ostrm), wrapOpA_(A), fwdOp_(fwdOp), diagString_(diagnosticString), timer_(diagnosticString) 00071 { 00072 } 00073 00074 DiagnosticLinearOp::~DiagnosticLinearOp() 00075 { 00076 double elapsedTime = totalTime(); 00077 int applications = numApplications(); 00078 00079 (*outputStream_) << "DiagnosticLinearOp \"" << diagString_ << "\": " 00080 << "elapsed = " << elapsedTime << ", " 00081 << "applications = " << applications << ", "; 00082 if(applications>0) 00083 (*outputStream_) << "timer/app = " << elapsedTime / double(applications) << std::endl; 00084 else 00085 (*outputStream_) << "timer/app = " << "none" << std::endl; 00086 } 00087 00100 void DiagnosticLinearOp::implicitApply(const MultiVector & x, MultiVector & y, 00101 const double alpha, const double beta) const 00102 { 00103 Teko_DEBUG_SCOPE("DiagnosticLinearOp::implicityApply",10); 00104 00105 // start timer on construction, end on destruction 00106 Teuchos::TimeMonitor monitor(timer_,false); 00107 00108 MultiVector z; // for temporary storage dealing with nozero beta 00109 if(beta!=0.0); 00110 z = deepcopy(y); 00111 00112 wrapOpA_->apply(Thyra::NOTRANS,*x,y.ptr(),alpha,beta); 00113 00114 // print residual if there is a fwd Op 00115 bool printResidual = (fwdOp_!=Teuchos::null); 00116 if(printResidual) { 00117 // compute residual 00118 MultiVector residual = Teko::deepcopy(x); 00119 // fwdOp_->apply(Thyra::NOTRANS,*y,residual.ptr(),-1.0,1.0); 00120 00121 fwdOp_->apply(Thyra::NOTRANS,*y,residual.ptr(),-1.0,alpha); 00122 if(beta!=0.0) 00123 fwdOp_->apply(Thyra::NOTRANS,*z,residual.ptr(),beta,1.0); 00124 00125 // calculate norms 00126 std::vector<double> norms(y->domain()->dim()); // size of column count 00127 std::vector<double> rhsNorms(x->domain()->dim()); // size of column count 00128 Thyra::norms_2<double>(*residual,Teuchos::arrayViewFromVector(norms)); 00129 Thyra::norms_2<double>(*x,Teuchos::arrayViewFromVector(rhsNorms)); 00130 00131 // print out residual norms 00132 (*outputStream_) << "DiagnosticLinearOp \"" << diagString_ << "\": residual = ["; 00133 for(std::size_t i=0;i<norms.size();++i) 00134 (*outputStream_) << " " << std::scientific << std::setprecision(4) << norms[i]/rhsNorms[i];// << " (" <<rhsNorms[i]<<") "; 00135 (*outputStream_) << " ]" << std::endl; 00136 00137 residualNorm_ = norms[0]; 00138 } 00139 } 00140 00141 } // end namespace Teko
1.7.4