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
00031
00032
00033 char op_mult_sp_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/Operators/op_mult_sp.C,v 1.4 2007/12/14 10:19:33 jl_cornou Exp $" ;
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 #include "tbl.h"
00075
00076
00077
00078
00079
00080 void _mult_sp_pas_prevu(Tbl* , int& base) {
00081 cout << "mult_sp() is not not implemented for the basis " << base << " !"
00082 << endl ;
00083 abort() ;
00084 }
00085
00086
00087
00088
00089
00090 void _mult_sp_p_cossin(Tbl* tb, int& base) {
00091
00092 assert(tb->get_etat() != ETATNONDEF) ;
00093
00094
00095
00096
00097
00098 int base_r = base & MSQ_R ;
00099 int base_t = base & MSQ_T ;
00100 const int base_p = base & MSQ_P ;
00101
00102 switch (base_r) {
00103
00104 case R_CHEBPIM_P : {
00105 base_r = R_CHEBPIM_I ;
00106 break ;
00107 }
00108
00109 case R_CHEBPIM_I : {
00110 base_r = R_CHEBPIM_P ;
00111 break ;
00112 }
00113
00114 case R_CHEBPI_P : {
00115 break ;
00116 }
00117
00118 case R_CHEBPI_I : {
00119 break ;
00120 }
00121
00122 case R_CHEB : {
00123 break ;
00124 }
00125
00126 case R_JACO02 : {
00127 break ;
00128 }
00129
00130 case R_CHEBU : {
00131 break ;
00132 }
00133
00134 default : {
00135 cout << "_mult_cp_p_cossin : unknown basis in r !" << endl ;
00136 cout << " base_r = " << hex << base_r << endl ;
00137 abort() ;
00138 }
00139 }
00140
00141 switch (base_t) {
00142
00143 case T_COSSIN_CP : {
00144 base_t = T_COSSIN_SI ;
00145 break ;
00146 }
00147
00148 case T_COSSIN_SI : {
00149 base_t = T_COSSIN_CP ;
00150 break ;
00151 }
00152
00153 case T_COSSIN_CI : {
00154 base_t = T_COSSIN_SP ;
00155 break ;
00156 }
00157
00158 case T_COSSIN_SP : {
00159 base_t = T_COSSIN_CI ;
00160 break ;
00161 }
00162
00163 case T_COSSIN_S : {
00164 base_t = T_COSSIN_C ;
00165 break ;
00166 }
00167
00168 case T_COSSIN_C : {
00169 base_t = T_COSSIN_S ;
00170 break ;
00171 }
00172
00173 default : {
00174 cout << "_mult_cp_p_cossin : unknown basis in theta !" << endl ;
00175 cout << " base_t = " << hex << base_t << endl ;
00176 abort() ;
00177 }
00178 }
00179
00180 base = base_r | base_t | base_p ;
00181
00182
00183
00184
00185
00186
00187
00188 if (tb->get_etat() == ETATZERO) {
00189 return ;
00190 }
00191
00192 assert(tb->get_etat() == ETATQCQ) ;
00193
00194
00195 int nr = tb->get_dim(0) ;
00196 int nt = tb->get_dim(1) ;
00197 int np = tb->get_dim(2) - 2 ;
00198
00199
00200
00201
00202
00203 if (np==1) {
00204 tb->set_etat_zero() ;
00205 return ;
00206 }
00207
00208
00209 assert(np >= 4) ;
00210
00211 int ntnr = nt*nr ;
00212
00213 double* const cf = tb->t ;
00214 double* const resu = new double[ tb->get_taille() ] ;
00215 double* co = resu ;
00216
00217
00218
00219
00220 int q = 3 * ntnr ;
00221 for (int i=0; i<ntnr; i++) {
00222 co[i] = 0.5 * cf[q + i] ;
00223 }
00224 co += ntnr ;
00225
00226
00227
00228
00229 for (int i=0; i<ntnr; i++) {
00230 co[i] = 0 ;
00231 }
00232 co += ntnr ;
00233
00234 if (np==4) {
00235
00236
00237
00238
00239 for (int i=0; i<ntnr; i++) {
00240 co[i] = 0 ;
00241 }
00242 co += ntnr ;
00243
00244
00245
00246
00247 q = 4*ntnr ;
00248 for (int i=0; i<ntnr; i++) {
00249 co[i] = cf[i] - 0.5 * cf[q+i] ;
00250 }
00251 co += ntnr ;
00252
00253 }
00254 else{
00255
00256
00257
00258
00259 q = 5*ntnr ;
00260 for (int i=0; i<ntnr; i++) {
00261 co[i] = 0.5 * cf[q+i] ;
00262 }
00263 co += ntnr ;
00264
00265
00266
00267
00268 q = 4*ntnr ;
00269 for (int i=0; i<ntnr; i++) {
00270 co[i] = cf[i] - 0.5 * cf[q+i] ;
00271 }
00272 co += ntnr ;
00273
00274
00275
00276
00277
00278 for (int k=4; k<np-2; k+=2) {
00279
00280 int k1 = k ;
00281
00282 int q1 = (k1-1)*ntnr ;
00283 int q2 = (k1+3)*ntnr ;
00284 for (int i=0; i<ntnr; i++) {
00285 co[i] = 0.5 * ( cf[q2+i] - cf[q1+i] ) ;
00286 }
00287 co += ntnr ;
00288 k1++ ;
00289
00290 q1 = (k1-3)*ntnr ;
00291 q2 = (k1+1)*ntnr ;
00292 for (int i=0; i<ntnr; i++) {
00293 co[i] = 0.5 * ( cf[q1+i] - cf[q2+i] ) ;
00294 }
00295 co += ntnr ;
00296 }
00297
00298
00299
00300
00301 q = (np-3)*ntnr ;
00302 for (int i=0; i<ntnr; i++) {
00303 co[i] = - 0.5 * cf[q + i] ;
00304 }
00305 co += ntnr ;
00306
00307
00308
00309
00310 int q1 = (np-4)*ntnr ;
00311 int q2 = np*ntnr ;
00312 for (int i=0; i<ntnr; i++) {
00313 co[i] = 0.5 * ( cf[q1+i] - cf[q2+i] ) ;
00314 }
00315 co += ntnr ;
00316
00317 }
00318
00319
00320
00321
00322
00323 q = (np-1)*ntnr ;
00324 for (int i=0; i<ntnr; i++) {
00325 co[i] = - 0.5 * cf[q+i] ;
00326 }
00327 co += ntnr ;
00328
00329
00330
00331
00332 for (int i=0; i<ntnr; i++) {
00333 co[i] = 0 ;
00334 }
00335
00336
00337 co += ntnr ;
00338 assert( co == resu + (np+2)*ntnr ) ;
00339
00340
00341
00342
00343 delete [] tb->t ;
00344 tb->t = resu ;
00345
00346 return ;
00347 }
00348
00349
00350
00351
00352
00353 void _mult_sp_p_cossin_p(Tbl* tb, int& base) {
00354
00355 assert(tb->get_etat() != ETATNONDEF) ;
00356
00357
00358
00359 int base_r = base & MSQ_R ;
00360 int base_t = base & MSQ_T ;
00361 base = base_r | base_t | P_COSSIN_I ;
00362
00363
00364
00365
00366
00367
00368 if (tb->get_etat() == ETATZERO) {
00369 return ;
00370 }
00371
00372 assert(tb->get_etat() == ETATQCQ) ;
00373
00374
00375 int nr = tb->get_dim(0) ;
00376 int nt = tb->get_dim(1) ;
00377 int np = tb->get_dim(2) - 2 ;
00378
00379
00380
00381
00382 if (np==1) {
00383 tb->set_etat_zero() ;
00384 return ;
00385 }
00386
00387 assert(np >= 4) ;
00388
00389 int ntnr = nt*nr ;
00390
00391 double* const cf = tb->t ;
00392 double* const resu = new double[ tb->get_taille() ] ;
00393 double* co = resu ;
00394
00395
00396
00397
00398 int q = 3 * ntnr ;
00399 for (int i=0; i<ntnr; i++) {
00400 co[i] = 0.5 * cf[q + i] ;
00401 }
00402 co += ntnr ;
00403
00404
00405
00406
00407 for (int i=0; i<ntnr; i++) {
00408 co[i] = 0 ;
00409 }
00410 co += ntnr ;
00411
00412
00413
00414
00415 q = 2*ntnr ;
00416 for (int i=0; i<ntnr; i++) {
00417 co[i] = cf[i] - 0.5 * cf[q+i] ;
00418 }
00419 co += ntnr ;
00420
00421
00422
00423
00424 for (int k=3; k<np-1; k+=2) {
00425
00426 int k1 = k ;
00427
00428 int q1 = k1*ntnr ;
00429 int q2 = (k1+2)*ntnr ;
00430 for (int i=0; i<ntnr; i++) {
00431 co[i] = 0.5 * ( cf[q2+i] - cf[q1+i] ) ;
00432 }
00433 co += ntnr ;
00434 k1++ ;
00435
00436 q1 = (k1-2)*ntnr ;
00437 q2 = k1*ntnr ;
00438 for (int i=0; i<ntnr; i++) {
00439 co[i] = 0.5 * ( cf[q1+i] - cf[q2+i] ) ;
00440 }
00441 co += ntnr ;
00442 }
00443
00444
00445
00446
00447 q = (np-1)*ntnr ;
00448 for (int i=0; i<ntnr; i++) {
00449 co[i] = - 0.5 * cf[q+i] ;
00450 }
00451 co += ntnr ;
00452
00453
00454
00455
00456 int q1 = (np-2)*ntnr ;
00457 int q2 = np*ntnr ;
00458 for (int i=0; i<ntnr; i++) {
00459 co[i] = 0.5 * ( cf[q1+i] - cf[q2+i] ) ;
00460 }
00461 co += ntnr ;
00462
00463
00464
00465
00466 for (int i=0; i<ntnr; i++) {
00467 co[i] = 0 ;
00468 }
00469
00470
00471 co += ntnr ;
00472 assert( co == resu + (np+2)*ntnr ) ;
00473
00474
00475
00476
00477 delete [] tb->t ;
00478 tb->t = resu ;
00479
00480 return ;
00481 }
00482
00483
00484
00485
00486
00487
00488 void _mult_sp_p_cossin_i(Tbl* tb, int& base) {
00489
00490 assert(tb->get_etat() != ETATNONDEF) ;
00491
00492
00493
00494 int base_r = base & MSQ_R ;
00495 int base_t = base & MSQ_T ;
00496 base = base_r | base_t | P_COSSIN_P ;
00497
00498
00499
00500
00501
00502
00503 if (tb->get_etat() == ETATZERO) {
00504 return ;
00505 }
00506
00507 assert(tb->get_etat() == ETATQCQ) ;
00508
00509
00510 int nr = tb->get_dim(0) ;
00511 int nt = tb->get_dim(1) ;
00512 int np = tb->get_dim(2) - 2 ;
00513
00514
00515
00516
00517 if (np==1) {
00518 tb->set_etat_zero() ;
00519 return ;
00520 }
00521
00522 assert(np >= 4) ;
00523
00524 int ntnr = nt*nr ;
00525
00526 double* const cf = tb->t ;
00527 double* const resu = new double[ tb->get_taille() ] ;
00528 double* co = resu ;
00529
00530
00531
00532
00533 int q = 2 * ntnr ;
00534 for (int i=0; i<ntnr; i++) {
00535 co[i] = 0.5 * cf[q + i] ;
00536 }
00537 co += ntnr ;
00538
00539
00540
00541
00542 for (int i=0; i<ntnr; i++) {
00543 co[i] = 0 ;
00544 }
00545 co += ntnr ;
00546
00547
00548
00549
00550 int q1 = 2*ntnr ;
00551 int q2 = 4*ntnr ;
00552 for (int i=0; i<ntnr; i++) {
00553 co[i] = 0.5 * ( cf[q2+i] - cf[q1+i] ) ;
00554 }
00555 co += ntnr ;
00556
00557
00558
00559
00560 q = 3*ntnr ;
00561 for (int i=0; i<ntnr; i++) {
00562 co[i] = 0.5 * ( cf[i] - cf[q+i] ) ;
00563 }
00564 co += ntnr ;
00565
00566
00567
00568
00569 for (int k=4; k<np; k+=2) {
00570
00571 int k1 = k ;
00572
00573 q1 = k1*ntnr ;
00574 q2 = (k1+2)*ntnr ;
00575 for (int i=0; i<ntnr; i++) {
00576 co[i] = 0.5 * ( cf[q2+i] - cf[q1+i] ) ;
00577 }
00578 co += ntnr ;
00579 k1++ ;
00580
00581 q1 = (k1-2)*ntnr ;
00582 q2 = k1*ntnr ;
00583 for (int i=0; i<ntnr; i++) {
00584 co[i] = 0.5 * ( cf[q1+i] - cf[q2+i] ) ;
00585 }
00586 co += ntnr ;
00587 }
00588
00589
00590
00591
00592 q = np*ntnr ;
00593 for (int i=0; i<ntnr; i++) {
00594 co[i] = - 0.5 * cf[q+i] ;
00595 }
00596 co += ntnr ;
00597
00598
00599
00600
00601 for (int i=0; i<ntnr; i++) {
00602 co[i] = 0 ;
00603 }
00604
00605
00606 co += ntnr ;
00607 assert( co == resu + (np+2)*ntnr ) ;
00608
00609
00610
00611
00612 delete [] tb->t ;
00613 tb->t = resu ;
00614
00615 return ;
00616 }
00617