|
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 #ifndef __Teko_InvLSCStrategy_hpp__ 00048 #define __Teko_InvLSCStrategy_hpp__ 00049 00050 #include "Teko_LSCStrategy.hpp" 00051 00052 namespace Teko { 00053 namespace NS { 00054 00055 class LSCPrecondState; // forward declration 00056 00066 class InvLSCStrategy : public LSCStrategy { 00067 public: 00069 00070 InvLSCStrategy(); 00071 InvLSCStrategy(const Teuchos::RCP<InverseFactory> & factory, 00072 bool rzn=false); 00073 InvLSCStrategy(const Teuchos::RCP<InverseFactory> & factory, 00074 LinearOp & mass,bool rzn=false); 00075 InvLSCStrategy(const Teuchos::RCP<InverseFactory> & invFactF, 00076 const Teuchos::RCP<InverseFactory> & invFactS, 00077 bool rzn=false); 00078 InvLSCStrategy(const Teuchos::RCP<InverseFactory> & invFactF, 00079 const Teuchos::RCP<InverseFactory> & invFactS, 00080 LinearOp & mass,bool rzn=false); 00082 00083 virtual ~InvLSCStrategy() {} 00084 00086 00087 00095 virtual void buildState(BlockedLinearOp & A,BlockPreconditionerState & state) const; 00096 00105 virtual LinearOp getInvBQBt(const BlockedLinearOp & A,BlockPreconditionerState & state) const; 00106 00115 virtual LinearOp getInvBHBt(const BlockedLinearOp & A,BlockPreconditionerState & state) const; 00116 00125 virtual LinearOp getInvF(const BlockedLinearOp & A,BlockPreconditionerState & state) const; 00126 00135 virtual LinearOp getInvAlphaD(const BlockedLinearOp & A,BlockPreconditionerState & state) const; 00136 00145 virtual LinearOp getInvMass(const BlockedLinearOp & A,BlockPreconditionerState & state) const; 00146 00155 virtual LinearOp getHScaling(const BlockedLinearOp & A,BlockPreconditionerState & state) const; 00156 00163 virtual bool useFullLDU() const { return useFullLDU_; } 00164 00170 virtual void setSymmetric(bool isSymmetric) 00171 { isSymmetric_ = isSymmetric; } 00172 00174 virtual void initializeFromParameterList(const Teuchos::ParameterList & pl, 00175 const InverseLibrary & invLib); 00176 00178 virtual Teuchos::RCP<Teuchos::ParameterList> getRequestedParameters() const; 00179 00181 virtual bool updateRequestedParameters(const Teuchos::ParameterList & pl); 00183 00186 virtual void setPressureStabMatrix(const Teko::LinearOp & psm) 00187 { userPresStabMat_ = psm; } 00188 00190 virtual void initializeState(const BlockedLinearOp & A,LSCPrecondState * state) const; 00191 00197 void computeInverses(const BlockedLinearOp & A,LSCPrecondState * state) const; 00198 00199 // //! Initialize the state object using this blocked linear operator 00200 // virtual void reinitializeState(const BlockedLinearOp & A,LSCPrecondState * state) const; 00201 00203 virtual void setEigSolveParam(int sz) { eigSolveParam_ = sz; } 00204 00206 virtual int getEigSolveParam() { return eigSolveParam_; } 00207 00209 virtual void setUseFullLDU(bool val) { useFullLDU_ = val; } 00210 00212 virtual void setRowZeroing(bool val) { rowZeroingNeeded_ = val; } 00213 00215 virtual void setMassMatrix(const LinearOp & mass) { massMatrix_ = mass; } 00216 00220 virtual void setHScaling(const LinearOp & hScaling) { hScaling_ = hScaling; } 00221 00225 virtual void setHScaling(const MultiVector & hScaling) 00226 { hScaling_ = buildDiagonal(hScaling,"H"); } 00227 00231 virtual void setWScaling(const MultiVector & wScaling) 00232 { wScaling_ = wScaling; } 00233 00234 protected: 00235 LinearOp massMatrix_; 00236 00237 // how to invert the matrices 00238 Teuchos::RCP<InverseFactory> invFactoryF_; 00239 Teuchos::RCP<InverseFactory> invFactoryS_; 00240 00241 // number of power iterations when computing spectral radius 00242 int eigSolveParam_; 00243 00244 // flags for handling various options 00245 bool rowZeroingNeeded_; 00246 bool useFullLDU_; 00247 bool useMass_; 00248 bool useLumping_; 00249 bool useWScaling_; 00250 DiagonalType scaleType_; 00251 bool isSymmetric_; 00252 00253 // operators requested, to be filled by user 00254 LinearOp userPresStabMat_; 00255 mutable LinearOp hScaling_; 00256 MultiVector wScaling_; 00257 00258 private: 00259 InvLSCStrategy(const InvLSCStrategy &); 00260 }; 00261 00262 } // end namespace NS 00263 } // end namespace Teko 00264 00265 #endif
1.7.4