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