00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 char map_et_poisson_regu_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_poisson_regu.C,v 1.1.1.1 2001/11/20 15:19:27 e_gourgoulhon Exp $" ;
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 #include "map.h"
00074 #include "cmp.h"
00075 #include "tenseur.h"
00076 #include "param.h"
00077
00078
00079
00080 void Map_et::poisson_regular(const Cmp& source, int k_div, int nzet,
00081 double unsgam1, Param& par, Cmp& uu,
00082 Cmp& uu_regu, Cmp& uu_div, Tenseur& duu_div,
00083 Cmp& source_regu, Cmp& source_div) const {
00084
00085
00086 assert(source.get_etat() != ETATNONDEF) ;
00087 assert(source.get_mp() == this) ;
00088
00089 assert( source.check_dzpuis(2) || source.check_dzpuis(4)
00090 || source.check_dzpuis(3)) ;
00091
00092 assert(uu.get_mp() == this) ;
00093 assert(uu.check_dzpuis(0)) ;
00094
00095 int nz = mg->get_nzone() ;
00096 int nzm1 = nz - 1 ;
00097
00098
00099 bool zec = false ;
00100 if (mg->get_type_r(nzm1) == UNSURR) {
00101 zec = true ;
00102 }
00103
00104
00105
00106
00107
00108 Mtbl unjj = 1 + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00109
00110 Mtbl apre1(*mg) ;
00111 apre1.set_etat_qcq() ;
00112 for (int l=0; l<nz; l++) {
00113 *(apre1.t[l]) = alpha[l]*alpha[l] ;
00114 }
00115
00116 apre1 = apre1 * dxdr * dxdr * unjj ;
00117
00118 Cmp apre(*this) ;
00119 apre = apre1 ;
00120
00121 Tbl amax0 = max(apre1) ;
00122
00123
00124 Mtbl amax1(*mg) ;
00125 amax1.set_etat_qcq() ;
00126 for (int l=0; l<nz; l++) {
00127 *(amax1.t[l]) = amax0(l) ;
00128 }
00129
00130 Cmp amax(*this) ;
00131 amax = amax1 ;
00132
00133
00134
00135
00136
00137 int nitermax = par.get_int() ;
00138 int& niter = par.get_int_mod() ;
00139 double lambda = par.get_double() ;
00140 double unmlambda = 1. - lambda ;
00141 double precis = par.get_double(1) ;
00142
00143 Cmp& ssj = par.get_cmp_mod() ;
00144
00145 Cmp ssjm1 = ssj ;
00146 Cmp ssjm2 = ssjm1 ;
00147
00148 Valeur& vuu = uu.va ;
00149
00150 Valeur vuujm1(*mg) ;
00151 if (uu.get_etat() == ETATZERO) {
00152 vuujm1 = 1 ;
00153 vuujm1.set_base( vuu.base ) ;
00154 }
00155 else{
00156 vuujm1 = vuu ;
00157 }
00158
00159
00160
00161 Map_af mpaff(*this) ;
00162 Param par_nul ;
00163
00164 cout << "Map_et::poisson_regular : relat. diff. u^J <-> u^{J-1} : "
00165 << endl ;
00166
00167
00168
00169
00170
00171
00172
00173 Tbl tdiff(nz) ;
00174 double diff ;
00175 niter = 0 ;
00176
00177 do {
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 Valeur duudx = (uu.va).dsdx() ;
00189
00190 const Valeur& d2uudtdx = duudx.dsdt() ;
00191
00192 const Valeur& std2uudpdx = duudx.stdsdp() ;
00193
00194
00195
00196
00197
00198
00199 Valeur sxlapang = uu.va ;
00200
00201 sxlapang.ylm() ;
00202
00203 sxlapang = sxlapang.lapang() ;
00204
00205 sxlapang = sxlapang.sx() ;
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219 Valeur varduudx = duudx ;
00220
00221 if (zec) {
00222 varduudx.annule(nzm1) ;
00223 }
00224
00225 uu.set_etat_qcq() ;
00226
00227 Base_val sauve_base = varduudx.base ;
00228
00229 vuu = 2. * dxdr * ( rsxdxdr * unjj - 1.) * varduudx
00230 + ( rsxdxdr*rsxdxdr * unjj - 1.) * xsr * sxlapang ;
00231
00232 vuu.set_base(sauve_base) ;
00233
00234 vuu = vuu.sx() ;
00235
00236
00237
00238
00239
00240
00241
00242 sauve_base = vuu.base ;
00243
00244 vuu = xsr * vuu
00245 + 2. * dxdr * ( sr2drdt * d2uudtdx
00246 + sr2stdrdp * std2uudpdx ) ;
00247
00248 vuu += dxdr * ( lapr_tp + dxdr * (
00249 dxdr* unjj * d2rdx2
00250 - 2. * ( sr2drdt * d2rdtdx + sr2stdrdp * sstd2rdpdx ) )
00251 ) * duudx ;
00252
00253 vuu.set_base(sauve_base) ;
00254
00255
00256
00257
00258 uu.set_dzpuis(4) ;
00259
00260 if (source.get_dzpuis() == 2) {
00261 uu.dec2_dzpuis() ;
00262 }
00263
00264 if (source.get_dzpuis() == 3) {
00265 uu.dec_dzpuis() ;
00266 }
00267
00268
00269
00270
00271
00272
00273 ssj = lambda * ssjm1 + unmlambda * ssjm2 ;
00274
00275 ssj = ( source + uu + (amax - apre) * ssj ) / amax ;
00276
00277 (ssj.va).set_base((source.va).base) ;
00278
00279
00280
00281
00282
00283 if ( source.get_dzpuis() == 0 ){
00284 ssj.set_dzpuis( 4 ) ;
00285 }
00286 else {
00287 ssj.set_dzpuis( source.get_dzpuis() ) ;
00288
00289
00290 }
00291
00292 assert( uu.check_dzpuis( ssj.get_dzpuis() ) ) ;
00293
00294 mpaff.poisson_regular(ssj, k_div, nzet, unsgam1, par_nul, uu,
00295 uu_regu, uu_div, duu_div,
00296 source_regu, source_div) ;
00297
00298
00299
00300
00301
00302 Valeur& dr_uu_div = duu_div.set(0).va ;
00303 Valeur& dt_uu_div = duu_div.set(1).va ;
00304 Valeur& dp_uu_div = duu_div.set(2).va ;
00305
00306 Base_val bv = dr_uu_div.base ;
00307 dr_uu_div = alpha[0] * dr_uu_div * dxdr ;
00308 dr_uu_div.set_base( bv ) ;
00309
00310 bv = dt_uu_div.base ;
00311 dt_uu_div = alpha[0] * dt_uu_div * xsr - srdrdt * dr_uu_div ;
00312 dt_uu_div.set_base( bv ) ;
00313
00314 bv = dp_uu_div.base ;
00315 dp_uu_div = alpha[0] * dp_uu_div * xsr - srstdrdp * dr_uu_div ;
00316 dp_uu_div.set_base( bv ) ;
00317
00318 duu_div.set_triad( this->get_bvect_spher() ) ;
00319
00320
00321
00322
00323
00324
00325 tdiff = diffrel(vuu, vuujm1) ;
00326
00327 diff = max(tdiff) ;
00328
00329 cout << " step " << niter << " : " ;
00330 for (int l=0; l<nz; l++) {
00331 cout << tdiff(l) << " " ;
00332 }
00333 cout << endl ;
00334
00335
00336
00337
00338
00339 ssjm2 = ssjm1 ;
00340 ssjm1 = ssj ;
00341 vuujm1 = vuu ;
00342
00343 niter++ ;
00344
00345 }
00346 while ( (diff > precis) && (niter < nitermax) ) ;
00347
00348
00349
00350
00351
00352
00353
00354
00355 }