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