KADATH
bin_ns_add_eq.cpp
1 /*
2  Copyright 2017 Philippe Grandclement
3 
4  This file is part of Kadath.
5 
6  Kadath is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  Kadath is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with Kadath. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "headcpp.hpp"
21 #include "bin_ns.hpp"
22 #include "utilities.hpp"
23 #include "point.hpp"
24 #include "scalar.hpp"
25 #include "tensor_impl.hpp"
26 #include "system_of_eqs.hpp"
27 #include "name_tools.hpp"
28 
29 namespace Kadath {
30 void Space_bin_ns::add_eq (System_of_eqs& sys, const char* eq, const char* rac, const char* rac_der, int nused, Array<int>** pused) {
31 
32  // First NS
33  sys.add_eq_inside (0, eq, nused, pused) ;
34  sys.add_eq_matching (0, OUTER_BC, rac, nused, pused) ;
35  sys.add_eq_matching (0, OUTER_BC, rac_der, nused, pused) ;
36  sys.add_eq_inside (1, eq, nused, pused) ;
37  sys.add_eq_matching (1, OUTER_BC, rac, nused, pused) ;
38  sys.add_eq_matching (1, OUTER_BC, rac_der, nused, pused) ;
39  sys.add_eq_inside (2, eq, nused, pused) ;
40 
41 
42  // Matching with bispheric :
43  sys.add_eq_matching_import (2, OUTER_BC, rac, nused, pused) ;
44  sys.add_eq_matching_import (6, INNER_BC, rac_der, nused, pused) ;
45  sys.add_eq_matching_import (7, INNER_BC, rac_der, nused, pused) ;
46 
47  // Second NS :
48  sys.add_eq_inside (3, eq, nused, pused) ;
49  sys.add_eq_matching (3, OUTER_BC, rac, nused, pused) ;
50  sys.add_eq_matching (3, OUTER_BC, rac_der, nused, pused) ;
51  sys.add_eq_inside (4, eq, nused, pused) ;
52  sys.add_eq_matching (4, OUTER_BC, rac, nused, pused) ;
53  sys.add_eq_matching (4, OUTER_BC, rac_der, nused, pused) ;
54  sys.add_eq_inside (5, eq, nused, pused) ;
55 
56  // Matching with bispheric :
57  sys.add_eq_matching_import (5, OUTER_BC, rac, nused, pused) ;
58  sys.add_eq_matching_import (9, INNER_BC, rac_der, nused, pused) ;
59  sys.add_eq_matching_import (10, INNER_BC, rac_der, nused, pused) ;
60 
61  // Chi first
62  sys.add_eq_inside (6, eq, nused, pused) ;
63  sys.add_eq_matching (6, CHI_ONE_BC, rac, nused, pused) ;
64  sys.add_eq_matching (6, CHI_ONE_BC, rac_der, nused, pused) ;
65 
66  // Rect :
67  sys.add_eq_inside (7, eq, nused, pused) ;
68  sys.add_eq_matching (7, ETA_PLUS_BC, rac, nused, pused) ;
69  sys.add_eq_matching (7, ETA_PLUS_BC, rac_der, nused, pused) ;
70 
71  // Eta first
72  sys.add_eq_inside (8, eq, nused, pused) ;
73  sys.add_eq_matching (8, ETA_PLUS_BC, rac, nused, pused) ;
74  sys.add_eq_matching (8, ETA_PLUS_BC, rac_der, nused, pused) ;
75 
76  // Rect
77  sys.add_eq_inside (9, eq, nused, pused) ;
78  sys.add_eq_matching (9, CHI_ONE_BC, rac, nused, pused) ;
79  sys.add_eq_matching (9, CHI_ONE_BC, rac_der, nused, pused) ;
80 
81 
82  // chi first :
83  sys.add_eq_inside (10, eq, nused, pused) ;
84 
85  // Matching outer domain :
86  for (int d=6 ; d<=10 ; d++)
87  sys.add_eq_matching_import (d, OUTER_BC, rac, nused, pused) ;
88  sys.add_eq_matching_import (11, INNER_BC, rac_der, nused, pused) ;
89 
90  //Compactified domain
91  sys.add_eq_inside (11, eq, nused, pused) ;
92 
93 }
94 
95 void Space_bin_ns::add_eq_nozec (System_of_eqs& sys, const char* eq, const char* rac, const char* rac_der, int nused, Array<int>** pused) {
96 
97  // First NS
98  sys.add_eq_inside (0, eq, nused, pused) ;
99  sys.add_eq_matching (0, OUTER_BC, rac, nused, pused) ;
100  sys.add_eq_matching (0, OUTER_BC, rac_der, nused, pused) ;
101  sys.add_eq_inside (1, eq, nused, pused) ;
102  sys.add_eq_matching (1, OUTER_BC, rac, nused, pused) ;
103  sys.add_eq_matching (1, OUTER_BC, rac_der, nused, pused) ;
104  sys.add_eq_inside (2, eq, nused, pused) ;
105 
106 
107  // Matching with bispheric :
108  sys.add_eq_matching_import (2, OUTER_BC, rac, nused, pused) ;
109  sys.add_eq_matching_import (6, INNER_BC, rac_der, nused, pused) ;
110  sys.add_eq_matching_import (7, INNER_BC, rac_der, nused, pused) ;
111 
112  // Second NS :
113  sys.add_eq_inside (3, eq, nused, pused) ;
114  sys.add_eq_matching (3, OUTER_BC, rac, nused, pused) ;
115  sys.add_eq_matching (3, OUTER_BC, rac_der, nused, pused) ;
116  sys.add_eq_inside (4, eq, nused, pused) ;
117  sys.add_eq_matching (4, OUTER_BC, rac, nused, pused) ;
118  sys.add_eq_matching (4, OUTER_BC, rac_der, nused, pused) ;
119  sys.add_eq_inside (5, eq, nused, pused) ;
120 
121  // Matching with bispheric :
122  sys.add_eq_matching_import (5, OUTER_BC, rac, nused, pused) ;
123  sys.add_eq_matching_import (9, INNER_BC, rac_der, nused, pused) ;
124  sys.add_eq_matching_import (10, INNER_BC, rac_der, nused, pused) ;
125 
126  // Chi first
127  sys.add_eq_inside (6, eq, nused, pused) ;
128  sys.add_eq_matching (6, CHI_ONE_BC, rac, nused, pused) ;
129  sys.add_eq_matching (6, CHI_ONE_BC, rac_der, nused, pused) ;
130 
131  // Rect :
132  sys.add_eq_inside (7, eq, nused, pused) ;
133  sys.add_eq_matching (7, ETA_PLUS_BC, rac, nused, pused) ;
134  sys.add_eq_matching (7, ETA_PLUS_BC, rac_der, nused, pused) ;
135 
136  // Eta first
137  sys.add_eq_inside (8, eq, nused, pused) ;
138  sys.add_eq_matching (8, ETA_PLUS_BC, rac, nused, pused) ;
139  sys.add_eq_matching (8, ETA_PLUS_BC, rac_der, nused, pused) ;
140 
141  // Rect
142  sys.add_eq_inside (9, eq, nused, pused) ;
143  sys.add_eq_matching (9, CHI_ONE_BC, rac, nused, pused) ;
144  sys.add_eq_matching (9, CHI_ONE_BC, rac_der, nused, pused) ;
145 
146 
147  // chi first :
148  sys.add_eq_inside (10, eq, nused, pused) ;
149 
150  if (nshells !=0) {
151  // Matching outer domain :
152  for (int d=6 ; d<=10 ; d++)
153  sys.add_eq_matching_import (d, OUTER_BC, rac, nused, pused) ;
154  sys.add_eq_matching_import (11, INNER_BC, rac_der, nused, pused) ;
155 
156  for (int d=0 ; d<nshells ; d++) {
157  sys.add_eq_inside (11+d, eq, nused, pused) ;
158  if (d!=nshells-1) {
159  sys.add_eq_matching (11+d, OUTER_BC, rac, nused, pused) ;
160  sys.add_eq_matching (11+d, OUTER_BC, rac_der, nused, pused) ;
161  }
162  }
163  }
164 }
165 
166 void Space_bin_ns::add_eq_nozec (System_of_eqs& sys, const char* eq, const char* rac, const char* rac_der, const List_comp& used) {
167  add_eq_nozec (sys, eq, rac,rac_der, used.get_ncomp(), used.get_pcomp()) ;
168 }
169 
170 void Space_bin_ns::add_eq_noshell (System_of_eqs& sys, const char* eq, const char* rac, const char* rac_der, int nused, Array<int>** pused) {
171 
172  // First NS
173  sys.add_eq_inside (0, eq, nused, pused) ;
174  sys.add_eq_matching (0, OUTER_BC, rac, nused, pused) ;
175  sys.add_eq_matching (0, OUTER_BC, rac_der, nused, pused) ;
176  sys.add_eq_inside (1, eq, nused, pused) ;
177  sys.add_eq_matching (1, OUTER_BC, rac, nused, pused) ;
178  sys.add_eq_matching (1, OUTER_BC, rac_der, nused, pused) ;
179  sys.add_eq_inside (2, eq, nused, pused) ;
180 
181 
182  // Matching with bispheric :
183  sys.add_eq_matching_import (2, OUTER_BC, rac, nused, pused) ;
184  sys.add_eq_matching_import (6, INNER_BC, rac_der, nused, pused) ;
185  sys.add_eq_matching_import (7, INNER_BC, rac_der, nused, pused) ;
186 
187  // Second NS :
188  sys.add_eq_inside (3, eq, nused, pused) ;
189  sys.add_eq_matching (3, OUTER_BC, rac, nused, pused) ;
190  sys.add_eq_matching (3, OUTER_BC, rac_der, nused, pused) ;
191  sys.add_eq_inside (4, eq, nused, pused) ;
192  sys.add_eq_matching (4, OUTER_BC, rac, nused, pused) ;
193  sys.add_eq_matching (4, OUTER_BC, rac_der, nused, pused) ;
194  sys.add_eq_inside (5, eq, nused, pused) ;
195 
196  // Matching with bispheric :
197  sys.add_eq_matching_import (5, OUTER_BC, rac, nused, pused) ;
198  sys.add_eq_matching_import (9, INNER_BC, rac_der, nused, pused) ;
199  sys.add_eq_matching_import (10, INNER_BC, rac_der, nused, pused) ;
200 
201  // Chi first
202  sys.add_eq_inside (6, eq, nused, pused) ;
203  sys.add_eq_matching (6, CHI_ONE_BC, rac, nused, pused) ;
204  sys.add_eq_matching (6, CHI_ONE_BC, rac_der, nused, pused) ;
205 
206  // Rect :
207  sys.add_eq_inside (7, eq, nused, pused) ;
208  sys.add_eq_matching (7, ETA_PLUS_BC, rac, nused, pused) ;
209  sys.add_eq_matching (7, ETA_PLUS_BC, rac_der, nused, pused) ;
210 
211  // Eta first
212  sys.add_eq_inside (8, eq, nused, pused) ;
213  sys.add_eq_matching (8, ETA_PLUS_BC, rac, nused, pused) ;
214  sys.add_eq_matching (8, ETA_PLUS_BC, rac_der, nused, pused) ;
215 
216  // Rect
217  sys.add_eq_inside (9, eq, nused, pused) ;
218  sys.add_eq_matching (9, CHI_ONE_BC, rac, nused, pused) ;
219  sys.add_eq_matching (9, CHI_ONE_BC, rac_der, nused, pused) ;
220 
221 
222  // chi first :
223  sys.add_eq_inside (10, eq, nused, pused) ;
224 }
225 
226 void Space_bin_ns::add_eq_noshell (System_of_eqs& sys, const char* eq, const char* rac, const char* rac_der, const List_comp& used) {
227  add_eq_noshell (sys, eq, rac,rac_der, used.get_ncomp(), used.get_pcomp()) ;
228 }
229 
230 void Space_bin_ns::add_eq_int_inf (System_of_eqs& sys, const char* nom) {
231 
232  // Check the last domain is of the right type :
233  const Domain_compact* pcomp = dynamic_cast <const Domain_compact*> (domains[nbr_domains-1]) ;
234  if (pcomp==0x0) {
235  cerr << "add_eq_int_inf requires a compactified domain" << endl ;
236  abort() ;
237  }
238  int dom = nbr_domains-1 ;
239 
240  // Get the lhs and rhs
241  char p1[LMAX] ;
242  char p2[LMAX] ;
243  bool indic = sys.is_ope_bin(nom, p1, p2, '=') ;
244  if (!indic) {
245  cerr << "= needed for equations" << endl ;
246  abort() ;
247  }
248  else {
249  // Verif lhs = 0 ?
250  indic = ((p2[0]=='0') && (p2[1]==' ') && (p2[2]=='\0')) ?
251  true : false ;
252 
253  // Construction of the equation
254  sys.eq_int[sys.neq_int] = new Eq_int(1) ;
255 
256  // Affectation :
257  // no lhs :
258  if (indic)
259  sys.eq_int[sys.neq_int]->set_part(0, sys.give_ope(dom, p1, OUTER_BC)) ;
260 
261  else
262  sys.eq_int[sys.neq_int]->set_part(0, new Ope_sub(&sys, sys.give_ope(dom, p1, OUTER_BC), sys.give_ope(dom, p2, OUTER_BC))) ;
263  sys.neq_int ++ ;
264  }
265  sys.nbr_conditions = -1 ;
266 }
267 
268 void Space_bin_ns::add_eq_ori_one (System_of_eqs& sys, const char* name) {
269 
270  Index pos (domains[0]->get_nbr_points()) ;
271  char auxi[LMAX] ;
272  trim_spaces (auxi, name) ;
273  sys.add_eq_val (0, auxi, pos) ;
274 }
275 
276 void Space_bin_ns::add_eq_ori_two (System_of_eqs& sys, const char* name) {
277 
278  Index pos (domains[3]->get_nbr_points()) ;
279  char auxi[LMAX] ;
280  trim_spaces (auxi, name) ;
281  sys.add_eq_val (3, auxi, pos) ;
282 }}
Class for a spherical compactified domain and a symmetry with respect to the plane .
Definition: spheric.hpp:1007
Class implementing an integral equation.
Class that gives the position inside a multi-dimensional Array.
Definition: index.hpp:38
Class for storing a list of tensorial components.
Definition: list_comp.hpp:33
int get_ncomp() const
Returns the number of components.
Definition: list_comp.hpp:64
Array< int > ** get_pcomp() const
Returns a pointer of the liste.
Definition: list_comp.hpp:69
The operator substraction.
Definition: ope_eq.hpp:165
void add_eq(System_of_eqs &syst, const char *eq, const char *rac, const char *rac_der, int nused=-1, Array< int > **pused=0x0)
Adds a bulk equation and two matching conditions.
void add_eq_noshell(System_of_eqs &syst, const char *eq, const char *rac, const char *rac_der, int nused=-1, Array< int > **pused=0x0)
Adds a bulk equation and two matching conditions.
void add_eq_ori_two(System_of_eqs &syst, const char *eq)
Adds an equation being the value of some field at the origin of the first nucleus.
void add_eq_nozec(System_of_eqs &syst, const char *eq, const char *rac, const char *rac_der, int nused=-1, Array< int > **pused=0x0)
Adds a bulk equation and two matching conditions.
int nshells
Number of outer shells.
Definition: bin_ns.hpp:38
void add_eq_ori_one(System_of_eqs &syst, const char *eq)
Adds an equation being the value of some field at the origin of the first nucleus.
void add_eq_int_inf(System_of_eqs &syst, const char *eq)
Adds an equation being a surface integral at infinity.
Domain ** domains
Pointers on the various Domains.
Definition: space.hpp:1368
int nbr_domains
Number od Domains.
Definition: space.hpp:1365
Class used to describe and solve a system of equations.
virtual void add_eq_inside(int dom, const char *eq, int n_cmp=-1, Array< int > **p_cmp=nullptr)
Addition of an equation to be solved inside a domain (assumed to be second order).
Definition: add_eq.cpp:26
virtual void add_eq_matching_import(int dom, int bb, const char *eq, int n_cmp=-1, Array< int > **p_cmp=nullptr)
Addition of an equation describing a matching condition between domains using the ("import" setting) ...
Definition: add_eq.cpp:344
virtual void add_eq_matching(int dom, int bb, const char *eq, int n_cmp=-1, Array< int > **p_cmp=nullptr)
Addition of an equation describing a matching condition between two domains (standard setting)
Definition: add_eq.cpp:198
int neq_int
Number of integral equations (i.e. which are doubles)
bool is_ope_bin(const char *input, char *p1, char *p2, char symb) const
Checks if a string represents an operator of the type "a + b".
Definition: give_ope.cpp:276
Ope_eq * give_ope(int dom, const char *name, int bb=0) const
Function that reads a string and returns a pointer on the generated Ope_eq.
Definition: give_ope.cpp:559
virtual void add_eq_val(int dom, const char *eq, const Index &pos)
Addition of an equation saying that the value of a field must be zero at one collocation point.
Definition: add_eq.cpp:462
int nbr_conditions
Total number of conditions (the number of coefficients of all the equations, once regularities are ta...
MMPtr_array< Eq_int > eq_int
Pointers onto the integral equations.