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 char poisson_angu_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/PDE/poisson_angu.C,v 1.7 2009/10/23 12:55:04 j_novak Exp $" ;
00031
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 #include <stdlib.h>
00067 #include <math.h>
00068
00069
00070 #include "mtbl_cf.h"
00071 #include "grilles.h"
00072 #include "type_parite.h"
00073
00074
00075
00076
00077
00078
00079 void _poisangu_pas_prevu(Mtbl_cf* mt, int l, double) {
00080 cout << "Unknwon theta basis in the operator Mtbl_cf::poisson_angu() !" << endl ;
00081 cout << " basis : " << hex << (mt->base).b[l] << endl ;
00082 abort () ;
00083 }
00084
00085
00086
00087
00088
00089 void _poisangu_t_leg(Mtbl_cf* mt, int l, double lambda)
00090 {
00091
00092 Tbl* tb = mt->t[l] ;
00093
00094
00095 if (tb->get_etat() == ETATZERO) {
00096 return ;
00097 }
00098
00099 int k, j, i ;
00100
00101 int nr = mt->get_mg()->get_nr(l) ;
00102 int nt = mt->get_mg()->get_nt(l) ;
00103 int np = mt->get_mg()->get_np(l) ;
00104
00105 int np1 = ( np == 1 ) ? 1 : np+1 ;
00106
00107 double* tuu = tb->t ;
00108
00109
00110
00111 for (j=0 ; j<nt ; j++) {
00112 int ll = j ;
00113 double xl = - ll*(ll+1) + lambda ;
00114
00115 if (fabs(xl) < 1.e-14) {
00116 for (i=0 ; i<nr ; i++) {
00117 tuu[i] = 0 ;
00118 }
00119 }
00120 else {
00121 for (i=0 ; i<nr ; i++) {
00122 tuu[i] /= xl ;
00123 }
00124 }
00125 tuu += nr ;
00126 }
00127
00128
00129 tuu += nt*nr ;
00130
00131
00132 for (k=2 ; k<np1 ; k++) {
00133 int m = k/2 ;
00134 tuu += (m/2)*nr ;
00135 for (j=m/2 ; j<nt ; j++) {
00136 int ll = j ;
00137 double xl = - ll*(ll+1) + lambda ;
00138
00139 if (fabs(xl) < 1.e-14) {
00140 for (i=0 ; i<nr ; i++) {
00141 tuu[i] = 0 ;
00142 }
00143 }
00144 else {
00145 for (i=0 ; i<nr ; i++) {
00146 tuu[i] /= xl ;
00147 }
00148 }
00149 tuu += nr ;
00150 }
00151 }
00152
00153
00154 }
00155
00156
00157
00158
00159
00160 void _poisangu_t_leg_p(Mtbl_cf* mt, int l, double lambda)
00161 {
00162
00163 Tbl* tb = mt->t[l] ;
00164
00165
00166 if (tb->get_etat() == ETATZERO) {
00167 return ;
00168 }
00169
00170 int k, j, i ;
00171
00172 int nr = mt->get_mg()->get_nr(l) ;
00173 int nt = mt->get_mg()->get_nt(l) ;
00174 int np = mt->get_mg()->get_np(l) ;
00175
00176 int np1 = ( np == 1 ) ? 1 : np+1 ;
00177
00178 double* tuu = tb->t ;
00179
00180
00181
00182 for (j=0 ; j<nt ; j++) {
00183 int ll = 2*j ;
00184 double xl = - ll*(ll+1) + lambda ;
00185
00186 if (fabs(xl) < 1.e-14) {
00187 for (i=0 ; i<nr ; i++) {
00188 tuu[i] = 0 ;
00189 }
00190 }
00191 else {
00192 for (i=0 ; i<nr ; i++) {
00193 tuu[i] /= xl ;
00194 }
00195 }
00196 tuu += nr ;
00197 }
00198
00199
00200 tuu += nt*nr ;
00201
00202
00203 for (k=2 ; k<np1 ; k++) {
00204 int m = k/2 ;
00205 tuu += (m/2)*nr ;
00206 for (j=m/2 ; j<nt ; j++) {
00207 int ll = 2*j + (m%2) ;
00208 double xl = - ll*(ll+1) + lambda ;
00209
00210 if (fabs(xl) < 1.e-14) {
00211 for (i=0 ; i<nr ; i++) {
00212 tuu[i] = 0 ;
00213 }
00214 }
00215 else {
00216 for (i=0 ; i<nr ; i++) {
00217 tuu[i] /= xl ;
00218 }
00219 }
00220 tuu += nr ;
00221 }
00222 }
00223
00224
00225 }
00226
00227
00228
00229
00230
00231 void _poisangu_t_leg_pp(Mtbl_cf* mt, int l, double lambda)
00232 {
00233
00234 Tbl* tb = mt->t[l] ;
00235
00236
00237 if (tb->get_etat() == ETATZERO) {
00238 return ;
00239 }
00240
00241 int k, j, i ;
00242
00243 int nr = mt->get_mg()->get_nr(l) ;
00244 int nt = mt->get_mg()->get_nt(l) ;
00245 int np = mt->get_mg()->get_np(l) ;
00246
00247 int np1 = ( np == 1 ) ? 1 : np+1 ;
00248
00249 double* tuu = tb->t ;
00250
00251
00252
00253 for (j=0 ; j<nt ; j++) {
00254 int ll = 2*j ;
00255 double xl = - ll*(ll+1) + lambda ;
00256
00257 if (fabs(xl) < 1.e-14) {
00258 for (i=0 ; i<nr ; i++) {
00259 tuu[i] = 0 ;
00260 }
00261 }
00262 else {
00263 for (i=0 ; i<nr ; i++) {
00264 tuu[i] /= xl ;
00265 }
00266 }
00267 tuu += nr ;
00268 }
00269
00270
00271 tuu += nt*nr ;
00272
00273
00274 for (k=2 ; k<np1 ; k++) {
00275 int m = 2*(k/2);
00276 tuu += (m/2)*nr ;
00277 for (j=m/2 ; j<nt ; j++) {
00278 int ll = 2*j ;
00279 double xl = - ll*(ll+1) + lambda ;
00280
00281 if (fabs(xl) < 1.e-14) {
00282 for (i=0 ; i<nr ; i++) {
00283 tuu[i] = 0 ;
00284 }
00285 }
00286 else {
00287 for (i=0 ; i<nr ; i++) {
00288 tuu[i] /= xl ;
00289 }
00290 }
00291 tuu += nr ;
00292 }
00293 }
00294
00295
00296 }
00297
00298
00299
00300
00301
00302 void _poisangu_t_leg_i(Mtbl_cf* mt, int l, double lambda)
00303 {
00304
00305 Tbl* tb = mt->t[l] ;
00306
00307
00308 if (tb->get_etat() == ETATZERO) {
00309 return ;
00310 }
00311
00312 int k, j, i ;
00313
00314 int nr = mt->get_mg()->get_nr(l) ;
00315 int nt = mt->get_mg()->get_nt(l) ;
00316 int np = mt->get_mg()->get_np(l) ;
00317
00318 int np1 = ( np == 1 ) ? 1 : np+1 ;
00319
00320 double* tuu = tb->t ;
00321
00322
00323
00324 for (j=0 ; j<nt-1 ; j++) {
00325 int ll = 2*j+1 ;
00326 double xl = - ll*(ll+1) + lambda ;
00327
00328 if (fabs(xl) < 1.e-14) {
00329 for (i=0 ; i<nr ; i++) {
00330 tuu[i] = 0 ;
00331 }
00332 }
00333 else {
00334 for (i=0 ; i<nr ; i++) {
00335 tuu[i] /= xl ;
00336 }
00337 }
00338 tuu += nr ;
00339 }
00340 tuu += nr ;
00341
00342
00343 tuu += nt*nr ;
00344
00345
00346 for (k=2 ; k<np1 ; k++) {
00347 int m = k/2 ;
00348 tuu += ((m+1)/2)*nr ;
00349 for (j=(m+1)/2 ; j<nt-1 ; j++) {
00350 int ll = 2*j + ((m+1)%2) ;
00351 double xl = - ll*(ll+1) + lambda ;
00352
00353 if (fabs(xl) < 1.e-14) {
00354 for (i=0 ; i<nr ; i++) {
00355 tuu[i] = 0 ;
00356 }
00357 }
00358 else {
00359 for (i=0 ; i<nr ; i++) {
00360 tuu[i] /= xl ;
00361 }
00362 }
00363 tuu += nr ;
00364 }
00365 tuu += nr ;
00366 }
00367
00368
00369 }
00370
00371
00372
00373
00374
00375 void _poisangu_t_leg_ip(Mtbl_cf* mt, int l, double lambda)
00376 {
00377
00378 Tbl* tb = mt->t[l] ;
00379
00380
00381 if (tb->get_etat() == ETATZERO) {
00382 return ;
00383 }
00384
00385 int k, j, i ;
00386
00387 int nr = mt->get_mg()->get_nr(l) ;
00388 int nt = mt->get_mg()->get_nt(l) ;
00389 int np = mt->get_mg()->get_np(l) ;
00390
00391 int np1 = ( np == 1 ) ? 1 : np+1 ;
00392
00393 double* tuu = tb->t ;
00394
00395
00396
00397 for (j=0 ; j<nt-1 ; j++) {
00398 int ll = 2*j+1 ;
00399 double xl = - ll*(ll+1) + lambda ;
00400
00401 if (fabs(xl) < 1.e-14) {
00402 for (i=0 ; i<nr ; i++) {
00403 tuu[i] = 0 ;
00404 }
00405 }
00406 else {
00407 for (i=0 ; i<nr ; i++) {
00408 tuu[i] /= xl ;
00409 }
00410 }
00411 tuu += nr ;
00412 }
00413 tuu += nr ;
00414
00415
00416 tuu += nt*nr ;
00417
00418
00419 for (k=2 ; k<np1 ; k++) {
00420 int m = 2*(k/2);
00421 tuu += (m/2)*nr ;
00422 for (j=m/2 ; j<nt-1 ; j++) {
00423 int ll = 2*j+1 ;
00424 double xl = - ll*(ll+1) + lambda ;
00425
00426 if (fabs(xl) < 1.e-14) {
00427 for (i=0 ; i<nr ; i++) {
00428 tuu[i] = 0 ;
00429 }
00430 }
00431 else {
00432 for (i=0 ; i<nr ; i++) {
00433 tuu[i] /= xl ;
00434 }
00435 }
00436 tuu += nr ;
00437 }
00438 tuu += nr ;
00439 }
00440
00441
00442 assert (tuu == tb->t + (np+1)*nt*nr) ;
00443
00444
00445 }
00446
00447
00448
00449
00450
00451 void _poisangu_t_leg_pi(Mtbl_cf* mt, int l, double lambda)
00452 {
00453
00454 Tbl* tb = mt->t[l] ;
00455
00456
00457 if (tb->get_etat() == ETATZERO) {
00458 return ;
00459 }
00460
00461 int k, j, i ;
00462
00463 int nr = mt->get_mg()->get_nr(l) ;
00464 int nt = mt->get_mg()->get_nt(l) ;
00465 int np = mt->get_mg()->get_np(l) ;
00466
00467 double* tuu = tb->t ;
00468
00469
00470
00471
00472 for (j=0 ; j<nt-1 ; j++) {
00473 int ll = 2*j+1 ;
00474 double xl = - ll*(ll+1) + lambda ;
00475
00476 if (fabs(xl) < 1.e-14) {
00477 for (i=0 ; i<nr ; i++) {
00478 tuu[i] = 0 ;
00479 }
00480 }
00481 else {
00482 for (i=0 ; i<nr ; i++) {
00483 tuu[i] /= xl ;
00484 }
00485 }
00486 tuu += nr ;
00487 }
00488 tuu += nr ;
00489
00490 if (np==1) {
00491 return ;
00492 }
00493
00494
00495
00496 tuu += nt*nr ;
00497
00498
00499
00500 for (j=0 ; j<nt-1 ; j++) {
00501 int ll = 2*j+1 ;
00502 double xl = - ll*(ll+1) + lambda ;
00503
00504 if (fabs(xl) < 1.e-14) {
00505 for (i=0 ; i<nr ; i++) {
00506 tuu[i] = 0 ;
00507 }
00508 }
00509 else {
00510 for (i=0 ; i<nr ; i++) {
00511 tuu[i] /= xl ;
00512 }
00513 }
00514 tuu += nr ;
00515 }
00516 tuu += nr ;
00517
00518
00519
00520 for (k=3 ; k<np+1 ; k++) {
00521 int m = (k%2 == 0) ? k-1 : k ;
00522 tuu += (m-1)/2*nr ;
00523 for (j=(m-1)/2 ; j<nt-1 ; j++) {
00524 int ll = 2*j+1 ;
00525 double xl = - ll*(ll+1) + lambda ;
00526
00527 if (fabs(xl) < 1.e-14) {
00528 for (i=0 ; i<nr ; i++) {
00529 tuu[i] = 0 ;
00530 }
00531 }
00532 else {
00533 for (i=0 ; i<nr ; i++) {
00534 tuu[i] /= xl ;
00535 }
00536 }
00537 tuu += nr ;
00538 }
00539 tuu += nr ;
00540 }
00541
00542
00543 assert (tuu == tb->t + (np+1)*nt*nr) ;
00544
00545
00546 }
00547
00548
00549
00550
00551
00552 void _poisangu_t_leg_ii(Mtbl_cf* mt, int l, double lambda)
00553 {
00554
00555 Tbl* tb = mt->t[l] ;
00556
00557
00558 if (tb->get_etat() == ETATZERO) {
00559 return ;
00560 }
00561
00562 int k, j, i ;
00563
00564 int nr = mt->get_mg()->get_nr(l) ;
00565 int nt = mt->get_mg()->get_nt(l) ;
00566 int np = mt->get_mg()->get_np(l) ;
00567
00568 double* tuu = tb->t ;
00569
00570
00571
00572
00573 for (j=0 ; j<nt-1 ; j++) {
00574 int ll = 2*j ;
00575 double xl = - ll*(ll+1) + lambda ;
00576
00577 if (fabs(xl) < 1.e-14) {
00578 for (i=0 ; i<nr ; i++) {
00579 tuu[i] = 0 ;
00580 }
00581 }
00582 else {
00583 for (i=0 ; i<nr ; i++) {
00584 tuu[i] /= xl ;
00585 }
00586 }
00587 tuu += nr ;
00588 }
00589 tuu += nr ;
00590
00591 if (np==1) {
00592 return ;
00593 }
00594
00595
00596
00597 tuu += nt*nr ;
00598
00599
00600
00601 for (j=0 ; j<nt-1 ; j++) {
00602 int ll = 2*j+1 ;
00603 double xl = - ll*(ll+1) + lambda ;
00604
00605 if (fabs(xl) < 1.e-14) {
00606 for (i=0 ; i<nr ; i++) {
00607 tuu[i] = 0 ;
00608 }
00609 }
00610 else {
00611 for (i=0 ; i<nr ; i++) {
00612 tuu[i] /= xl ;
00613 }
00614 }
00615 tuu += nr ;
00616 }
00617 tuu += nr ;
00618
00619
00620
00621 for (k=3 ; k<np+1 ; k++) {
00622 int m = (k%2 == 0) ? k-1 : k ;
00623 tuu += (m+1)/2*nr ;
00624 for (j=(m+1)/2 ; j<nt-1 ; j++) {
00625 int ll = 2*j ;
00626 double xl = - ll*(ll+1) + lambda ;
00627
00628 if (fabs(xl) < 1.e-14) {
00629 for (i=0 ; i<nr ; i++) {
00630 tuu[i] = 0 ;
00631 }
00632 }
00633 else {
00634 for (i=0 ; i<nr ; i++) {
00635 tuu[i] /= xl ;
00636 }
00637 }
00638 tuu += nr ;
00639 }
00640 tuu += nr ;
00641 }
00642
00643
00644 assert (tuu == tb->t + (np+1)*nt*nr) ;
00645
00646
00647 }
00648
00649
00650
00651
00652
00653 void _poisangu_t_leg_mp(Mtbl_cf* mt, int l, double lambda)
00654 {
00655
00656 Tbl* tb = mt->t[l] ;
00657
00658
00659 if (tb->get_etat() == ETATZERO) {
00660 return ;
00661 }
00662
00663 int k, j, i ;
00664
00665 int nr = mt->get_mg()->get_nr(l) ;
00666 int nt = mt->get_mg()->get_nt(l) ;
00667 int np = mt->get_mg()->get_np(l) ;
00668
00669 int np1 = ( np == 1 ) ? 1 : np+1 ;
00670
00671 double* tuu = tb->t ;
00672
00673
00674
00675 for (j=0 ; j<nt ; j++) {
00676 int ll = j ;
00677 double xl = - ll*(ll+1) + lambda ;
00678
00679 if (fabs(xl) < 1.e-14) {
00680 for (i=0 ; i<nr ; i++) {
00681 tuu[i] = 0 ;
00682 }
00683 }
00684 else {
00685 for (i=0 ; i<nr ; i++) {
00686 tuu[i] /= xl ;
00687 }
00688 }
00689 tuu += nr ;
00690 }
00691
00692
00693 tuu += nt*nr ;
00694
00695
00696 for (k=2 ; k<np1 ; k++) {
00697 int m = 2*(k/2);
00698 tuu += m*nr ;
00699 for (j=m ; j<nt ; j++) {
00700 int ll = j ;
00701 double xl = - ll*(ll+1) + lambda ;
00702
00703 if (fabs(xl) < 1.e-14) {
00704 for (i=0 ; i<nr ; i++) {
00705 tuu[i] = 0 ;
00706 }
00707 }
00708 else {
00709 for (i=0 ; i<nr ; i++) {
00710 tuu[i] /= xl ;
00711 }
00712 }
00713 tuu += nr ;
00714 }
00715 }
00716
00717
00718 }
00719
00720
00721
00722
00723
00724 void _poisangu_t_leg_mi(Mtbl_cf* mt, int l, double lambda)
00725 {
00726
00727 Tbl* tb = mt->t[l] ;
00728
00729
00730 if (tb->get_etat() == ETATZERO) {
00731 return ;
00732 }
00733
00734 int k, j, i ;
00735
00736 int nr = mt->get_mg()->get_nr(l) ;
00737 int nt = mt->get_mg()->get_nt(l) ;
00738 int np = mt->get_mg()->get_np(l) ;
00739
00740 int np1 = ( np == 1 ) ? 1 : np+1 ;
00741
00742 double* tuu = tb->t ;
00743
00744
00745
00746 for (j=0 ; j<nt-1 ; j++) {
00747 int ll = j ;
00748 double xl = - ll*(ll+1) + lambda ;
00749
00750 if (fabs(xl) < 1.e-14) {
00751 for (i=0 ; i<nr ; i++) {
00752 tuu[i] = 0 ;
00753 }
00754 }
00755 else {
00756 for (i=0 ; i<nr ; i++) {
00757 tuu[i] /= xl ;
00758 }
00759 }
00760 tuu += nr ;
00761 }
00762 tuu += nr ;
00763
00764
00765 tuu += nt*nr ;
00766
00767
00768 for (k=2 ; k<np1 ; k++) {
00769 int m = 2*((k-1)/2) + 1 ;
00770 tuu += m*nr ;
00771 for (j=m ; j<nt-1 ; j++) {
00772 int ll = j ;
00773 double xl = - ll*(ll+1) + lambda ;
00774
00775 if (fabs(xl) < 1.e-14) {
00776 for (i=0 ; i<nr ; i++) {
00777 tuu[i] = 0 ;
00778 }
00779 }
00780 else {
00781 for (i=0 ; i<nr ; i++) {
00782 tuu[i] /= xl ;
00783 }
00784 }
00785 tuu += nr ;
00786 }
00787 tuu += nr ;
00788 }
00789
00790
00791 }
00792