1%%%%%%%%%%%%%%%%%%% 2% XLiFE++ is an extended library of finite elements written in C++ 3% Copyright (C) 2014 Lunéville, Eric; Kielbasiewicz, Nicolas; Lafranche, Yvon; Nguyen, Manh-Ha; Chambeyron, Colin 4% 5% This program is free software: you can redistribute it and/or modify 6% it under the terms of the GNU General Public License as published by 7% the Free Software Foundation, either version 3 of the License, or 8% (at your option) any later version. 9% This program is distributed in the hope that it will be useful, 10% but WITHOUT ANY WARRANTY; without even the implied warranty of 11% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12% GNU General Public License for more details. 13% You should have received a copy of the GNU General Public License 14% along with this program. If not, see <http://www.gnu.org/licenses/>. 15%%%%%%%%%%%%%%%%%%% 16 17\section{The {\classtitle LcOperatorOnUnknown} class} 18 19The{\class LcOperatorOnUnknown} class deals with linear combination of {\class OperatorOnUnknown} objects : 20$$\sum_{i=1,n} c_i\ op(u_i) | dom_i$$ 21where $c_i$ is a complex coefficient, $op(u_i)$ an operator on unknown $u_i$ ({\class OperatorOnUnknown} object) and possibly a geometrical domain $dom_i$ ({\class Domain } object). 22{\class LcOperatorOnUnknown} objects are useful to describe essential condition (see {\lib essentialConditions} library): 23$$\sum_{i=1,n} c_i\ op(u_i) | dom_i = g.$$ 24 25The{\class LcOperatorOnUnknown} class inherits from {\class std::vector} class : 26\vspace{.1cm} 27\begin{lstlisting}[]{} 28typedef std::pair<OperatorOnUnknown*, Complex> OpuValPair; 29 30class LcOperatorOnUnknown : public std::vector<OpuValPair> 31{ 32public : 33 std::vector<Domain*> domains_; 34} 35\end{lstlisting} 36\vspace{.3cm} 37The class provides some basic constructors and related stuff (copy, clear) 38\vspace{.1cm} 39\begin{lstlisting}[]{} 40LcOperatorOnUnknown() {}; 41LcOperatorOnUnknown(const OperatorOnUnknown&, const Real& = 1.); 42LcOperatorOnUnknown(const OperatorOnUnknown&, const Complex&); 43LcOperatorOnUnknown(const OperatorOnUnknown&, Domain&, const Real& = 1.); 44LcOperatorOnUnknown(const OperatorOnUnknown&, Domain&, const Complex&); 45LcOperatorOnUnknown(const Unknown&, const Real& = 1.); 46LcOperatorOnUnknown(const Unknown&, const Complex&); 47LcOperatorOnUnknown(const Unknown&, Domain&, const Real& = 1.); 48LcOperatorOnUnknown(const Unknown&, Domain&, const Complex&); 49LcOperatorOnUnknown(const LcOperatorOnUnknown&); 50~LcOperatorOnUnknown(); 51LcOperatorOnUnknown& operator =(const LcOperatorOnUnknown&); 52void clear(); 53void copy(const LcOperatorOnUnknown& lc); 54\end{lstlisting} 55\vspace{.3cm} 56To insert new item in the list, there are insertion member functions and overloaded operators: 57\vspace{.1cm} 58\begin{lstlisting}[]{} 59void insert(const OperatorOnUnknown&, GeomDomain* =0); // insert op(u) 60void insert(const Real&, const OperatorOnUnknown&, GeomDomain* =0); // insert a*op(u) 61void insert(const Complex&, const OperatorOnUnknown&, GeomDomain* =0); // insert a*op(u) 62void insert(const Unknown&, GeomDomain* =0); // insert u on D 63void insert(const Real&, const Unknown&, GeomDomain* =0); // insert a*u on D 64void insert(const Complex&, const Unknown&, GeomDomain* =0); // insert a*u on D 65LcOperatorOnUnknown& operator+=(const OperatorOnUnknown&); // lcop += opu 66LcOperatorOnUnknown& operator+=(const Unknown&); // lcop += u 67LcOperatorOnUnknown& operator+=(const LcOperatorOnUnknown&); // lcop += lcop 68LcOperatorOnUnknown& operator-=(const OperatorOnUnknown&); // lcop -= opu 69LcOperatorOnUnknown& operator-=(const Unknown&); // lcop -= u 70LcOperatorOnUnknown& operator-=(const LcOperatorOnUnknown&); // lcop -= lcop 71LcOperatorOnUnknown& operator*=(const Real&); // lcop *= r 72LcOperatorOnUnknown& operator*=(const Complex&); // lcop *= c 73LcOperatorOnUnknown& operator/=(const Real&); // lcop /= r 74LcOperatorOnUnknown& operator/=(const Complex&); // lcop /= c 75\end{lstlisting} 76\vspace{.3cm} 77Extern operators may also be used : 78\vspace{.1cm} 79\begin{lstlisting}[]{} 80LcOperatorOnUnknown operator+(const LcOperatorOnUnknown&); 81LcOperatorOnUnknown operator-(const LcOperatorOnUnknown&); 82LcOperatorOnUnknown operator+(const LcOperatorOnUnknown&, const OperatorOnUnknown&); 83LcOperatorOnUnknown operator-(const LcOperatorOnUnknown&, const OperatorOnUnknown&); 84LcOperatorOnUnknown operator+(const OperatorOnUnknown&, const LcOperatorOnUnknown&); 85LcOperatorOnUnknown operator-(const OperatorOnUnknown&, const LcOperatorOnUnknown&); 86LcOperatorOnUnknown operator+(const LcOperatorOnUnknown&, const Unknown&); 87LcOperatorOnUnknown operator-(const LcOperatorOnUnknown&, const Unknown&); 88LcOperatorOnUnknown operator+(const Unknown&, const LcOperatorOnUnknown&); 89LcOperatorOnUnknown operator-(const Unknown&, const LcOperatorOnUnknown&); 90LcOperatorOnUnknown operator+(const LcOperatorOnUnknown&, const LcOperatorOnUnknown&); 91LcOperatorOnUnknown operator-(const LcOperatorOnUnknown&, const LcOperatorOnUnknown&); 92LcOperatorOnUnknown operator*(const LcOperatorOnUnknown&, const Real&); 93LcOperatorOnUnknown operator*(const LcOperatorOnUnknown&, const Complex&); 94LcOperatorOnUnknown operator*(const Real&, const LcOperatorOnUnknown&); 95LcOperatorOnUnknown operator*(const Complex&, const LcOperatorOnUnknown&); 96LcOperatorOnUnknown operator/(const LcOperatorOnUnknown&, const Real&); 97LcOperatorOnUnknown operator/(const LcOperatorOnUnknown&, const Complex&); 98LcOperatorOnUnknown operator+(const OperatorOnUnknown&, const OperatorOnUnknown&); 99LcOperatorOnUnknown operator-(const OperatorOnUnknown&, const OperatorOnUnknown&); 100LcOperatorOnUnknown operator+(const OperatorOnUnknown&, const Unknown&); 101LcOperatorOnUnknown operator-(const OperatorOnUnknown&, const Unknown&); 102LcOperatorOnUnknown operator+(const Unknown&, const OperatorOnUnknown&); 103LcOperatorOnUnknown operator-(const Unknown&, const OperatorOnUnknown&); 104LcOperatorOnUnknown operator+(const Unknown&, const Unknown&); 105LcOperatorOnUnknown operator-(const Unknown&, const Unknown&); 106\end{lstlisting} 107\vspace{.3cm} 108{\class GeomDomain} may be affected using {\cmd SetDomain} or | operator : 109\vspace{.1cm} 110\begin{lstlisting}[]{} 111void setDomain(GeomDomain&); 112LcOperatorOnUnknown& operator|(GeomDomain&); 113LcOperatorOnUnknown operator|(const Unknown&,GeomDomain&); 114LcOperatorOnUnknown operator|(const OperatorOnUnknown&,GeomDomain&); 115\end{lstlisting} 116\vspace{.1cm} 117Note that when setting the domain, all previous domain definitions are overwritten.\\ 118 119It provides the following accessors and property accessors: 120\vspace{.1cm} 121\begin{lstlisting}[]{} 122bool isSingleUnknown() const; 123const Unknown* unknown() const; 124std::set<const Unknown*> unknowns() const; 125bool withDomains() const; 126bool isSingleDomain() const; 127Domain* domain() const; 128std::set<Domain*> domains() const; 129Complex coefficient() const; 130std::vector<Complex> coefficients() const; 131std::set<DiffOpType> diffOperators() const; 132void print(std::ostream&, bool withdomain=true) const; 133friend std::ostream& operator<<(std::ostream&, const LcOperatorOnUnknown&); 134\end{lstlisting} 135\vspace{.3cm} 136To create essential condition from {\class LcOperatorOnUnknown}, operator = is overloaded as following: 137\begin{lstlisting}[]{} 138EssentialCondition operator=(const Real &); 139EssentialCondition operator=(const Complex &); 140EssentialCondition operator=(const Function &); 141\end{lstlisting} 142\vspace{.3cm} 143These functions are implemented in \emph{EssentialCondition.cpp}! 144 145\displayInfos{library=operator, header=LcOperatorOnUnknowns.hpp, implementation=LcOperatorOnUnknowns.cpp, 146test=test\_EssentialCondition.cpp, header dep={OperatorOnUnknown.hpp, config.h, utils.h}} 147