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