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