00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 char op_scost_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_scost.C,v 1.6 2009/10/10 18:28:11 j_novak Exp $" ;
00024
00025
00026
00027
00028
00029
00030
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
00067
00068
00069
00070
00071
00072
00073
00074
00075 #include "tbl.h"
00076
00077
00078
00079
00080
00081
00082 void _scost_pas_prevu(Tbl * tb, int& base) {
00083 cout << "scost pas prevu..." << endl ;
00084 cout << "Tbl: " << tb << " base: " << base << endl ;
00085 abort () ;
00086 exit(-1) ;
00087 }
00088
00089
00090
00091
00092
00093 void _scost_t_cos(Tbl* tb, int & b)
00094 {
00095
00096
00097 if (tb->get_etat() == ETATZERO) {
00098 int base_r = b & MSQ_R ;
00099 int base_p = b & MSQ_P ;
00100 switch(base_r){
00101 case(R_CHEBPI_P):
00102 b = R_CHEBPI_I | base_p | T_COS ;
00103 break ;
00104 case(R_CHEBPI_I):
00105 b = R_CHEBPI_P | base_p | T_COS ;
00106 break ;
00107 default:
00108 b = base_r | base_p | T_COS ;
00109 break;
00110 }
00111 return ;
00112 }
00113
00114
00115 assert(tb->get_etat() == ETATQCQ) ;
00116
00117
00118 int nr = (tb->dim).dim[0] ;
00119 int nt = (tb->dim).dim[1] ;
00120 int np = (tb->dim).dim[2] ;
00121 np = np - 2 ;
00122
00123
00124 double* somP = new double [nr] ;
00125 double* somN = new double [nr] ;
00126
00127
00128 double* xo = new double[(tb->dim).taille] ;
00129
00130
00131 for (int i=0; i<(tb->dim).taille; i++) {
00132 xo[i] = 0 ;
00133 }
00134
00135
00136 double* xi = tb->t ;
00137 double* xci = xi ;
00138 double* xco = xo ;
00139
00140
00141
00142
00143
00144 xci += nr * (nt-1) ;
00145 xco += nr * (nt-1) ;
00146
00147
00148 for (int i=0 ; i<nr ; i++) {
00149 somP[i] = 0. ;
00150 somN[i] = 0. ;
00151 xco[i] = 0. ;
00152 }
00153
00154
00155 for (int j=nt-2 ; j >= 0 ; j--) {
00156
00157 xci -= nr ;
00158 xco -= nr ;
00159
00160 for (int i=0 ; i<nr ; i++ ) {
00161 if((j%2) == 1) {
00162 somN[i] = -somN[i] ;
00163 somN[i] += 2*xci[i] ;
00164 xco[i] = somP[i] ;
00165 }
00166 else {
00167 somP[i] = -somP[i] ;
00168 somP[i] += 2*xci[i] ;
00169 xco[i] = somN[i] ;
00170 }
00171 }
00172 }
00173
00174 for (int i=0 ; i<nr ; i++) xco[i] *= .5 ;
00175
00176
00177 xci += nr*nt ;
00178 xco += nr*nt ;
00179
00180
00181 xci += nr*nt ;
00182 xco += nr*nt ;
00183
00184
00185 for (int k=2 ; k<np+1 ; k++) {
00186
00187
00188
00189 xci += nr * (nt-1) ;
00190 xco += nr * (nt-1) ;
00191
00192
00193 for (int i=0 ; i<nr ; i++) {
00194 somP[i] = 0. ;
00195 somN[i] = 0. ;
00196 xco[i] = 0. ;
00197 }
00198
00199
00200 for (int j=nt-2 ; j >= 0 ; j--) {
00201
00202 xci -= nr ;
00203 xco -= nr ;
00204
00205 for (int i=0 ; i<nr ; i++ ) {
00206 if((j%2) == 1) {
00207 somN[i] = -somN[i];
00208 somN[i] += 2 * xci[i] ;
00209 xco[i] = somP[i] ;
00210 }
00211 else {
00212 somP[i] = -somP[i];
00213 somP[i] += 2 * xci[i] ;
00214 xco[i] = somN[i];
00215 }
00216 }
00217 }
00218
00219 for (int i=0 ; i<nr ; i++) xco[i] *= 0.5 ;
00220
00221
00222 xci += nr*nt ;
00223 xco += nr*nt ;
00224 }
00225
00226
00227 delete [] tb->t ;
00228 tb->t = xo ;
00229
00230
00231 delete [] somP ;
00232 delete [] somN ;
00233
00234
00235 int base_r = b & MSQ_R ;
00236 int base_p = b & MSQ_P ;
00237 switch(base_r){
00238 case(R_CHEBPI_P):
00239 b = R_CHEBPI_I | base_p | T_COS ;
00240 break ;
00241 case(R_CHEBPI_I):
00242 b = R_CHEBPI_P | base_p | T_COS ;
00243 break ;
00244 default:
00245 b = base_r | base_p | T_COS ;
00246 break;
00247 }
00248 }
00249
00250
00251
00252
00253
00254 void _scost_t_sin(Tbl* tb, int & b)
00255 {
00256
00257
00258
00259 if (tb->get_etat() == ETATZERO) {
00260 int base_r = b & MSQ_R ;
00261 int base_p = b & MSQ_P ;
00262 switch(base_r){
00263 case(R_CHEBPI_P):
00264 b = R_CHEBPI_I | base_p | T_SIN ;
00265 break ;
00266 case(R_CHEBPI_I):
00267 b = R_CHEBPI_P | base_p | T_SIN ;
00268 break ;
00269 default:
00270 b = base_r | base_p | T_SIN ;
00271 break;
00272 }
00273 return ;
00274 }
00275
00276
00277 assert(tb->get_etat() == ETATQCQ) ;
00278
00279
00280 int nr = (tb->dim).dim[0] ;
00281 int nt = (tb->dim).dim[1] ;
00282 int np = (tb->dim).dim[2] ;
00283 np = np - 2 ;
00284
00285
00286 double* somP = new double [nr] ;
00287 double* somN = new double [nr] ;
00288
00289
00290 double* xo = new double[(tb->dim).taille] ;
00291
00292
00293 for (int i=0; i<(tb->dim).taille; i++) {
00294 xo[i] = 0 ;
00295 }
00296
00297
00298 double* xi = tb->t ;
00299 double* xci = xi ;
00300 double* xco = xo ;
00301
00302
00303
00304
00305
00306 xci += nr * (nt-1) ;
00307 xco += nr * (nt-1) ;
00308
00309
00310 for (int i=0 ; i<nr ; i++) {
00311 somP[i] = 0. ;
00312 somN[i] = 0. ;
00313 xco[i] = 0. ;
00314 }
00315
00316
00317 for (int j=nt-2 ; j >= 0 ; j--) {
00318
00319 xci -= nr ;
00320 xco -= nr ;
00321
00322 for (int i=0 ; i<nr ; i++ ) {
00323 if((j%2) == 1) {
00324 somN[i] = -somN[i] ;
00325 somN[i] += 2*xci[i] ;
00326 xco[i] = somP[i] ;
00327 }
00328 else {
00329 somP[i] = -somP[i] ;
00330 somP[i] += 2*xci[i] ;
00331 xco[i] = somN[i] ;
00332 }
00333 }
00334 }
00335
00336 for (int i=0 ; i<nr ; i++) xco[i] = 0. ;
00337
00338
00339 xci += nr*nt ;
00340 xco += nr*nt ;
00341
00342
00343 xci += nr*nt ;
00344 xco += nr*nt ;
00345
00346
00347 for (int k=2 ; k<np+1 ; k++) {
00348
00349
00350
00351 xci += nr * (nt-1) ;
00352 xco += nr * (nt-1) ;
00353
00354
00355 for (int i=0 ; i<nr ; i++) {
00356 somP[i] = 0. ;
00357 somN[i] = 0. ;
00358 xco[i] = 0. ;
00359 }
00360
00361
00362 for (int j=nt-2 ; j >= 0 ; j--) {
00363
00364 xci -= nr ;
00365 xco -= nr ;
00366
00367 for (int i=0 ; i<nr ; i++ ) {
00368 if((j%2) == 1) {
00369 somN[i] = -somN[i] ;
00370 somN[i] += 2*xci[i] ;
00371 xco[i] = somP[i] ;
00372 }
00373 else {
00374 somP[i] = -somP[i] ;
00375 somP[i] += 2*xci[i] ;
00376 xco[i] = somN[i] ;
00377 }
00378 }
00379 }
00380
00381 for (int i=0 ; i<nr ; i++) xco[i] = 0. ;
00382
00383
00384 xci += nr*nt ;
00385 xco += nr*nt ;
00386
00387 }
00388
00389
00390 delete [] tb->t ;
00391 tb->t = xo ;
00392
00393
00394 delete [] somP ;
00395 delete [] somN ;
00396
00397
00398 int base_r = b & MSQ_R ;
00399 int base_p = b & MSQ_P ;
00400 switch(base_r){
00401 case(R_CHEBPI_P):
00402 b = R_CHEBPI_I | base_p | T_SIN ;
00403 break ;
00404 case(R_CHEBPI_I):
00405 b = R_CHEBPI_P | base_p | T_SIN ;
00406 break ;
00407 default:
00408 b = base_r | base_p | T_SIN ;
00409 break;
00410 }
00411 }
00412
00413
00414
00415
00416 void _scost_t_cos_p(Tbl* tb, int & b)
00417 {
00418
00419
00420 if (tb->get_etat() == ETATZERO) {
00421 int base_r = b & MSQ_R ;
00422 int base_p = b & MSQ_P ;
00423 b = base_r | base_p | T_COS_I ;
00424 return ;
00425 }
00426
00427
00428 assert(tb->get_etat() == ETATQCQ) ;
00429
00430
00431 int nr = (tb->dim).dim[0] ;
00432 int nt = (tb->dim).dim[1] ;
00433 int np = (tb->dim).dim[2] ;
00434 np = np - 2 ;
00435
00436
00437 double* som = new double [nr] ;
00438
00439
00440 double* xo = new double[(tb->dim).taille] ;
00441
00442
00443 for (int i=0; i<(tb->dim).taille; i++) {
00444 xo[i] = 0 ;
00445 }
00446
00447
00448 double* xi = tb->t ;
00449 double* xci = xi ;
00450 double* xco = xo ;
00451
00452
00453
00454
00455
00456 xci += nr * (nt) ;
00457 xco += nr * (nt-1) ;
00458
00459
00460 for (int i=0 ; i<nr ; i++) {
00461 som[i] = 0. ;
00462 xco[i] = 0. ;
00463 }
00464
00465
00466 for (int j=nt-2 ; j >= 0 ; j--) {
00467
00468 xci -= nr ;
00469 xco -= nr ;
00470
00471 for (int i=0 ; i<nr ; i++ ) {
00472 som[i] += 2*xci[i] ;
00473 xco[i] = som[i] ;
00474 som[i] = -som[i] ;
00475 }
00476 }
00477
00478 xci -= nr ;
00479 xci += nr*nt ;
00480 xco += nr*nt ;
00481
00482
00483 xci += nr*nt ;
00484 xco += nr*nt ;
00485
00486
00487 for (int k=2 ; k<np+1 ; k++) {
00488
00489
00490
00491 xci += nr * (nt) ;
00492 xco += nr * (nt-1) ;
00493
00494
00495 for (int i=0 ; i<nr ; i++) {
00496 som[i] = 0. ;
00497 xco[i] = 0. ;
00498 }
00499
00500
00501 for (int j=nt-2 ; j >= 0 ; j--) {
00502
00503 xci -= nr ;
00504 xco -= nr ;
00505
00506 for (int i=0 ; i<nr ; i++ ) {
00507 som[i] += 2*xci[i] ;
00508 xco[i] = som[i] ;
00509 som[i] = - som[i] ;
00510 }
00511 }
00512
00513 xci -= nr ;
00514 xci += nr*nt ;
00515 xco += nr*nt ;
00516 }
00517
00518
00519 delete [] tb->t ;
00520 tb->t = xo ;
00521
00522
00523 delete [] som ;
00524
00525
00526 int base_r = b & MSQ_R ;
00527 int base_p = b & MSQ_P ;
00528 b = base_r | base_p | T_COS_I ;
00529 }
00530
00531
00532
00533
00534
00535 void _scost_t_sin_p(Tbl* tb, int & b)
00536 {
00537
00538
00539
00540 if (tb->get_etat() == ETATZERO) {
00541 int base_r = b & MSQ_R ;
00542 int base_p = b & MSQ_P ;
00543 b = base_r | base_p | T_SIN_I ;
00544 return ;
00545 }
00546
00547
00548 assert(tb->get_etat() == ETATQCQ) ;
00549
00550
00551 int nr = (tb->dim).dim[0] ;
00552 int nt = (tb->dim).dim[1] ;
00553 int np = (tb->dim).dim[2] ;
00554 np = np - 2 ;
00555
00556
00557 double* som = new double [nr] ;
00558
00559
00560 double* xo = new double[(tb->dim).taille] ;
00561
00562
00563 for (int i=0; i<(tb->dim).taille; i++) {
00564 xo[i] = 0 ;
00565 }
00566
00567
00568 double* xi = tb->t ;
00569 double* xci = xi ;
00570 double* xco = xo ;
00571
00572
00573
00574
00575
00576 xci += nr * nt ;
00577 xco += nr * (nt-1) ;
00578
00579
00580 for (int i=0 ; i<nr ; i++) {
00581 som[i] = 0. ;
00582 xco[i] = 0. ;
00583 }
00584
00585
00586 for (int j=nt-2 ; j >= 0 ; j--) {
00587
00588 xci -= nr ;
00589 xco -= nr ;
00590
00591 for (int i=0 ; i<nr ; i++ ) {
00592 som[i] += 2*xci[i] ;
00593 xco[i] = som[i] ;
00594 som[i] = -som[i] ;
00595 }
00596 }
00597
00598 xci -= nr ;
00599 xci += nr*nt ;
00600 xco += nr*nt ;
00601
00602
00603 xci += nr*nt ;
00604 xco += nr*nt ;
00605
00606
00607 for (int k=2 ; k<np+1 ; k++) {
00608
00609
00610
00611 xci += nr * nt ;
00612 xco += nr * (nt-1) ;
00613
00614
00615 for (int i=0 ; i<nr ; i++) {
00616 som[i] = 0. ;
00617 xco[i] = 0. ;
00618 }
00619
00620
00621 for (int j=nt-2 ; j >= 0 ; j--) {
00622
00623 xci -= nr ;
00624 xco -= nr ;
00625
00626 for (int i=0 ; i<nr ; i++ ) {
00627 som[i] += 2*xci[i] ;
00628 xco[i] = som[i] ;
00629 som[i] = -som[i] ;
00630 }
00631 }
00632
00633 xci -= nr ;
00634 xci += nr*nt ;
00635 xco += nr*nt ;
00636 }
00637
00638
00639 delete [] tb->t ;
00640 tb->t = xo ;
00641
00642
00643 delete [] som ;
00644
00645
00646 int base_r = b & MSQ_R ;
00647 int base_p = b & MSQ_P ;
00648 b = base_r | base_p | T_SIN_I ;
00649
00650 }
00651
00652
00653
00654
00655 void _scost_t_sin_i(Tbl* tb, int & b)
00656 {
00657
00658
00659
00660 if (tb->get_etat() == ETATZERO) {
00661 int base_r = b & MSQ_R ;
00662 int base_p = b & MSQ_P ;
00663 b = base_r | base_p | T_SIN_P ;
00664 return ;
00665 }
00666
00667
00668 assert(tb->get_etat() == ETATQCQ) ;
00669
00670
00671 int nr = (tb->dim).dim[0] ;
00672 int nt = (tb->dim).dim[1] ;
00673 int np = (tb->dim).dim[2] ;
00674 np = np - 2 ;
00675
00676
00677 double* som = new double [nr] ;
00678
00679
00680 double* xo = new double[(tb->dim).taille] ;
00681
00682
00683 for (int i=0; i<(tb->dim).taille; i++) {
00684 xo[i] = 0 ;
00685 }
00686
00687
00688 double* xi = tb->t ;
00689 double* xci = xi ;
00690 double* xco = xo ;
00691
00692
00693
00694
00695
00696
00697 xci += nr * (nt-1) ;
00698 xco += nr * (nt-1) ;
00699
00700
00701 for (int i=0 ; i<nr ; i++) {
00702 xco[i] = 0. ;
00703 som[i] = 0. ;
00704 }
00705
00706
00707 for (int j=nt-2 ; j >= 1 ; j--) {
00708
00709 xci -= nr ;
00710 xco -= nr ;
00711
00712 for (int i=0 ; i<nr ; i++ ) {
00713 som[i] += 2*xci[i] ;
00714 xco[i] = som[i] ;
00715 som[i] = -som[i] ;
00716 }
00717 }
00718 if (nt > 1) {
00719 xci -= nr ;
00720 xco -= nr ;
00721
00722 for (int i=0 ; i<nr ; i++ ) {
00723 xco[i] =0. ;
00724 }
00725 }
00726
00727 xci += nr*nt ;
00728 xco += nr*nt ;
00729
00730
00731 xci += nr*nt ;
00732 xco += nr*nt ;
00733
00734
00735 for (int k=2 ; k<np+1 ; k++) {
00736
00737
00738
00739 xci += nr * (nt-1) ;
00740 xco += nr * (nt-1) ;
00741
00742
00743 for (int i=0 ; i<nr ; i++) {
00744 xco[i] = 0. ;
00745 som[i] = 0. ;
00746 }
00747
00748
00749 for (int j=nt-2 ; j >= 1 ; j--) {
00750
00751 xci -= nr ;
00752 xco -= nr ;
00753
00754 for (int i=0 ; i<nr ; i++ ) {
00755 som[i] += 2*xci[i] ;
00756 xco[i] = som[i] ;
00757 som[i] = -som[i] ;
00758 }
00759 }
00760 xci -= nr ;
00761 xco -= nr ;
00762
00763 for (int i=0 ; i<nr ; i++ ) {
00764 xco[i] =0. ;
00765 }
00766
00767 xci += nr*nt ;
00768 xco += nr*nt ;
00769 }
00770
00771
00772
00773 delete [] tb->t ;
00774 tb->t = xo ;
00775
00776
00777 delete [] som ;
00778
00779
00780 int base_r = b & MSQ_R ;
00781 int base_p = b & MSQ_P ;
00782 b = base_r | base_p | T_SIN_P ;
00783
00784 }
00785
00786
00787
00788 void _scost_t_cos_i(Tbl* tb, int & b)
00789 {
00790
00791
00792 if (tb->get_etat() == ETATZERO) {
00793 int base_r = b & MSQ_R ;
00794 int base_p = b & MSQ_P ;
00795 b = base_r | base_p | T_COS_P ;
00796 return ;
00797 }
00798
00799
00800 assert(tb->get_etat() == ETATQCQ) ;
00801
00802
00803 int nr = (tb->dim).dim[0] ;
00804 int nt = (tb->dim).dim[1] ;
00805 int np = (tb->dim).dim[2] ;
00806 np = np - 2 ;
00807
00808
00809 double* som = new double [nr] ;
00810
00811
00812 double* xo = new double[(tb->dim).taille] ;
00813
00814
00815 for (int i=0; i<(tb->dim).taille; i++) {
00816 xo[i] = 0 ;
00817 }
00818
00819
00820 double* xi = tb->t ;
00821 double* xci = xi ;
00822 double* xco = xo ;
00823
00824
00825
00826
00827
00828 xci += nr * (nt-1) ;
00829 xco += nr * (nt-1) ;
00830
00831
00832 for (int i=0 ; i<nr ; i++) {
00833 som[i] = 0. ;
00834 xco[i] = 0. ;
00835 }
00836
00837
00838 for (int j=nt-2 ; j >= 0 ; j--) {
00839
00840 xci -= nr ;
00841 xco -= nr ;
00842
00843 for (int i=0 ; i<nr ; i++ ) {
00844 som[i] += 2*xci[i] ;
00845 xco[i] = som[i] ;
00846 som[i] = - som[i] ;
00847 }
00848 }
00849
00850 for (int i=0 ; i<nr ; i++) {
00851 xco[i] *= .5 ;
00852 }
00853
00854 xci += nr*nt ;
00855 xco += nr*nt ;
00856
00857
00858 xci += nr*nt ;
00859 xco += nr*nt ;
00860
00861
00862 for (int k=2 ; k<np+1 ; k++) {
00863
00864
00865
00866 xci += nr * (nt-1) ;
00867 xco += nr * (nt-1) ;
00868
00869
00870 for (int i=0 ; i<nr ; i++) {
00871 som[i] = 0. ;
00872 xco[i] = 0. ;
00873 }
00874
00875
00876 for (int j=nt-2 ; j >= 0 ; j--) {
00877
00878 xci -= nr ;
00879 xco -= nr ;
00880
00881 for (int i=0 ; i<nr ; i++ ) {
00882 som[i] += 2*xci[i] ;
00883 xco[i] = som[i] ;
00884 som[i] = -som[i] ;
00885 }
00886 }
00887
00888 for (int i=0 ; i<nr ; i++) {
00889 xco[i] *= .5 ;
00890 }
00891
00892 xci += nr*nt ;
00893 xco += nr*nt ;
00894 }
00895
00896
00897 delete [] tb->t ;
00898 tb->t = xo ;
00899
00900
00901 delete [] som ;
00902
00903
00904 int base_r = b & MSQ_R ;
00905 int base_p = b & MSQ_P ;
00906 b = base_r | base_p | T_COS_P ;
00907
00908 }
00909
00910
00911
00912 void _scost_t_cossin_cp(Tbl* tb, int & b)
00913 {
00914
00915
00916 if (tb->get_etat() == ETATZERO) {
00917 int base_r = b & MSQ_R ;
00918 int base_p = b & MSQ_P ;
00919 b = base_r | base_p | T_COSSIN_CI ;
00920 return ;
00921 }
00922
00923
00924 assert(tb->get_etat() == ETATQCQ) ;
00925
00926
00927 int nr = (tb->dim).dim[0] ;
00928 int nt = (tb->dim).dim[1] ;
00929 int np = (tb->dim).dim[2] ;
00930 np = np - 2 ;
00931
00932
00933 double* som = new double [nr] ;
00934
00935
00936 double* xo = new double[(tb->dim).taille] ;
00937
00938
00939 for (int i=0; i<(tb->dim).taille; i++) {
00940 xo[i] = 0 ;
00941 }
00942
00943
00944 double* xi = tb->t ;
00945 double* xci = xi ;
00946 double* xco = xo ;
00947
00948
00949 int m = 0 ;
00950
00951
00952
00953 xci += nr * (nt) ;
00954 xco += nr * (nt-1) ;
00955
00956
00957 for (int i=0 ; i<nr ; i++) {
00958 som[i] = 0. ;
00959 xco[i] = 0. ;
00960 }
00961
00962
00963 for (int j=nt-2 ; j >= 0 ; j--) {
00964
00965 xci -= nr ;
00966 xco -= nr ;
00967
00968 for (int i=0 ; i<nr ; i++ ) {
00969 som[i] += 2*xci[i] ;
00970 xco[i] = som[i] ;
00971 som[i] = -som[i] ;
00972 }
00973 }
00974
00975 xci -= nr ;
00976 xci += nr*nt ;
00977 xco += nr*nt ;
00978
00979
00980 xci += nr*nt ;
00981 xco += nr*nt ;
00982
00983
00984 for (int k=2 ; k<np+1 ; k++) {
00985 m = (k/2) % 2 ;
00986
00987 switch(m) {
00988 case 0:
00989
00990
00991 xci += nr * (nt) ;
00992 xco += nr * (nt-1) ;
00993
00994
00995 for (int i=0 ; i<nr ; i++) {
00996 som[i] = 0. ;
00997 xco[i] = 0. ;
00998 }
00999
01000
01001 for (int j=nt-2 ; j >= 0 ; j--) {
01002
01003 xci -= nr ;
01004 xco -= nr ;
01005
01006 for (int i=0 ; i<nr ; i++ ) {
01007 som[i] += 2*xci[i] ;
01008 xco[i] = som[i] ;
01009 som[i] = -som[i] ;
01010 }
01011 }
01012
01013 xci -= nr ;
01014 xci += nr*nt ;
01015 xco += nr*nt ;
01016 break ;
01017
01018 case 1:
01019
01020
01021 xci += nr * (nt-1) ;
01022 xco += nr * (nt-1) ;
01023
01024
01025 for (int i=0 ; i<nr ; i++) {
01026 xco[i] = 0. ;
01027 som[i] = 0. ;
01028 }
01029
01030
01031 for (int j=nt-2 ; j >= 1 ; j--) {
01032
01033 xci -= nr ;
01034 xco -= nr ;
01035
01036 for (int i=0 ; i<nr ; i++ ) {
01037 som[i] += 2*xci[i] ;
01038 xco[i] = som[i] ;
01039 som[i] = -som[i] ;
01040 }
01041 }
01042 xci -= nr ;
01043 xco -= nr ;
01044
01045 for (int i=0 ; i<nr ; i++ ) {
01046 xco[i] =0. ;
01047 }
01048
01049 xci += nr*nt ;
01050 xco += nr*nt ;
01051 break;
01052 }
01053 }
01054
01055
01056 delete [] tb->t ;
01057 tb->t = xo ;
01058
01059
01060 delete [] som ;
01061
01062
01063 int base_r = b & MSQ_R ;
01064 int base_p = b & MSQ_P ;
01065 b = base_r | base_p | T_COSSIN_CI ;
01066 }
01067
01068
01069
01070
01071 void _scost_t_cossin_ci(Tbl* tb, int & b)
01072 {
01073
01074 if (tb->get_etat() == ETATZERO) {
01075 int base_r = b & MSQ_R ;
01076 int base_p = b & MSQ_P ;
01077 b = base_r | base_p | T_COSSIN_CP ;
01078 return ;
01079 }
01080
01081
01082 assert(tb->get_etat() == ETATQCQ) ;
01083
01084
01085 int nr = (tb->dim).dim[0] ;
01086 int nt = (tb->dim).dim[1] ;
01087 int np = (tb->dim).dim[2] ;
01088 np = np - 2 ;
01089
01090
01091 double* som = new double [nr] ;
01092
01093
01094 double* xo = new double[(tb->dim).taille] ;
01095
01096
01097 for (int i=0; i<(tb->dim).taille; i++) {
01098 xo[i] = 0 ;
01099 }
01100
01101
01102 double* xi = tb->t ;
01103 double* xci = xi ;
01104 double* xco = xo ;
01105
01106
01107 int m = 0 ;
01108
01109
01110
01111
01112 xci += nr * (nt-1) ;
01113 xco += nr * (nt-1) ;
01114
01115
01116 for (int i=0 ; i<nr ; i++) {
01117 som[i] = 0. ;
01118 xco[i] = 0. ;
01119 }
01120
01121
01122 for (int j=nt-2 ; j >= 0 ; j--) {
01123
01124 xci -= nr ;
01125 xco -= nr ;
01126
01127 for (int i=0 ; i<nr ; i++ ) {
01128 som[i] += 2*xci[i] ;
01129 xco[i] = som[i] ;
01130 som[i] = - som[i] ;
01131 }
01132 }
01133
01134 for (int i=0 ; i<nr ; i++) {
01135 xco[i] *= .5 ;
01136 }
01137
01138 xci += nr*nt ;
01139 xco += nr*nt ;
01140
01141
01142 xci += nr*nt ;
01143 xco += nr*nt ;
01144
01145
01146 for (int k=2 ; k<np+1 ; k++) {
01147 m = (k/2) % 2 ;
01148
01149 switch(m) {
01150 case 0:
01151
01152
01153 xci += nr * (nt-1) ;
01154 xco += nr * (nt-1) ;
01155
01156
01157 for (int i=0 ; i<nr ; i++) {
01158 som[i] = 0. ;
01159 xco[i] = 0. ;
01160 }
01161
01162
01163 for (int j=nt-2 ; j >= 0 ; j--) {
01164
01165 xci -= nr ;
01166 xco -= nr ;
01167
01168 for (int i=0 ; i<nr ; i++ ) {
01169 som[i] += 2*xci[i] ;
01170 xco[i] = som[i] ;
01171 som[i] = - som[i] ;
01172 }
01173 }
01174
01175 for (int i=0 ; i<nr ; i++) {
01176 xco[i] *= .5 ;
01177 }
01178
01179 xci += nr*nt ;
01180 xco += nr*nt ;
01181 break ;
01182
01183 case 1:
01184
01185
01186
01187 xci += nr * nt ;
01188 xco += nr * (nt-1) ;
01189
01190
01191 for (int i=0 ; i<nr ; i++) {
01192 som[i] = 0. ;
01193 xco[i] = 0. ;
01194 }
01195
01196
01197 for (int j=nt-2 ; j >= 0 ; j--) {
01198
01199 xci -= nr ;
01200 xco -= nr ;
01201
01202 for (int i=0 ; i<nr ; i++ ) {
01203 som[i] += 2*xci[i] ;
01204 xco[i] = som[i] ;
01205 som[i] = -som[i] ;
01206 }
01207 }
01208
01209 xci -= nr ;
01210 xci += nr*nt ;
01211 xco += nr*nt ;
01212 break ;
01213 }
01214 }
01215
01216
01217 delete [] tb->t ;
01218 tb->t = xo ;
01219
01220
01221 delete [] som ;
01222
01223
01224 int base_r = b & MSQ_R ;
01225 int base_p = b & MSQ_P ;
01226 b = base_r | base_p | T_COSSIN_CP ;
01227 }
01228
01229
01230
01231
01232 void _scost_t_cossin_si(Tbl* tb, int & b)
01233 {
01234
01235 if (tb->get_etat() == ETATZERO) {
01236 int base_r = b & MSQ_R ;
01237 int base_p = b & MSQ_P ;
01238 b = base_r | base_p | T_COSSIN_SP ;
01239 return ;
01240 }
01241
01242
01243 assert(tb->get_etat() == ETATQCQ) ;
01244
01245
01246 int nr = (tb->dim).dim[0] ;
01247 int nt = (tb->dim).dim[1] ;
01248 int np = (tb->dim).dim[2] ;
01249 np = np - 2 ;
01250
01251
01252 double* som = new double [nr] ;
01253
01254
01255 double* xo = new double[(tb->dim).taille] ;
01256
01257
01258 for (int i=0; i<(tb->dim).taille; i++) {
01259 xo[i] = 0 ;
01260 }
01261
01262
01263 double* xi = tb->t ;
01264 double* xci = xi ;
01265 double* xco = xo ;
01266
01267
01268 int m = 0 ;
01269
01270
01271
01272 xci += nr * (nt-1) ;
01273 xco += nr * (nt-1) ;
01274
01275
01276 for (int i=0 ; i<nr ; i++) {
01277 xco[i] = 0. ;
01278 som[i] = 0. ;
01279 }
01280
01281
01282 for (int j=nt-2 ; j >= 1 ; j--) {
01283
01284 xci -= nr ;
01285 xco -= nr ;
01286
01287 for (int i=0 ; i<nr ; i++ ) {
01288 som[i] += 2*xci[i] ;
01289 xco[i] = som[i] ;
01290 som[i] = -som[i] ;
01291 }
01292 }
01293 xci -= nr ;
01294 xco -= nr ;
01295
01296 for (int i=0 ; i<nr ; i++ ) {
01297 xco[i] =0. ;
01298 }
01299
01300 xci += nr*nt ;
01301 xco += nr*nt ;
01302
01303
01304 xci += nr*nt ;
01305 xco += nr*nt ;
01306
01307
01308 for (int k=2 ; k<np+1 ; k++) {
01309 m = (k/2) % 2 ;
01310
01311 switch(m) {
01312 case 0:
01313
01314
01315 xci += nr * (nt-1) ;
01316 xco += nr * (nt-1) ;
01317
01318
01319 for (int i=0 ; i<nr ; i++) {
01320 xco[i] = 0. ;
01321 som[i] = 0. ;
01322 }
01323
01324
01325 for (int j=nt-2 ; j >= 1 ; j--) {
01326
01327 xci -= nr ;
01328 xco -= nr ;
01329
01330 for (int i=0 ; i<nr ; i++ ) {
01331 som[i] += 2*xci[i] ;
01332 xco[i] = som[i] ;
01333 som[i] = -som[i] ;
01334 }
01335 }
01336 xci -= nr ;
01337 xco -= nr ;
01338
01339 for (int i=0 ; i<nr ; i++ ) {
01340 xco[i] =0. ;
01341 }
01342
01343 xci += nr*nt ;
01344 xco += nr*nt ;
01345 break ;
01346
01347 case 1:
01348
01349
01350 xci += nr * (nt) ;
01351 xco += nr * (nt-1) ;
01352
01353
01354 for (int i=0 ; i<nr ; i++) {
01355 som[i] = 0. ;
01356 xco[i] = 0. ;
01357 }
01358
01359
01360 for (int j=nt-2 ; j >= 0 ; j--) {
01361
01362 xci -= nr ;
01363 xco -= nr ;
01364
01365 for (int i=0 ; i<nr ; i++ ) {
01366 som[i] += 2*xci[i] ;
01367 xco[i] = som[i] ;
01368 som[i] = - som[i] ;
01369 }
01370 }
01371
01372 xci -= nr ;
01373 xci += nr*nt ;
01374 xco += nr*nt ;
01375
01376 break ;
01377 }
01378 }
01379
01380
01381 delete [] tb->t ;
01382 tb->t = xo ;
01383
01384
01385 delete [] som ;
01386
01387
01388 int base_r = b & MSQ_R ;
01389 int base_p = b & MSQ_P ;
01390 b = base_r | base_p | T_COSSIN_SP ;
01391
01392
01393 }
01394
01395
01396
01397 void _scost_t_cossin_sp(Tbl* tb, int & b)
01398 {
01399
01400 if (tb->get_etat() == ETATZERO) {
01401 int base_r = b & MSQ_R ;
01402 int base_p = b & MSQ_P ;
01403 b = base_r | base_p | T_COSSIN_SI ;
01404 return ;
01405 }
01406
01407
01408 assert(tb->get_etat() == ETATQCQ) ;
01409
01410
01411 int nr = (tb->dim).dim[0] ;
01412 int nt = (tb->dim).dim[1] ;
01413 int np = (tb->dim).dim[2] ;
01414 np = np - 2 ;
01415
01416
01417 double* som = new double [nr] ;
01418
01419
01420 double* xo = new double[(tb->dim).taille] ;
01421
01422
01423 for (int i=0; i<(tb->dim).taille; i++) {
01424 xo[i] = 0 ;
01425 }
01426
01427
01428 double* xi = tb->t ;
01429 double* xci = xi ;
01430 double* xco = xo ;
01431
01432
01433 int m = 0 ;
01434
01435
01436
01437 xci += nr * nt ;
01438 xco += nr * (nt-1) ;
01439
01440
01441 for (int i=0 ; i<nr ; i++) {
01442 som[i] = 0. ;
01443 xco[i] = 0. ;
01444 }
01445
01446
01447 for (int j=nt-2 ; j >= 0 ; j--) {
01448
01449 xci -= nr ;
01450 xco -= nr ;
01451
01452 for (int i=0 ; i<nr ; i++ ) {
01453 som[i] += 2*xci[i] ;
01454 xco[i] = som[i] ;
01455 som[i] = -som[i] ;
01456 }
01457 }
01458
01459 xci -= nr ;
01460 xci += nr*nt ;
01461 xco += nr*nt ;
01462
01463
01464 xci += nr*nt ;
01465 xco += nr*nt ;
01466
01467 for (int k=2 ; k<np+1 ; k++) {
01468 m = (k/2) % 2 ;
01469
01470 switch(m) {
01471 case 1:
01472
01473
01474 xci += nr * (nt-1) ;
01475 xco += nr * (nt-1) ;
01476
01477
01478 for (int i=0 ; i<nr ; i++) {
01479 som[i] = 0. ;
01480 xco[i] = 0. ;
01481 }
01482
01483
01484 for (int j=nt-2 ; j >= 0 ; j--) {
01485
01486 xci -= nr ;
01487 xco -= nr ;
01488
01489 for (int i=0 ; i<nr ; i++ ) {
01490 som[i] += 2*xci[i] ;
01491 xco[i] = som[i] ;
01492 som[i] = -som[i] ;
01493 }
01494 }
01495
01496 for (int i=0 ; i<nr ; i++) {
01497 xco[i] *= .5 ;
01498 }
01499
01500 xci += nr*nt ;
01501 xco += nr*nt ;
01502 break ;
01503
01504 case 0:
01505
01506
01507 xci += nr * nt ;
01508 xco += nr * (nt-1) ;
01509
01510
01511 for (int i=0 ; i<nr ; i++) {
01512 som[i] = 0. ;
01513 xco[i] = 0. ;
01514 }
01515
01516
01517 for (int j=nt-2 ; j >= 0 ; j--) {
01518
01519 xci -= nr ;
01520 xco -= nr ;
01521
01522 for (int i=0 ; i<nr ; i++ ) {
01523 som[i] += 2*xci[i] ;
01524 xco[i] = som[i] ;
01525 som[i] = -som[i] ;
01526 }
01527 }
01528
01529 xci -= nr ;
01530 xci += nr*nt ;
01531 xco += nr*nt ;
01532 break ;
01533 }
01534 }
01535
01536
01537 delete [] tb->t ;
01538 tb->t = xo ;
01539
01540
01541 delete [] som ;
01542
01543
01544 int base_r = b & MSQ_R ;
01545 int base_p = b & MSQ_P ;
01546 b = base_r | base_p | T_COSSIN_SI ;
01547
01548 }
01549
01550
01551
01552
01553 void _scost_t_cossin_c(Tbl* tb, int & b) {
01554
01555
01556 if (tb->get_etat() == ETATZERO) {
01557 int base_r = b & MSQ_R ;
01558 int base_p = b & MSQ_P ;
01559 switch(base_r){
01560 case(R_CHEBPI_P):
01561 b = R_CHEBPI_I | base_p | T_COSSIN_C ;
01562 break ;
01563 case(R_CHEBPI_I):
01564 b = R_CHEBPI_P | base_p | T_COSSIN_C ;
01565 break ;
01566 default:
01567 b = base_r | base_p | T_COSSIN_C ;
01568 break;
01569 }
01570 return ;
01571 }
01572
01573
01574 assert(tb->get_etat() == ETATQCQ) ;
01575
01576
01577 int nr = (tb->dim).dim[0] ;
01578 int nt = (tb->dim).dim[1] ;
01579 int np = (tb->dim).dim[2] ;
01580 np = np - 2 ;
01581
01582
01583 double* somP = new double [nr] ;
01584 double* somN = new double [nr] ;
01585
01586
01587 double* xo = new double[(tb->dim).taille] ;
01588
01589
01590 for (int i=0; i<(tb->dim).taille; i++) xo[i] = 0 ;
01591
01592
01593 double* xi = tb->t ;
01594 double* xci = xi ;
01595 double* xco = xo ;
01596
01597
01598
01599
01600
01601 xci += nr * (nt-1) ;
01602 xco += nr * (nt-1) ;
01603
01604
01605 for (int i=0 ; i<nr ; i++) {
01606 somP[i] = 0. ;
01607 somN[i] = 0. ;
01608 xco[i] = 0. ;
01609 }
01610
01611
01612 for (int j=nt-2 ; j >= 0 ; j--) {
01613
01614 xci -= nr ;
01615 xco -= nr ;
01616
01617 for (int i=0 ; i<nr ; i++ ) {
01618 if((j%2) == 1) {
01619 somN[i] = -somN[i] ;
01620 somN[i] += 2*xci[i] ;
01621 xco[i] = somP[i] ;
01622 }
01623 else {
01624 somP[i] = -somP[i] ;
01625 somP[i] += 2*xci[i] ;
01626 xco[i] = somN[i] ;
01627 }
01628 }
01629 }
01630
01631 for (int i=0 ; i<nr ; i++) xco[i] *= .5 ;
01632
01633
01634 xci += nr*nt ;
01635 xco += nr*nt ;
01636
01637
01638 xci += nr*nt ;
01639 xco += nr*nt ;
01640
01641
01642 for (int k=2 ; k<np+1 ; k++) {
01643
01644
01645
01646 xco += nr * (nt-1) ;
01647 xci += nr * (nt-1) ;
01648
01649
01650 for (int i=0 ; i<nr ; i++) {
01651 somP[i] = 0. ;
01652 somN[i] = 0. ;
01653 xco[i] = 0. ;
01654 }
01655
01656
01657 for (int j=nt-2 ; j >= 0 ; j--) {
01658
01659 xci -= nr ;
01660 xco -= nr ;
01661
01662 for (int i=0 ; i<nr ; i++ ) {
01663 if((j%2) == 1) {
01664 somN[i] = -somN[i];
01665 somN[i] += 2 * xci[i] ;
01666 xco[i] = somP[i] ;
01667 }
01668 else {
01669 somP[i] = -somP[i];
01670 somP[i] += 2 * xci[i] ;
01671 xco[i] = somN[i];
01672 }
01673 }
01674 }
01675 double fac_m = ( (k/2)%2 == 1 ? 0. : 0.5) ;
01676
01677 for (int i=0 ; i<nr ; i++) xco[i] *= fac_m ;
01678
01679
01680 xci += nr*nt ;
01681 xco += nr*nt ;
01682 }
01683
01684
01685 delete [] tb->t ;
01686 tb->t = xo ;
01687
01688
01689 delete [] somP ;
01690 delete [] somN ;
01691
01692
01693 int base_r = b & MSQ_R ;
01694 int base_p = b & MSQ_P ;
01695 switch(base_r){
01696 case(R_CHEBPI_P):
01697 b = R_CHEBPI_I | base_p | T_COSSIN_C ;
01698 break ;
01699 case(R_CHEBPI_I):
01700 b = R_CHEBPI_P | base_p | T_COSSIN_C ;
01701 break ;
01702 default:
01703 b = base_r | base_p | T_COSSIN_C ;
01704 break;
01705 }
01706 }
01707
01708
01709
01710
01711 void _scost_t_cossin_s(Tbl* tb, int & b) {
01712
01713
01714 if (tb->get_etat() == ETATZERO) {
01715 int base_r = b & MSQ_R ;
01716 int base_p = b & MSQ_P ;
01717 switch(base_r){
01718 case(R_CHEBPI_P):
01719 b = R_CHEBPI_I | base_p | T_COSSIN_S ;
01720 break ;
01721 case(R_CHEBPI_I):
01722 b = R_CHEBPI_P | base_p | T_COSSIN_S ;
01723 break ;
01724 default:
01725 b = base_r | base_p | T_COSSIN_S ;
01726 break;
01727 }
01728 return ;
01729 }
01730
01731
01732 assert(tb->get_etat() == ETATQCQ) ;
01733
01734
01735 int nr = (tb->dim).dim[0] ;
01736 int nt = (tb->dim).dim[1] ;
01737 int np = (tb->dim).dim[2] ;
01738 np = np - 2 ;
01739
01740
01741 double* somP = new double [nr] ;
01742 double* somN = new double [nr] ;
01743
01744
01745 double* xo = new double[(tb->dim).taille] ;
01746
01747
01748 for (int i=0; i<(tb->dim).taille; i++) xo[i] = 0 ;
01749
01750
01751 double* xi = tb->t ;
01752 double* xci = xi ;
01753 double* xco = xo ;
01754
01755
01756
01757
01758
01759 xci += nr * (nt-1) ;
01760 xco += nr * (nt-1) ;
01761
01762
01763 for (int i=0 ; i<nr ; i++) {
01764 somP[i] = 0. ;
01765 somN[i] = 0. ;
01766 xco[i] = 0. ;
01767 }
01768
01769
01770 for (int j=nt-2 ; j >= 0 ; j--) {
01771
01772 xci -= nr ;
01773 xco -= nr ;
01774
01775 for (int i=0 ; i<nr ; i++ ) {
01776 if((j%2) == 1) {
01777 somN[i] = -somN[i] ;
01778 somN[i] += 2*xci[i] ;
01779 xco[i] = somP[i] ;
01780 }
01781 else {
01782 somP[i] = -somP[i] ;
01783 somP[i] += 2*xci[i] ;
01784 xco[i] = somN[i] ;
01785 }
01786 }
01787 }
01788
01789 for (int i=0 ; i<nr ; i++) xco[i] = 0. ;
01790
01791
01792 xci += nr*nt ;
01793 xco += nr*nt ;
01794
01795
01796 xci += nr*nt ;
01797 xco += nr*nt ;
01798
01799
01800 for (int k=2 ; k<np+1 ; k++) {
01801
01802
01803
01804 xco += nr * (nt-1) ;
01805 xci += nr * (nt-1) ;
01806
01807
01808 for (int i=0 ; i<nr ; i++) {
01809 somP[i] = 0. ;
01810 somN[i] = 0. ;
01811 xco[i] = 0. ;
01812 }
01813
01814
01815 for (int j=nt-2 ; j >= 0 ; j--) {
01816
01817 xci -= nr ;
01818 xco -= nr ;
01819
01820 for (int i=0 ; i<nr ; i++ ) {
01821 if((j%2) == 1) {
01822 somN[i] = -somN[i] ;
01823 somN[i] += 2*xci[i] ;
01824 xco[i] = somP[i] ;
01825 }
01826 else {
01827 somP[i] = -somP[i] ;
01828 somP[i] += 2*xci[i] ;
01829 xco[i] = somN[i] ;
01830 }
01831 }
01832 }
01833
01834 double fac_m = ( (k/2)%2 == 0 ? 0. : 0.5) ;
01835
01836 for (int i=0 ; i<nr ; i++) xco[i] *= fac_m ;
01837
01838
01839 xci += nr*nt ;
01840 xco += nr*nt ;
01841
01842 }
01843
01844
01845 delete [] tb->t ;
01846 tb->t = xo ;
01847
01848
01849 delete [] somP ;
01850 delete [] somN ;
01851
01852
01853 int base_r = b & MSQ_R ;
01854 int base_p = b & MSQ_P ;
01855 switch(base_r){
01856 case(R_CHEBPI_P):
01857 b = R_CHEBPI_I | base_p | T_COSSIN_S ;
01858 break ;
01859 case(R_CHEBPI_I):
01860 b = R_CHEBPI_P | base_p | T_COSSIN_S ;
01861 break ;
01862 default:
01863 b = base_r | base_p | T_COSSIN_S ;
01864 break;
01865 }
01866 }