00001 // This file is part of ff3d - http://www.freefem.org/ff3d 00002 // Copyright (C) 2001, 2002, 2003 Stéphane Del Pino 00003 00004 // This program is free software; you can redistribute it and/or modify 00005 // it under the terms of the GNU General Public License as published by 00006 // the Free Software Foundation; either version 2, or (at your option) 00007 // any later version. 00008 00009 // This program is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU General Public License for more details. 00013 00014 // You should have received a copy of the GNU General Public License 00015 // along with this program; if not, write to the Free Software Foundation, 00016 // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00017 00018 // $Id: VariationalProblem.hpp,v 1.8 2007/11/02 20:02:20 delpinux Exp $ 00019 00020 #ifndef VARIATIONAL_PROBLEM_HPP 00021 #define VARIATIONAL_PROBLEM_HPP 00022 00023 #include <list> 00024 00025 #include <Problem.hpp> 00026 00027 #include <VariationalBilinearBorderOperator.hpp> 00028 #include <VariationalLinearBorderOperator.hpp> 00029 00030 #include <VariationalBilinearOperator.hpp> 00031 #include <VariationalLinearOperator.hpp> 00032 00033 #include <BoundaryConditionSet.hpp> 00034 00045 class VariationalProblem 00046 : public Problem 00047 { 00048 private: 00049 typedef std::list <ConstReferenceCounting<VariationalBilinearOperator> > 00050 BilinearOperatorListType; 00051 00052 BilinearOperatorListType 00053 __bilinearOperatorList; 00055 typedef std::list <ConstReferenceCounting<VariationalLinearOperator> > 00056 LinearOperatorListType; 00057 00058 LinearOperatorListType 00059 __linearOperatorList; 00062 typedef std::list <ConstReferenceCounting<VariationalBilinearBorderOperator> > 00063 BilinearBorderOperatorListType; 00064 00065 BilinearBorderOperatorListType 00066 __bilinearBorderOperatorList; 00071 typedef std::list <ConstReferenceCounting<VariationalLinearBorderOperator> > 00072 LinearBorderOperatorListType; 00073 00074 LinearBorderOperatorListType 00075 __linearBorderOperatorList; 00079 std::vector<ConstReferenceCounting<BoundaryConditionSet> > 00080 __bc; 00082 public: 00083 typedef BilinearOperatorListType::iterator bilinearOperatorIterator; 00084 typedef BilinearOperatorListType::const_iterator bilinearOperatorConst_iterator; 00085 00086 typedef LinearOperatorListType::iterator linearOperatorIterator; 00087 typedef LinearOperatorListType::const_iterator linearOperatorConst_iterator; 00088 00089 typedef BilinearBorderOperatorListType::iterator bilinearBorderOperatorIterator; 00090 typedef BilinearBorderOperatorListType::const_iterator bilinearBorderOperatorConst_iterator; 00091 00092 typedef LinearBorderOperatorListType::iterator linearBorderOperatorIterator; 00093 typedef LinearBorderOperatorListType::const_iterator linearBorderOperatorConst_iterator; 00094 00100 bilinearOperatorIterator beginBilinearOperator() 00101 { 00102 return __bilinearOperatorList.begin(); 00103 } 00104 00110 bilinearOperatorConst_iterator beginBilinearOperator() const 00111 { 00112 return __bilinearOperatorList.begin(); 00113 } 00114 00120 bilinearOperatorConst_iterator endBilinearOperator() const 00121 { 00122 return __bilinearOperatorList.end(); 00123 } 00124 00130 linearOperatorIterator beginLinearOperator() 00131 { 00132 return __linearOperatorList.begin(); 00133 } 00134 00140 linearOperatorConst_iterator beginLinearOperator() const 00141 { 00142 return __linearOperatorList.begin(); 00143 } 00144 00150 linearOperatorConst_iterator endLinearOperator() const 00151 { 00152 return __linearOperatorList.end(); 00153 } 00154 00160 bilinearBorderOperatorIterator beginBilinearBorderOperator() 00161 { 00162 return __bilinearBorderOperatorList.begin(); 00163 } 00164 00170 bilinearBorderOperatorConst_iterator beginBilinearBorderOperator() const 00171 { 00172 return __bilinearBorderOperatorList.begin(); 00173 } 00174 00180 bilinearBorderOperatorConst_iterator endBilinearBorderOperator() const 00181 { 00182 return __bilinearBorderOperatorList.end(); 00183 } 00184 00190 linearBorderOperatorIterator beginLinearBorderOperator() 00191 { 00192 return __linearBorderOperatorList.begin(); 00193 } 00194 00200 linearBorderOperatorConst_iterator beginLinearBorderOperator() const 00201 { 00202 return __linearBorderOperatorList.begin(); 00203 } 00204 00210 linearBorderOperatorConst_iterator endLinearBorderOperator() const 00211 { 00212 return __linearBorderOperatorList.end(); 00213 } 00214 00223 ReferenceCounting<Problem> 00224 operator*(const ConstReferenceCounting<ScalarFunctionBase>& u) const 00225 { 00226 VariationalProblem* newVariationalProblem = new VariationalProblem(*this); 00227 00228 newVariationalProblem->__bilinearOperatorList.clear(); 00229 for (BilinearOperatorListType::const_iterator i = __bilinearOperatorList.begin(); 00230 i != __bilinearOperatorList.end(); ++i) { 00231 newVariationalProblem->__bilinearOperatorList.push_back((**i) * u); 00232 } 00233 00234 newVariationalProblem->__linearOperatorList.clear(); 00235 for (LinearOperatorListType::const_iterator i = __linearOperatorList.begin(); 00236 i != __linearOperatorList.end(); ++i) { 00237 newVariationalProblem->__linearOperatorList.push_back((**i) * u); 00238 } 00239 00240 return newVariationalProblem; 00241 } 00242 00248 void add(ReferenceCounting<VariationalBilinearOperator> v) 00249 { 00250 __bilinearOperatorList.push_back(v); 00251 } 00252 00253 00259 void add(ReferenceCounting<VariationalBilinearBorderOperator> v) 00260 { 00261 __bilinearBorderOperatorList.push_back(v); 00262 } 00263 00269 void add(ReferenceCounting<VariationalLinearOperator> v) 00270 { 00271 __linearOperatorList.push_back(v); 00272 } 00273 00279 void add(ReferenceCounting<VariationalLinearBorderOperator> v) 00280 { 00281 __linearBorderOperatorList.push_back(v); 00282 } 00283 00290 size_t numberOfUnknown() const 00291 { 00292 return __bc.size(); 00293 } 00294 00302 const BoundaryConditionSet& boundaryConditionSet(const size_t& i) const 00303 { 00304 return *(__bc[i]); 00305 } 00306 00307 bool hasJumpOrMean() const 00308 { 00309 for (BilinearOperatorListType::const_iterator i=__bilinearOperatorList.begin(); 00310 i != __bilinearOperatorList.end(); ++i) { 00311 if (((*i)->testFunctionProperty() != VariationalOperator::normal) or 00312 ((*i)->unknownProperty() != VariationalOperator::normal)) { 00313 return true; 00314 } 00315 } 00316 00317 for (LinearOperatorListType::const_iterator i=__linearOperatorList.begin(); 00318 i != __linearOperatorList.end(); ++i) { 00319 if ((*i)->testFunctionProperty() != VariationalOperator::normal) { 00320 return true; 00321 } 00322 } 00323 00324 return false; 00325 } 00326 00332 VariationalProblem(std::vector<ConstReferenceCounting<BoundaryConditionSet> > bc) 00333 : Problem(Problem::variational, 0), 00334 __bc(bc) 00335 { 00336 ; 00337 } 00338 00346 VariationalProblem(const VariationalProblem& V, 00347 const bool& getOnlyBilinearForms = false) 00348 : Problem(V), 00349 __bilinearOperatorList(V.__bilinearOperatorList), 00350 __linearOperatorList(V.__linearOperatorList), 00351 __bilinearBorderOperatorList(V.__bilinearBorderOperatorList), 00352 __linearBorderOperatorList(V.__linearBorderOperatorList), 00353 __bc(V.__bc) 00354 { 00355 if (getOnlyBilinearForms) { 00356 __linearOperatorList.clear(); 00357 __linearBorderOperatorList.clear(); 00358 } 00359 } 00360 00361 00366 ~VariationalProblem() 00367 { 00368 ; 00369 } 00370 }; 00371 00372 #endif // VARIATIONAL_PROBLEM_HPP
1.5.6