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
00032
00033 char map_et_poisson_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_poisson.C,v 1.6 2005/08/25 12:14:09 p_grandclement Exp $" ;
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
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 #include "map.h"
00090 #include "cmp.h"
00091 #include "scalar.h"
00092 #include "param.h"
00093 #include "graphique.h"
00094
00095
00096
00097 void Map_et::poisson(const Cmp& source, Param& par, Cmp& uu) const {
00098
00099 assert(source.get_etat() != ETATNONDEF) ;
00100 assert(source.get_mp() == this) ;
00101
00102 assert( source.check_dzpuis(2) || source.check_dzpuis(4)
00103 || source.check_dzpuis(3)) ;
00104
00105 assert(uu.get_mp() == this) ;
00106 assert(uu.check_dzpuis(0)) ;
00107
00108 int nz = mg->get_nzone() ;
00109 int nzm1 = nz - 1 ;
00110
00111
00112 bool zec = false ;
00113 if (mg->get_type_r(nzm1) == UNSURR) {
00114 zec = true ;
00115 }
00116
00117
00118
00119
00120
00121 Mtbl unjj = 1 + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00122
00123 Mtbl apre1(*mg) ;
00124 apre1.set_etat_qcq() ;
00125 for (int l=0; l<nz; l++) {
00126 *(apre1.t[l]) = alpha[l]*alpha[l] ;
00127 }
00128
00129 apre1 = apre1 * dxdr * dxdr * unjj ;
00130
00131 Cmp apre(*this) ;
00132 apre = apre1 ;
00133
00134 Tbl amax0 = max(apre1) ;
00135
00136
00137 Mtbl amax1(*mg) ;
00138 amax1.set_etat_qcq() ;
00139 for (int l=0; l<nz; l++) {
00140 *(amax1.t[l]) = amax0(l) ;
00141 }
00142
00143 Cmp amax(*this) ;
00144 amax = amax1 ;
00145
00146
00147
00148
00149
00150
00151 int nitermax = par.get_int() ;
00152 int& niter = par.get_int_mod() ;
00153 double lambda = par.get_double() ;
00154 double unmlambda = 1. - lambda ;
00155 double precis = par.get_double(1) ;
00156
00157 Cmp& ssj = par.get_cmp_mod() ;
00158
00159 Cmp ssjm1 = ssj ;
00160 Cmp ssjm2 = ssjm1 ;
00161
00162 Valeur& vuu = uu.va ;
00163
00164 Valeur vuujm1(*mg) ;
00165 if (uu.get_etat() == ETATZERO) {
00166 vuujm1 = 1 ;
00167 vuujm1.set_base( vuu.base ) ;
00168 }
00169 else{
00170 vuujm1 = vuu ;
00171 }
00172
00173
00174
00175 Map_af mpaff(*this) ;
00176 Param par_nul ;
00177
00178 cout << "Map_et::poisson : relat. diff. u^J <-> u^{J-1} : " << endl ;
00179
00180
00181
00182
00183
00184
00185
00186 Tbl tdiff(nz) ;
00187 double diff ;
00188 niter = 0 ;
00189
00190 do {
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201 Valeur duudx = (uu.va).dsdx() ;
00202
00203 const Valeur& d2uudtdx = duudx.dsdt() ;
00204
00205 const Valeur& std2uudpdx = duudx.stdsdp() ;
00206
00207
00208
00209
00210
00211 Valeur sxlapang = uu.va ;
00212
00213 sxlapang.ylm() ;
00214
00215 sxlapang = sxlapang.lapang() ;
00216
00217 sxlapang = sxlapang.sx() ;
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 Valeur varduudx = duudx ;
00232
00233 if (zec) {
00234 varduudx.annule(nzm1) ;
00235 }
00236
00237 uu.set_etat_qcq() ;
00238
00239 Base_val sauve_base = varduudx.base ;
00240
00241 vuu = 2. * dxdr * ( rsxdxdr * unjj - 1.) * varduudx
00242 + ( rsxdxdr*rsxdxdr * unjj - 1.) * xsr * sxlapang ;
00243
00244 vuu.set_base(sauve_base) ;
00245
00246 vuu = vuu.sx() ;
00247
00248
00249
00250
00251
00252
00253
00254
00255 sauve_base = vuu.base ;
00256
00257 vuu = xsr * vuu
00258 + 2. * dxdr * ( sr2drdt * d2uudtdx
00259 + sr2stdrdp * std2uudpdx ) ;
00260
00261 vuu += dxdr * ( lapr_tp + dxdr * (
00262 dxdr* unjj * d2rdx2
00263 - 2. * ( sr2drdt * d2rdtdx + sr2stdrdp * sstd2rdpdx ) )
00264 ) * duudx ;
00265
00266 vuu.set_base(sauve_base) ;
00267
00268
00269
00270
00271 uu.set_dzpuis(4) ;
00272
00273 if (source.get_dzpuis() == 2) {
00274 uu.dec2_dzpuis() ;
00275 }
00276
00277 if (source.get_dzpuis() == 3) {
00278 uu.dec_dzpuis() ;
00279 }
00280
00281
00282
00283
00284
00285
00286 ssj = lambda * ssjm1 + unmlambda * ssjm2 ;
00287
00288 ssj = ( source + uu + (amax - apre) * ssj ) / amax ;
00289
00290 (ssj.va).set_base((source.va).base) ;
00291
00292
00293
00294
00295
00296 if ( source.get_dzpuis() == 0 ){
00297 ssj.set_dzpuis( 4 ) ;
00298 }
00299 else {
00300 ssj.set_dzpuis( source.get_dzpuis() ) ;
00301
00302 }
00303
00304 assert( uu.check_dzpuis( ssj.get_dzpuis() ) ) ;
00305
00306 mpaff.poisson(ssj, par_nul, uu) ;
00307
00308 tdiff = diffrel(vuu, vuujm1) ;
00309
00310 diff = max(tdiff) ;
00311
00312
00313 cout << " step " << niter << " : " ;
00314 for (int l=0; l<nz; l++) {
00315 cout << tdiff(l) << " " ;
00316 }
00317 cout << endl ;
00318
00319
00320
00321
00322
00323 ssjm2 = ssjm1 ;
00324 ssjm1 = ssj ;
00325 vuujm1 = vuu ;
00326
00327 niter++ ;
00328
00329 }
00330 while ( (diff > precis) && (niter < nitermax) ) ;
00331
00332
00333
00334
00335
00336
00337
00338 }
00339
00340
00341
00342
00343
00344
00345
00346 void Map_et::poisson_tau(const Cmp& source, Param& par, Cmp& uu) const {
00347
00348 assert(source.get_etat() != ETATNONDEF) ;
00349 assert(source.get_mp() == this) ;
00350
00351 assert( source.check_dzpuis(2) || source.check_dzpuis(4)
00352 || source.check_dzpuis(3)) ;
00353
00354 assert(uu.get_mp() == this) ;
00355 assert(uu.check_dzpuis(0)) ;
00356
00357 int nz = mg->get_nzone() ;
00358 int nzm1 = nz - 1 ;
00359
00360
00361 bool zec = false ;
00362 if (mg->get_type_r(nzm1) == UNSURR) {
00363 zec = true ;
00364 }
00365
00366
00367
00368
00369
00370 Mtbl unjj = 1 + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00371
00372 Mtbl apre1(*mg) ;
00373 apre1.set_etat_qcq() ;
00374 for (int l=0; l<nz; l++) {
00375 *(apre1.t[l]) = alpha[l]*alpha[l] ;
00376 }
00377
00378 apre1 = apre1 * dxdr * dxdr * unjj ;
00379
00380 Cmp apre(*this) ;
00381 apre = apre1 ;
00382
00383 Tbl amax0 = max(apre1) ;
00384
00385
00386 Mtbl amax1(*mg) ;
00387 amax1.set_etat_qcq() ;
00388 for (int l=0; l<nz; l++) {
00389 *(amax1.t[l]) = amax0(l) ;
00390 }
00391
00392 Cmp amax(*this) ;
00393 amax = amax1 ;
00394
00395
00396
00397
00398
00399
00400 int nitermax = par.get_int() ;
00401 int& niter = par.get_int_mod() ;
00402 double lambda = par.get_double() ;
00403 double unmlambda = 1. - lambda ;
00404 double precis = par.get_double(1) ;
00405
00406 Cmp& ssj = par.get_cmp_mod() ;
00407
00408 Cmp ssjm1 = ssj ;
00409 Cmp ssjm2 = ssjm1 ;
00410
00411 Valeur& vuu = uu.va ;
00412
00413 Valeur vuujm1(*mg) ;
00414 if (uu.get_etat() == ETATZERO) {
00415 vuujm1 = 1 ;
00416 vuujm1.set_base( vuu.base ) ;
00417 }
00418 else{
00419 vuujm1 = vuu ;
00420 }
00421
00422
00423
00424 Map_af mpaff(*this) ;
00425 Param par_nul ;
00426
00427 cout << "Map_et::poisson_tau : relat. diff. u^J <-> u^{J-1} : " << endl ;
00428
00429
00430
00431
00432
00433
00434
00435 Tbl tdiff(nz) ;
00436 double diff ;
00437 niter = 0 ;
00438
00439 do {
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450 Valeur duudx = (uu.va).dsdx() ;
00451
00452 const Valeur& d2uudtdx = duudx.dsdt() ;
00453
00454 const Valeur& std2uudpdx = duudx.stdsdp() ;
00455
00456
00457
00458
00459
00460 Valeur sxlapang = uu.va ;
00461
00462 sxlapang.ylm() ;
00463
00464 sxlapang = sxlapang.lapang() ;
00465
00466 sxlapang = sxlapang.sx() ;
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480 Valeur varduudx = duudx ;
00481
00482 if (zec) {
00483 varduudx.annule(nzm1) ;
00484 }
00485
00486 uu.set_etat_qcq() ;
00487
00488 Base_val sauve_base = varduudx.base ;
00489
00490 vuu = 2. * dxdr * ( rsxdxdr * unjj - 1.) * varduudx
00491 + ( rsxdxdr*rsxdxdr * unjj - 1.) * xsr * sxlapang ;
00492
00493 vuu.set_base(sauve_base) ;
00494
00495 vuu = vuu.sx() ;
00496
00497
00498
00499
00500
00501
00502
00503
00504 sauve_base = vuu.base ;
00505
00506 vuu = xsr * vuu
00507 + 2. * dxdr * ( sr2drdt * d2uudtdx
00508 + sr2stdrdp * std2uudpdx ) ;
00509
00510 vuu += dxdr * ( lapr_tp + dxdr * (
00511 dxdr* unjj * d2rdx2
00512 - 2. * ( sr2drdt * d2rdtdx + sr2stdrdp * sstd2rdpdx ) )
00513 ) * duudx ;
00514
00515 vuu.set_base(sauve_base) ;
00516
00517
00518
00519
00520 uu.set_dzpuis(4) ;
00521
00522 if (source.get_dzpuis() == 2) {
00523 uu.dec2_dzpuis() ;
00524 }
00525
00526 if (source.get_dzpuis() == 3) {
00527 uu.dec_dzpuis() ;
00528 }
00529
00530
00531
00532
00533
00534
00535 ssj = lambda * ssjm1 + unmlambda * ssjm2 ;
00536
00537 ssj = ( source + uu + (amax - apre) * ssj ) / amax ;
00538
00539 (ssj.va).set_base((source.va).base) ;
00540
00541
00542
00543
00544
00545 if ( source.get_dzpuis() == 0 ){
00546 ssj.set_dzpuis( 4 ) ;
00547 }
00548 else {
00549 ssj.set_dzpuis( source.get_dzpuis() ) ;
00550
00551 }
00552
00553 assert( uu.check_dzpuis( ssj.get_dzpuis() ) ) ;
00554
00555 mpaff.poisson_tau(ssj, par_nul, uu) ;
00556
00557 tdiff = diffrel(vuu, vuujm1) ;
00558
00559 diff = max(tdiff) ;
00560
00561
00562 cout << " step " << niter << " : " ;
00563 for (int l=0; l<nz; l++) {
00564 cout << tdiff(l) << " " ;
00565 }
00566 cout << endl ;
00567
00568
00569
00570
00571
00572 ssjm2 = ssjm1 ;
00573 ssjm1 = ssj ;
00574 vuujm1 = vuu ;
00575
00576 niter++ ;
00577
00578 }
00579 while ( (diff > precis) && (niter < nitermax) ) ;
00580
00581
00582
00583
00584
00585
00586 }
00587
00588 void Map_et::poisson_angu(const Scalar& source, Param& par, Scalar& uu,
00589 double lambda) const {
00590
00591 if (lambda != double(0)) {
00592 cout <<
00593 "Map_et::poisson_angu : the case lambda != 0 is not treated yet !"
00594 << endl ;
00595 abort() ;
00596 }
00597
00598 assert(source.get_mp() == *this) ;
00599 assert(uu.get_mp() == *this) ;
00600
00601 int nz = mg->get_nzone() ;
00602 int nzm1 = nz - 1 ;
00603
00604 int* nrm6 = new int[nz];
00605 for (int l=0; l<=nzm1; l++)
00606 nrm6[l] = mg->get_nr(l) - 6 ;
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618 int nitermax = par.get_int() ;
00619 int& niter = par.get_int_mod() ;
00620 double relax = par.get_double() ;
00621 double precis = par.get_double(1) ;
00622
00623 Cmp& ssjcmp = par.get_cmp_mod() ;
00624
00625 Scalar ssj (ssjcmp) ;
00626 Scalar ssjm1 (ssj) ;
00627
00628 int dzpuis = source.get_dzpuis() ;
00629 ssj.set_dzpuis(dzpuis) ;
00630 uu.set_dzpuis(dzpuis) ;
00631 ssjm1.set_dzpuis(dzpuis) ;
00632
00633 Valeur& vuu = uu.set_spectral_va() ;
00634
00635 Valeur vuujm1(*mg) ;
00636 if (uu.get_etat() == ETATZERO) {
00637 vuujm1 = 1 ;
00638 vuujm1.set_base( vuu.base ) ;
00639 }
00640 else{
00641 vuujm1 = vuu ;
00642 }
00643
00644
00645
00646 Map_af mpaff(*this) ;
00647 Param par_nul ;
00648
00649 cout << "Map_et::poisson angu : relat. diff. u^J <-> u^{J-1} : " << endl ;
00650
00651
00652
00653
00654
00655
00656
00657
00658 Tbl tdiff(nz) ;
00659 double diff ;
00660 niter = 0 ;
00661
00662 do {
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672 Valeur duudx = (uu.set_spectral_va()).dsdx() ;
00673
00674 const Valeur& d2uudxdx = duudx.dsdx() ;
00675
00676
00677 const Valeur& d2uudtdx = duudx.dsdt() ;
00678
00679 const Valeur& std2uudpdx = duudx.stdsdp() ;
00680
00681
00682
00683
00684
00685
00686
00687 Mtbl unjj = srdrdt*srdrdt + srstdrdp*srstdrdp ;
00688
00689 Base_val sauve_base = vuu.base ;
00690
00691 vuu = - d2uudxdx * dxdr * dxdr * unjj
00692 + 2. * dxdr * ( sr2drdt * d2uudtdx
00693 + sr2stdrdp * std2uudpdx ) ;
00694
00695 vuu.set_base(sauve_base) ;
00696
00697 vuu += dxdr * ( lapr_tp + dxdr * (
00698 dxdr * unjj * d2rdx2
00699 - 2. * ( sr2drdt * d2rdtdx + sr2stdrdp * sstd2rdpdx ) )
00700 ) * duudx ;
00701
00702 vuu.set_base(sauve_base) ;
00703
00704 uu.mult_r() ;
00705 uu.mult_r() ;
00706
00707
00708
00709
00710
00711
00712 uu.filtre_r(nrm6) ;
00713
00714
00715
00716 ssj = source + uu ;
00717
00718 ssj = (1-relax) * ssj + relax * ssjm1 ;
00719
00720 (ssj.set_spectral_va()).set_base((source.get_spectral_va()).base) ;
00721
00722
00723
00724
00725
00726
00727 mpaff.poisson_angu(ssj, par_nul, uu) ;
00728
00729 tdiff = diffrel(vuu, vuujm1) ;
00730
00731 diff = max(tdiff) ;
00732
00733
00734 cout << " step " << niter << " : " ;
00735 for (int l=0; l<nz; l++) {
00736 cout << tdiff(l) << " " ;
00737 }
00738 cout << endl ;
00739
00740
00741
00742
00743
00744 vuujm1 = vuu ;
00745 ssjm1 = ssj ;
00746
00747 niter++ ;
00748
00749 }
00750 while ( (diff > precis) && (niter < nitermax) ) ;
00751
00752
00753
00754
00755
00756
00757
00758 uu.set_dzpuis( source.get_dzpuis() ) ;
00759
00760 }
00761
00762
00763