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 char op_sx_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_sx.C,v 1.2 2004/11/23 15:16:01 m_forot Exp $" ;
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 #include "tbl.h"
00073
00074
00075
00076
00077
00078
00079 void _sx_pas_prevu(Tbl * tb, int& base) {
00080 cout << "sx pas prevu..." << endl ;
00081 cout << "Tbl: " << tb << " base: " << base << endl ;
00082 abort () ;
00083 exit(-1) ;
00084 }
00085
00086
00087
00088
00089
00090 void _sx_identite(Tbl* , int& ) {
00091 return ;
00092 }
00093
00094
00095
00096
00097
00098 void _sx_r_chebp(Tbl* tb, int& base)
00099 {
00100
00101 if (tb->get_etat() == ETATZERO) {
00102 int base_t = base & MSQ_T ;
00103 int base_p = base & MSQ_P ;
00104 base = base_p | base_t | R_CHEBI ;
00105 return ;
00106 }
00107
00108
00109 int nr = (tb->dim).dim[0] ;
00110 int nt = (tb->dim).dim[1] ;
00111 int np = (tb->dim).dim[2] ;
00112 np = np - 2 ;
00113
00114
00115 double* xo = new double [tb->get_taille()];
00116
00117
00118 for (int i=0; i<tb->get_taille(); i++) {
00119 xo[i] = 0 ;
00120 }
00121
00122
00123 double* xi = tb->t ;
00124 double* xci = xi ;
00125 double* xco = xo ;
00126
00127 int borne_phi = np + 1 ;
00128 if (np == 1) {
00129 borne_phi = 1 ;
00130 }
00131
00132 for (int k=0 ; k< borne_phi ; k++)
00133 if (k==1) {
00134 xci += nr*nt ;
00135 xco += nr*nt ;
00136 }
00137 else {
00138 for (int j=0 ; j<nt ; j++) {
00139
00140 double som ;
00141 int sgn = 1 ;
00142
00143 xco[nr-1] = 0 ;
00144 som = 2 * sgn * xci[nr-1] ;
00145 xco[nr-2] = som ;
00146 for (int i = nr-3 ; i >= 0 ; i-- ) {
00147 sgn = - sgn ;
00148 som += 2 * sgn * xci[i+1] ;
00149 xco[i] = som ;
00150 }
00151 for (int i=0 ; i<nr ; i+=2) {
00152 xco[i] = -xco[i] ;
00153 }
00154
00155 xci += nr ;
00156 xco += nr ;
00157 }
00158 }
00159
00160
00161 delete [] tb->t ;
00162 tb->t = xo ;
00163
00164
00165
00166 int base_t = base & MSQ_T ;
00167 int base_p = base & MSQ_P ;
00168 base = base_p | base_t | R_CHEBI ;
00169
00170 }
00171
00172
00173
00174
00175
00176 void _sx_r_chebi(Tbl* tb, int& base)
00177 {
00178
00179
00180 if (tb->get_etat() == ETATZERO) {
00181 int base_t = base & MSQ_T ;
00182 int base_p = base & MSQ_P ;
00183 base = base_p | base_t | R_CHEBP ;
00184 return ;
00185 }
00186
00187
00188 int nr = (tb->dim).dim[0] ;
00189 int nt = (tb->dim).dim[1] ;
00190 int np = (tb->dim).dim[2] ;
00191 np = np - 2 ;
00192
00193
00194 double* xo = new double [tb->get_taille()];
00195
00196
00197 for (int i=0; i<tb->get_taille(); i++) {
00198 xo[i] = 0 ;
00199 }
00200
00201
00202 double* xi = tb->t ;
00203 double* xci = xi ;
00204 double* xco = xo ;
00205
00206 int borne_phi = np + 1 ;
00207 if (np == 1) {
00208 borne_phi = 1 ;
00209 }
00210
00211 for (int k=0 ; k< borne_phi ; k++)
00212 if (k == 1) {
00213 xci += nr*nt ;
00214 xco += nr*nt ;
00215 }
00216 else {
00217 for (int j=0 ; j<nt ; j++) {
00218 double som ;
00219 int sgn = 1 ;
00220
00221 xco[nr-1] = 0 ;
00222 som = 2 * sgn * xci[nr-2] ;
00223 xco[nr-2] = som ;
00224 for (int i = nr-3 ; i >= 0 ; i-- ) {
00225 sgn = - sgn ;
00226 som += 2 * sgn * xci[i] ;
00227 xco[i] = som ;
00228 }
00229 for (int i=0 ; i<nr ; i+=2) {
00230 xco[i] = -xco[i] ;
00231 }
00232 xco[0] *= .5 ;
00233
00234 xci += nr ;
00235 xco += nr ;
00236 }
00237 }
00238
00239
00240 delete [] tb->t ;
00241 tb->t = xo ;
00242
00243
00244
00245 int base_t = base & MSQ_T ;
00246 int base_p = base & MSQ_P ;
00247 base = base_p | base_t | R_CHEBP ;
00248 }
00249
00250
00251
00252
00253
00254 void _sx_r_chebpim_p(Tbl* tb, int& base)
00255 {
00256
00257
00258 if (tb->get_etat() == ETATZERO) {
00259 int base_t = base & MSQ_T ;
00260 int base_p = base & MSQ_P ;
00261 base = base_p | base_t | R_CHEBPIM_I ;
00262 return ;
00263 }
00264
00265
00266 int nr = (tb->dim).dim[0] ;
00267 int nt = (tb->dim).dim[1] ;
00268 int np = (tb->dim).dim[2] ;
00269 np = np - 2 ;
00270
00271
00272 double* xo = new double [tb->get_taille()];
00273
00274
00275 for (int i=0; i<tb->get_taille(); i++) {
00276 xo[i] = 0 ;
00277 }
00278
00279
00280 double* xi = tb->t ;
00281 double* xci ;
00282 double* xco ;
00283
00284
00285
00286 xci = xi ;
00287 xco = xo ;
00288
00289 int auxiliaire ;
00290
00291 for (int k=0 ; k<np+1 ; k += 4) {
00292
00293 auxiliaire = (k==np) ? 1 : 2 ;
00294 for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00295
00296
00297
00298
00299 if ((k==0) && (kmod == 1)) {
00300 xco += nr*nt ;
00301 xci += nr*nt ;
00302 }
00303
00304 else
00305 for (int j=0 ; j<nt ; j++) {
00306
00307 double som ;
00308 int sgn = 1 ;
00309
00310 xco[nr-1] = 0 ;
00311 som = 2 * sgn * xci[nr-1] ;
00312 xco[nr-2] = som ;
00313 for (int i = nr-3 ; i >= 0 ; i-- ) {
00314 sgn = - sgn ;
00315 som += 2 * sgn * xci[i+1] ;
00316 xco[i] = som ;
00317 }
00318 for (int i=0 ; i<nr ; i+=2) {
00319 xco[i] = -xco[i] ;
00320 }
00321
00322 xci += nr ;
00323 xco += nr ;
00324 }
00325 }
00326 xci += 2*nr*nt ;
00327 xco += 2*nr*nt ;
00328 }
00329
00330
00331 xci = xi + 2*nr*nt ;
00332 xco = xo + 2*nr*nt ;
00333 for (int k=2 ; k<np+1 ; k += 4) {
00334
00335 auxiliaire = (k==np) ? 1 : 2 ;
00336 for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00337 for (int j=0 ; j<nt ; j++) {
00338
00339 double som ;
00340 int sgn = 1 ;
00341
00342 xco[nr-1] = 0 ;
00343 som = 2 * sgn * xci[nr-2] ;
00344 xco[nr-2] = som ;
00345 for (int i = nr-3 ; i >= 0 ; i-- ) {
00346 sgn = - sgn ;
00347 som += 2 * sgn * xci[i] ;
00348 xco[i] = som ;
00349 }
00350 for (int i=0 ; i<nr ; i+=2) {
00351 xco[i] = -xco[i] ;
00352 }
00353 xco[0] *= .5 ;
00354
00355 xci += nr ;
00356 xco += nr ;
00357 }
00358 }
00359 xci += 2*nr*nt ;
00360 xco += 2*nr*nt ;
00361 }
00362
00363
00364 delete [] tb->t ;
00365 tb->t = xo ;
00366
00367
00368
00369 int base_t = base & MSQ_T ;
00370 int base_p = base & MSQ_P ;
00371 base = base_p | base_t | R_CHEBPIM_I ;
00372 }
00373
00374
00375
00376
00377
00378 void _sx_r_chebpim_i(Tbl* tb, int& base)
00379 {
00380
00381
00382 if (tb->get_etat() == ETATZERO) {
00383 int base_t = base & MSQ_T ;
00384 int base_p = base & MSQ_P ;
00385 base = base_p | base_t | R_CHEBPIM_P ;
00386 return ;
00387 }
00388
00389
00390 int nr = (tb->dim).dim[0] ;
00391 int nt = (tb->dim).dim[1] ;
00392 int np = (tb->dim).dim[2] ;
00393 np = np - 2 ;
00394
00395
00396 double* xo = new double [tb->get_taille()];
00397
00398
00399 for (int i=0; i<tb->get_taille(); i++) {
00400 xo[i] = 0 ;
00401 }
00402
00403
00404 double* xi = tb->t ;
00405 double* xci ;
00406 double* xco ;
00407
00408
00409 xci = xi ;
00410 xco = xo ;
00411
00412
00413 int auxiliaire ;
00414
00415 for (int k=0 ; k<np+1 ; k += 4) {
00416
00417 auxiliaire = (k==np) ? 1 : 2 ;
00418 for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00419
00420
00421
00422
00423 if ((k==0) && (kmod == 1)) {
00424 xco += nr*nt ;
00425 xci += nr*nt ;
00426 }
00427
00428 else
00429 for (int j=0 ; j<nt ; j++) {
00430
00431 double som ;
00432 int sgn = 1 ;
00433
00434 xco[nr-1] = 0 ;
00435 som = 2 * sgn * xci[nr-2] ;
00436 xco[nr-2] = som ;
00437 for (int i = nr-3 ; i >= 0 ; i-- ) {
00438 sgn = - sgn ;
00439 som += 2 * sgn * xci[i] ;
00440 xco[i] = som ;
00441 }
00442 for (int i=0 ; i<nr ; i+=2) {
00443 xco[i] = -xco[i] ;
00444 }
00445 xco[0] *= .5 ;
00446
00447 xci += nr ;
00448 xco += nr ;
00449 }
00450 }
00451 xci += 2*nr*nt ;
00452 xco += 2*nr*nt ;
00453 }
00454
00455
00456 xci = xi + 2*nr*nt ;
00457 xco = xo + 2*nr*nt ;
00458 for (int k=2 ; k<np+1 ; k += 4) {
00459
00460 auxiliaire = (k==np) ? 1 : 2 ;
00461 for (int kmod=0 ; kmod<auxiliaire ; kmod++) {
00462 for (int j=0 ; j<nt ; j++) {
00463
00464 double som ;
00465 int i ;
00466 int sgn = 1 ;
00467
00468 xco[nr-1] = 0 ;
00469 som = 2 * sgn * xci[nr-1] ;
00470 xco[nr-2] = som ;
00471 for (i = nr-3 ; i >= 0 ; i-- ) {
00472 sgn = - sgn ;
00473 som += 2 * sgn * xci[i+1] ;
00474 xco[i] = som ;
00475 }
00476 for (i=0 ; i<nr ; i+=2) {
00477 xco[i] = -xco[i] ;
00478 }
00479
00480 xci += nr ;
00481 xco += nr ;
00482 }
00483 }
00484 xci += 2*nr*nt ;
00485 xco += 2*nr*nt ;
00486 }
00487
00488
00489 delete [] tb->t ;
00490 tb->t = xo ;
00491
00492
00493
00494 int base_t = base & MSQ_T ;
00495 int base_p = base & MSQ_P ;
00496 base = base_p | base_t | R_CHEBPIM_P ;
00497 }
00498
00499
00500
00501
00502
00503 void _sx_r_chebpi_p(Tbl* tb, int& base)
00504 {
00505
00506 if (tb->get_etat() == ETATZERO) {
00507 int base_t = base & MSQ_T ;
00508 int base_p = base & MSQ_P ;
00509 base = base_p | base_t | R_CHEBPI_I ;
00510 return ;
00511 }
00512
00513
00514 int nr = (tb->dim).dim[0] ;
00515 int nt = (tb->dim).dim[1] ;
00516 int np = (tb->dim).dim[2] ;
00517 np = np - 2 ;
00518
00519
00520 double* xo = new double [tb->get_taille()];
00521
00522
00523 for (int i=0; i<tb->get_taille(); i++) {
00524 xo[i] = 0 ;
00525 }
00526
00527
00528 double* xi = tb->t ;
00529 double* xci = xi ;
00530 double* xco = xo ;
00531
00532 int borne_phi = np + 1 ;
00533 if (np == 1) {
00534 borne_phi = 1 ;
00535 }
00536
00537 for (int k=0 ; k< borne_phi ; k++)
00538 if (k==1) {
00539 xci += nr*nt ;
00540 xco += nr*nt ;
00541 }
00542 else {
00543 for (int j=0 ; j<nt ; j++) {
00544 int l = j%2;
00545 if(l==0){
00546 double som ;
00547 int sgn = 1 ;
00548
00549 xco[nr-1] = 0 ;
00550 som = 2 * sgn * xci[nr-1] ;
00551 xco[nr-2] = som ;
00552 for (int i = nr-3 ; i >= 0 ; i-- ) {
00553 sgn = - sgn ;
00554 som += 2 * sgn * xci[i+1] ;
00555 xco[i] = som ;
00556 }
00557 for (int i=0 ; i<nr ; i+=2) {
00558 xco[i] = -xco[i] ;
00559 }
00560 } else {
00561 double som ;
00562 int sgn = 1 ;
00563
00564 xco[nr-1] = 0 ;
00565 som = 2 * sgn * xci[nr-2] ;
00566 xco[nr-2] = som ;
00567 for (int i = nr-3 ; i >= 0 ; i-- ) {
00568 sgn = - sgn ;
00569 som += 2 * sgn * xci[i] ;
00570 xco[i] = som ;
00571 }
00572 for (int i=0 ; i<nr ; i+=2) {
00573 xco[i] = -xco[i] ;
00574 }
00575 xco[0] *= .5 ;
00576 }
00577 xci += nr ;
00578 xco += nr ;
00579 }
00580 }
00581
00582
00583 delete [] tb->t ;
00584 tb->t = xo ;
00585
00586
00587
00588 int base_t = base & MSQ_T ;
00589 int base_p = base & MSQ_P ;
00590 base = base_p | base_t | R_CHEBPI_I ;
00591
00592 }
00593
00594
00595
00596
00597
00598 void _sx_r_chebpi_i(Tbl* tb, int& base)
00599 {
00600
00601
00602 if (tb->get_etat() == ETATZERO) {
00603 int base_t = base & MSQ_T ;
00604 int base_p = base & MSQ_P ;
00605 base = base_p | base_t | R_CHEBPI_P ;
00606 return ;
00607 }
00608
00609
00610 int nr = (tb->dim).dim[0] ;
00611 int nt = (tb->dim).dim[1] ;
00612 int np = (tb->dim).dim[2] ;
00613 np = np - 2 ;
00614
00615
00616 double* xo = new double [tb->get_taille()];
00617
00618
00619 for (int i=0; i<tb->get_taille(); i++) {
00620 xo[i] = 0 ;
00621 }
00622
00623
00624 double* xi = tb->t ;
00625 double* xci = xi ;
00626 double* xco = xo ;
00627
00628 int borne_phi = np + 1 ;
00629 if (np == 1) {
00630 borne_phi = 1 ;
00631 }
00632
00633 for (int k=0 ; k< borne_phi ; k++)
00634 if (k == 1) {
00635 xci += nr*nt ;
00636 xco += nr*nt ;
00637 }
00638 else {
00639 for (int j=0 ; j<nt ; j++) {
00640 int l = j%2;
00641 if(l==1){
00642 double som ;
00643 int sgn = 1 ;
00644
00645 xco[nr-1] = 0 ;
00646 som = 2 * sgn * xci[nr-1] ;
00647 xco[nr-2] = som ;
00648 for (int i = nr-3 ; i >= 0 ; i-- ) {
00649 sgn = - sgn ;
00650 som += 2 * sgn * xci[i+1] ;
00651 xco[i] = som ;
00652 }
00653 for (int i=0 ; i<nr ; i+=2) {
00654 xco[i] = -xco[i] ;
00655 }
00656 } else {
00657 double som ;
00658 int sgn = 1 ;
00659
00660 xco[nr-1] = 0 ;
00661 som = 2 * sgn * xci[nr-2] ;
00662 xco[nr-2] = som ;
00663 for (int i = nr-3 ; i >= 0 ; i-- ) {
00664 sgn = - sgn ;
00665 som += 2 * sgn * xci[i] ;
00666 xco[i] = som ;
00667 }
00668 for (int i=0 ; i<nr ; i+=2) {
00669 xco[i] = -xco[i] ;
00670 }
00671 xco[0] *= .5 ;
00672 }
00673 xci += nr ;
00674 xco += nr ;
00675 }
00676 }
00677
00678
00679 delete [] tb->t ;
00680 tb->t = xo ;
00681
00682
00683
00684 int base_t = base & MSQ_T ;
00685 int base_p = base & MSQ_P ;
00686 base = base_p | base_t | R_CHEBPI_P ;
00687 }