LORENE
map_af_poisson.C
1/*
2 * Method of the class Map_af for the resolution of the scalar Poisson
3 * equation
4 */
5
6/*
7 * Copyright (c) 1999-2001 Eric Gourgoulhon
8 * Copyright (c) 1999-2001 Philippe Grandclement
9 *
10 * This file is part of LORENE.
11 *
12 * LORENE is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * LORENE is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with LORENE; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 *
26 */
27
28
29
30
31/*
32 * $Id: map_af_poisson.C,v 1.7 2016/12/05 16:17:57 j_novak Exp $
33 * $Log: map_af_poisson.C,v $
34 * Revision 1.7 2016/12/05 16:17:57 j_novak
35 * Suppression of some global variables (file names, loch, ...) to prevent redefinitions
36 *
37 * Revision 1.6 2014/10/13 08:53:02 j_novak
38 * Lorene classes and functions now belong to the namespace Lorene.
39 *
40 * Revision 1.5 2005/08/25 12:14:09 p_grandclement
41 * Addition of a new method to solve the scalar Poisson equation, based on a multi-domain Tau-method
42 *
43 * Revision 1.4 2004/05/06 15:25:39 e_gourgoulhon
44 * The case dzpuis=5 with null value in CED is well treated now.
45 *
46 * Revision 1.3 2004/02/20 10:55:23 j_novak
47 * The versions dzpuis 5 -> 3 has been improved and polished. Should be
48 * operational now...
49 *
50 * Revision 1.2 2004/02/06 10:53:52 j_novak
51 * New dzpuis = 5 -> dzpuis = 3 case (not ready yet).
52 *
53 * Revision 1.1.1.1 2001/11/20 15:19:27 e_gourgoulhon
54 * LORENE
55 *
56 * Revision 1.9 2000/05/22 13:46:48 phil
57 * ajout du cas dzpuis = 3
58 *
59 * Revision 1.8 2000/02/09 14:44:24 eric
60 * Traitement de dzpuis ameliore.
61 *
62 * Revision 1.7 1999/12/22 16:37:10 eric
63 * Ajout de pot.set_dzpuis(0) a la fin.
64 *
65 * Revision 1.6 1999/12/22 15:11:03 eric
66 * Remplacement du test source.get_mp() == this par
67 * source.get_mp()->get_mg() == mg
68 * (idem pour pot),
69 * afin de permettre l'appel par Map_et::poisson.
70 *
71 * Revision 1.5 1999/12/21 13:02:37 eric
72 * Changement de prototype de la routine poisson : la solution est
73 * desormais passee en argument (et non plus en valeur de retour)
74 * pour s'adapter au prototype general de la fonction virtuelle
75 * Map::poisson.
76 *
77 * Revision 1.4 1999/12/21 10:06:29 eric
78 * Ajout de l'argument (muet) Param&.
79 *
80 * Revision 1.3 1999/12/07 16:48:50 phil
81 * On fait ylm_i avant de quitter
82 *
83 * Revision 1.2 1999/12/02 16:12:22 eric
84 * *** empty log message ***
85 *
86 * Revision 1.1 1999/12/02 14:30:07 eric
87 * Initial revision
88 *
89 *
90 * $Header: /cvsroot/Lorene/C++/Source/Map/map_af_poisson.C,v 1.7 2016/12/05 16:17:57 j_novak Exp $
91 *
92 */
93
94// Header Lorene:
95#include "map.h"
96#include "cmp.h"
97
98namespace Lorene {
99Mtbl_cf sol_poisson(const Map_af&, const Mtbl_cf&, int, bool match = true) ;
100Mtbl_cf sol_poisson_tau(const Map_af&, const Mtbl_cf&, int) ;
101//*****************************************************************************
102
103void Map_af::poisson(const Cmp& source, Param& , Cmp& pot) const {
104
105 assert(source.get_etat() != ETATNONDEF) ;
106 assert(source.get_mp()->get_mg() == mg) ;
107 assert(pot.get_mp()->get_mg() == mg) ;
108
109 assert( source.check_dzpuis(2) || source.check_dzpuis(4)
110 || source.check_dzpuis(3) || source.check_dzpuis(5) ) ;
111
112 bool match = true ;
113
114 int dzpuis ;
115
116 if ( (source.dz_nonzero()) || (source.get_dzpuis() > 3)) { //##awkward??
117 dzpuis = source.get_dzpuis() ;
118 }
119 else{
120 dzpuis = 4 ;
121 }
122
123 match = !(dzpuis == 5) ;
124
125 // Spherical harmonic expansion of the source
126 // ------------------------------------------
127
128 const Valeur& sourva = source.va ;
129
130 if (sourva.get_etat() == ETATZERO) {
131 pot.set_etat_zero() ;
132 return ;
133 }
134
135 // Spectral coefficients of the source
136 assert(sourva.get_etat() == ETATQCQ) ;
137
138 Valeur rho(sourva.get_mg()) ;
139 sourva.coef() ;
140 rho = *(sourva.c_cf) ; // copy of the coefficients of the source
141
142 rho.ylm() ; // spherical harmonic transforms
143
144 // Call to the Mtbl_cf version
145 // ---------------------------
146 Mtbl_cf resu = sol_poisson(*this, *(rho.c_cf), dzpuis, match) ;
147
148 // Final result returned as a Cmp
149 // ------------------------------
150
151 pot.set_etat_zero() ; // to call Cmp::del_t().
152
153 pot.set_etat_qcq() ;
154
155 pot.va = resu ;
156 (pot.va).ylm_i() ; // On repasse en base standard.
157
158 (dzpuis == 5) ? pot.set_dzpuis(3) : pot.set_dzpuis(0) ;
159
160}
161
162
163 //----------------------
164 // Tau version method
165 //---------------------
166
167
168void Map_af::poisson_tau(const Cmp& source, Param& , Cmp& pot) const {
169
170 assert(source.get_etat() != ETATNONDEF) ;
171 assert(source.get_mp()->get_mg() == mg) ;
172 assert(pot.get_mp()->get_mg() == mg) ;
173
174 assert( source.check_dzpuis(2) || source.check_dzpuis(4)
175 || source.check_dzpuis(3)) ;
176
177 int dzpuis ;
178
179 if ( (source.dz_nonzero()) || (source.get_dzpuis() > 3)) { //##awkward??
180 dzpuis = source.get_dzpuis() ;
181 }
182 else{
183 dzpuis = 4 ;
184 }
185
186 // Spherical harmonic expansion of the source
187 // ------------------------------------------
188
189 const Valeur& sourva = source.va ;
190
191 if (sourva.get_etat() == ETATZERO) {
192 pot.set_etat_zero() ;
193 return ;
194 }
195
196 // Spectral coefficients of the source
197 assert(sourva.get_etat() == ETATQCQ) ;
198
199 Valeur rho(sourva.get_mg()) ;
200 sourva.coef() ;
201 rho = *(sourva.c_cf) ; // copy of the coefficients of the source
202
203 rho.ylm() ; // spherical harmonic transforms
204
205 // Call to the Mtbl_cf version
206 // ---------------------------
207
208 Mtbl_cf resu = sol_poisson_tau(*this, *(rho.c_cf), dzpuis) ;
209
210 // Final result returned as a Cmp
211 // ------------------------------
212
213 pot.set_etat_zero() ; // to call Cmp::del_t().
214
215 pot.set_etat_qcq() ;
216
217 pot.va = resu ;
218 (pot.va).ylm_i() ; // On repasse en base standard.
219 pot.set_dzpuis(0) ;
220}
221
222}
Component of a tensorial field *** DEPRECATED : use class Scalar instead ***.
Definition cmp.h:446
int get_etat() const
Returns the logical state.
Definition cmp.h:899
Valeur va
The numerical value of the Cmp.
Definition cmp.h:464
void set_etat_qcq()
Sets the logical state to ETATQCQ (ordinary state).
Definition cmp.C:307
int get_dzpuis() const
Returns dzpuis.
Definition cmp.h:903
bool dz_nonzero() const
Returns true if the last domain is compactified and *this is not zero in this domain.
Definition cmp.C:663
void set_etat_zero()
Sets the logical state to ETATZERO (zero).
Definition cmp.C:292
void set_dzpuis(int)
Set a value to dzpuis.
Definition cmp.C:657
bool check_dzpuis(int dzi) const
Returns false if the last domain is compactified and *this is not zero in this domain and dzpuis is n...
Definition cmp.C:718
const Map * get_mp() const
Returns the mapping.
Definition cmp.h:901
Affine radial mapping.
Definition map.h:2042
virtual void poisson(const Cmp &source, Param &par, Cmp &uu) const
Computes the solution of a scalar Poisson equation.
virtual void poisson_tau(const Cmp &source, Param &par, Cmp &uu) const
Computes the solution of a scalar Poisson equation using a Tau method.
Coefficients storage for the multi-domain spectral method.
Definition mtbl_cf.h:196
Parameter storage.
Definition param.h:125
Values and coefficients of a (real-value) function.
Definition valeur.h:297
int get_etat() const
Returns the logical state.
Definition valeur.h:760
void ylm()
Computes the coefficients of *this.
Definition valeur_ylm.C:141
Mtbl_cf * c_cf
Coefficients of the spectral expansion of the function.
Definition valeur.h:312
void coef() const
Computes the coeffcients of *this.
const Mg3d * get_mg() const
Returns the Mg3d on which the this is defined.
Definition valeur.h:763
Lorene prototypes.
Definition app_hor.h:67