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 char cmp_import_C[] = "$Header: /cvsroot/Lorene/C++/Source/Cmp/cmp_import.C,v 1.1.1.1 2001/11/20 15:19:27 e_gourgoulhon Exp $" ;
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 #include <math.h>
00056
00057
00058 #include "cmp.h"
00059 #include "param.h"
00060 #include "nbr_spx.h"
00061
00062
00063
00064
00065
00066 void Cmp::import(const Cmp& ci) {
00067
00068 int nz = mp->get_mg()->get_nzone() ;
00069
00070 import(nz, ci) ;
00071
00072 }
00073
00074
00075
00076
00077
00078 void Cmp::import(int nzet, const Cmp& cm_d) {
00079
00080 const Map* mp_d = cm_d.mp ;
00081
00082
00083
00084
00085 if (mp_d == mp) {
00086 *this = cm_d ;
00087 return ;
00088 }
00089
00090
00091
00092
00093 int align_rel = (mp->get_bvect_cart()).get_align()
00094 * (mp_d->get_bvect_cart()).get_align() ;
00095
00096 switch (align_rel) {
00097
00098 case 1 : {
00099 import_align(nzet, cm_d) ;
00100 break ;
00101 }
00102
00103 case -1 : {
00104 import_anti(nzet, cm_d) ;
00105 break ;
00106 }
00107
00108 case 0 : {
00109 import_gal(nzet, cm_d) ;
00110 break ;
00111 }
00112
00113 default : {
00114 cout << "Cmp::import : unexpected value of align_rel : "
00115 << align_rel << endl ;
00116 abort() ;
00117 break ;
00118 }
00119
00120 }
00121
00122 }
00123
00124
00125
00126
00127
00128
00129 void Cmp::import_gal(int nzet, const Cmp& cm_d) {
00130
00131 const Map* mp_d = cm_d.mp ;
00132
00133
00134
00135
00136 if (mp_d == mp) {
00137 *this = cm_d ;
00138 return ;
00139 }
00140
00141
00142
00143
00144 if (cm_d.etat == ETATZERO) {
00145 set_etat_zero() ;
00146 return ;
00147 }
00148
00149
00150
00151
00152 assert(cm_d.etat != ETATNONDEF) ;
00153
00154 if (cm_d.dzpuis != 0) {
00155 cout <<
00156 "Cmp::import : the dzpuis of the Cmp to be imported must be zero !"
00157 << endl ;
00158 abort() ;
00159 }
00160
00161
00162 const Mg3d* mg_a = mp->get_mg() ;
00163 int nz_a = mg_a->get_nzone() ;
00164 assert(nzet <= nz_a) ;
00165
00166
00167
00168
00169 assert(cm_d.etat == ETATQCQ) ;
00170 const Valeur& va_d = cm_d.va ;
00171 va_d.coef() ;
00172
00173
00174
00175
00176 del_t() ;
00177
00178 set_etat_qcq() ;
00179
00180 va.set_etat_c_qcq() ;
00181
00182 va.c->set_etat_qcq() ;
00183
00184
00185
00186
00187 double xo_d = mp_d->get_ori_x() ;
00188 double yo_d = mp_d->get_ori_y() ;
00189 double zo_d = mp_d->get_ori_z() ;
00190
00191
00192 double rot_phi_d = mp_d->get_rot_phi() ;
00193
00194
00195 double rot_phi_a = mp->get_rot_phi() ;
00196
00197
00198
00199
00200 if ( (mp->r).c == 0x0 ) (mp->r).fait() ;
00201 if ( (mp->tet).c == 0x0 ) (mp->tet).fait() ;
00202 if ( (mp->phi).c == 0x0 ) (mp->phi).fait() ;
00203 if ( (mp->xa).c == 0x0 ) (mp->xa).fait() ;
00204 if ( (mp->ya).c == 0x0 ) (mp->ya).fait() ;
00205 if ( (mp->za).c == 0x0 ) (mp->za).fait() ;
00206
00207 const Mtbl* mr_a = (mp->r).c ;
00208 const Mtbl* mtet_a = (mp->tet).c ;
00209 const Mtbl* mphi_a = (mp->phi).c ;
00210 const Mtbl* mxa_a = (mp->xa).c ;
00211 const Mtbl* mya_a = (mp->ya).c ;
00212 const Mtbl* mza_a = (mp->za).c ;
00213
00214 Param par_precis ;
00215 int nitermax = 100 ;
00216 int niter ;
00217 double precis = 1e-15 ;
00218 par_precis.add_int(nitermax) ;
00219 par_precis.add_int_mod(niter) ;
00220 par_precis.add_double(precis) ;
00221
00222
00223
00224
00225
00226 for (int l=0; l < nzet; l++) {
00227
00228 int nr = mg_a->get_nr(l) ;
00229 int nt = mg_a->get_nt(l) ;
00230 int np = mg_a->get_np(l) ;
00231
00232
00233 const double* pr_a = mr_a->t[l]->t ;
00234 const double* ptet_a = mtet_a->t[l]->t ;
00235 const double* pphi_a = mphi_a->t[l]->t ;
00236 const double* pxa_a = mxa_a->t[l]->t ;
00237 const double* pya_a = mya_a->t[l]->t ;
00238 const double* pza_a = mza_a->t[l]->t ;
00239
00240 (va.c->t[l])->set_etat_qcq() ;
00241
00242 double* ptx = (va.c->t[l])->t ;
00243
00244
00245
00246
00247 for (int k=0 ; k<np ; k++) {
00248 for (int j=0 ; j<nt ; j++) {
00249 for (int i=0 ; i<nr ; i++) {
00250
00251 double r = *pr_a ;
00252 double rd, tetd, phid ;
00253 if (r == __infinity) {
00254 rd = r ;
00255 tetd = *ptet_a ;
00256 phid = *pphi_a + rot_phi_a - rot_phi_d ;
00257 if (phid < 0) phid += 2*M_PI ;
00258 }
00259 else {
00260
00261
00262
00263 double xd = *pxa_a - xo_d ;
00264 double yd = *pya_a - yo_d ;
00265 double zd = *pza_a - zo_d ;
00266
00267
00268 double rhod2 = xd*xd + yd*yd ;
00269 double rhod = sqrt( rhod2 ) ;
00270 rd = sqrt(rhod2 + zd*zd) ;
00271 tetd = atan2(rhod, zd) ;
00272 phid = atan2(yd, xd) - rot_phi_d ;
00273 if (phid < 0) phid += 2*M_PI ;
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 int ld ;
00285 double xxd ;
00286 mp_d->val_lx(rd, tetd, phid, par_precis, ld, xxd) ;
00287
00288
00289 *ptx = va_d.c_cf->val_point(ld, xxd, tetd, phid) ;
00290
00291
00292 ptx++ ;
00293 pr_a++ ;
00294 ptet_a++ ;
00295 pphi_a++ ;
00296 pxa_a++ ;
00297 pya_a++ ;
00298 pza_a++ ;
00299
00300 }
00301 }
00302 }
00303
00304
00305 }
00306
00307
00308
00309
00310 if (nzet < nz_a) {
00311 annule(nzet, nz_a - 1) ;
00312 }
00313
00314
00315
00316
00317
00318 set_dzpuis(0) ;
00319
00320 }
00321
00322
00323
00324
00325
00326
00327
00328 void Cmp::import_anti(int nzet, const Cmp& cm_d) {
00329
00330
00331
00332
00333 if (cm_d.etat == ETATZERO) {
00334 set_etat_zero() ;
00335 return ;
00336 }
00337
00338 const Map* mp_d = cm_d.mp ;
00339
00340
00341
00342 int align = (mp->get_bvect_cart()).get_align() ;
00343
00344 assert( align * (mp_d->get_bvect_cart()).get_align() == -1 ) ;
00345
00346 assert(cm_d.etat == ETATQCQ) ;
00347
00348 if (cm_d.dzpuis != 0) {
00349 cout <<
00350 "Cmp::import : the dzpuis of the Cmp to be imported must be zero !"
00351 << endl ;
00352 abort() ;
00353 }
00354
00355
00356 const Mg3d* mg_a = mp->get_mg() ;
00357 int nz_a = mg_a->get_nzone() ;
00358 assert(nzet <= nz_a) ;
00359
00360 const Valeur& va_d = cm_d.va ;
00361 va_d.coef() ;
00362
00363
00364
00365
00366 del_t() ;
00367
00368 set_etat_qcq() ;
00369
00370 va.set_etat_c_qcq() ;
00371
00372 va.c->set_etat_qcq() ;
00373
00374
00375
00376
00377
00378 double xx_a, yy_a, zz_a ;
00379 if (align == 1) {
00380 xx_a = mp_d->get_ori_x() - mp->get_ori_x() ;
00381 yy_a = mp_d->get_ori_y() - mp->get_ori_y() ;
00382 }
00383 else {
00384 xx_a = mp->get_ori_x() - mp_d->get_ori_x() ;
00385 yy_a = mp->get_ori_y() - mp_d->get_ori_y() ;
00386 }
00387 zz_a = mp->get_ori_z() - mp_d->get_ori_z() ;
00388
00389
00390
00391
00392
00393 if ( (mp->r).c == 0x0 ) (mp->r).fait() ;
00394 if ( (mp->tet).c == 0x0 ) (mp->tet).fait() ;
00395 if ( (mp->phi).c == 0x0 ) (mp->phi).fait() ;
00396 if ( (mp->x).c == 0x0 ) (mp->x).fait() ;
00397 if ( (mp->y).c == 0x0 ) (mp->y).fait() ;
00398 if ( (mp->z).c == 0x0 ) (mp->z).fait() ;
00399
00400 const Mtbl* mr_a = (mp->r).c ;
00401 const Mtbl* mtet_a = (mp->tet).c ;
00402 const Mtbl* mphi_a = (mp->phi).c ;
00403 const Mtbl* mx_a = (mp->x).c ;
00404 const Mtbl* my_a = (mp->y).c ;
00405 const Mtbl* mz_a = (mp->z).c ;
00406
00407 Param par_precis ;
00408 int nitermax = 100 ;
00409 int niter ;
00410 double precis = 1e-15 ;
00411 par_precis.add_int(nitermax) ;
00412 par_precis.add_int_mod(niter) ;
00413 par_precis.add_double(precis) ;
00414
00415
00416
00417
00418
00419 for (int l=0; l < nzet; l++) {
00420
00421 int nr = mg_a->get_nr(l) ;
00422 int nt = mg_a->get_nt(l) ;
00423 int np = mg_a->get_np(l) ;
00424
00425
00426 const double* pr_a = mr_a->t[l]->t ;
00427 const double* ptet_a = mtet_a->t[l]->t ;
00428 const double* pphi_a = mphi_a->t[l]->t ;
00429 const double* px_a = mx_a->t[l]->t ;
00430 const double* py_a = my_a->t[l]->t ;
00431 const double* pz_a = mz_a->t[l]->t ;
00432
00433 (va.c->t[l])->set_etat_qcq() ;
00434
00435 double* ptx = (va.c->t[l])->t ;
00436
00437
00438
00439
00440 for (int k=0 ; k<np ; k++) {
00441 for (int j=0 ; j<nt ; j++) {
00442 for (int i=0 ; i<nr ; i++) {
00443
00444 double r = *pr_a ;
00445 double rd, tetd, phid ;
00446 if (r == __infinity) {
00447 rd = r ;
00448 tetd = *ptet_a ;
00449 phid = *pphi_a + M_PI ;
00450 if (phid < 0) phid += 2*M_PI ;
00451 }
00452 else {
00453
00454
00455 double xd = - *px_a + xx_a ;
00456 double yd = - *py_a + yy_a ;
00457 double zd = *pz_a + zz_a ;
00458
00459
00460 double rhod2 = xd*xd + yd*yd ;
00461 double rhod = sqrt( rhod2 ) ;
00462 rd = sqrt(rhod2 + zd*zd) ;
00463 tetd = atan2(rhod, zd) ;
00464 phid = atan2(yd, xd) ;
00465 if (phid < 0) phid += 2*M_PI ;
00466 }
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476 int ld ;
00477 double xxd ;
00478 mp_d->val_lx(rd, tetd, phid, par_precis, ld, xxd) ;
00479
00480
00481 *ptx = va_d.c_cf->val_point(ld, xxd, tetd, phid) ;
00482
00483
00484 ptx++ ;
00485 pr_a++ ;
00486 ptet_a++ ;
00487 pphi_a++ ;
00488 px_a++ ;
00489 py_a++ ;
00490 pz_a++ ;
00491
00492 }
00493 }
00494 }
00495
00496
00497 }
00498
00499
00500
00501
00502 if (nzet < nz_a) {
00503 annule(nzet, nz_a - 1) ;
00504 }
00505
00506
00507
00508
00509
00510 set_dzpuis(0) ;
00511
00512 }
00513
00514
00515
00516
00517
00518
00519
00520 void Cmp::import_align(int nzet, const Cmp& cm_d) {
00521
00522
00523
00524
00525 if (cm_d.etat == ETATZERO) {
00526 set_etat_zero() ;
00527 return ;
00528 }
00529
00530 const Map* mp_d = cm_d.mp ;
00531
00532
00533
00534 int align = (mp->get_bvect_cart()).get_align() ;
00535
00536 assert( align * (mp_d->get_bvect_cart()).get_align() == 1 ) ;
00537
00538 assert(cm_d.etat == ETATQCQ) ;
00539
00540 if (cm_d.dzpuis != 0) {
00541 cout <<
00542 "Cmp::import : the dzpuis of the Cmp to be imported must be zero !"
00543 << endl ;
00544 abort() ;
00545 }
00546
00547
00548 const Mg3d* mg_a = mp->get_mg() ;
00549 int nz_a = mg_a->get_nzone() ;
00550 assert(nzet <= nz_a) ;
00551
00552 const Valeur& va_d = cm_d.va ;
00553 va_d.coef() ;
00554
00555
00556
00557
00558 del_t() ;
00559
00560 set_etat_qcq() ;
00561
00562 va.set_etat_c_qcq() ;
00563
00564 va.c->set_etat_qcq() ;
00565
00566
00567
00568
00569
00570 double xx_a, yy_a, zz_a ;
00571 if (align == 1) {
00572 xx_a = mp->get_ori_x() - mp_d->get_ori_x() ;
00573 yy_a = mp->get_ori_y() - mp_d->get_ori_y() ;
00574 }
00575 else {
00576 xx_a = mp_d->get_ori_x() - mp->get_ori_x() ;
00577 yy_a = mp_d->get_ori_y() - mp->get_ori_y() ;
00578 }
00579 zz_a = mp->get_ori_z() - mp_d->get_ori_z() ;
00580
00581
00582
00583
00584
00585 if ( (mp->r).c == 0x0 ) (mp->r).fait() ;
00586 if ( (mp->tet).c == 0x0 ) (mp->tet).fait() ;
00587 if ( (mp->phi).c == 0x0 ) (mp->phi).fait() ;
00588 if ( (mp->x).c == 0x0 ) (mp->x).fait() ;
00589 if ( (mp->y).c == 0x0 ) (mp->y).fait() ;
00590 if ( (mp->z).c == 0x0 ) (mp->z).fait() ;
00591
00592 const Mtbl* mr_a = (mp->r).c ;
00593 const Mtbl* mtet_a = (mp->tet).c ;
00594 const Mtbl* mphi_a = (mp->phi).c ;
00595 const Mtbl* mx_a = (mp->x).c ;
00596 const Mtbl* my_a = (mp->y).c ;
00597 const Mtbl* mz_a = (mp->z).c ;
00598
00599 Param par_precis ;
00600 int nitermax = 100 ;
00601 int niter ;
00602 double precis = 1e-15 ;
00603 par_precis.add_int(nitermax) ;
00604 par_precis.add_int_mod(niter) ;
00605 par_precis.add_double(precis) ;
00606
00607
00608
00609
00610
00611 for (int l=0; l < nzet; l++) {
00612
00613 int nr = mg_a->get_nr(l) ;
00614 int nt = mg_a->get_nt(l) ;
00615 int np = mg_a->get_np(l) ;
00616
00617
00618 const double* pr_a = mr_a->t[l]->t ;
00619 const double* ptet_a = mtet_a->t[l]->t ;
00620 const double* pphi_a = mphi_a->t[l]->t ;
00621 const double* px_a = mx_a->t[l]->t ;
00622 const double* py_a = my_a->t[l]->t ;
00623 const double* pz_a = mz_a->t[l]->t ;
00624
00625 (va.c->t[l])->set_etat_qcq() ;
00626
00627 double* ptx = (va.c->t[l])->t ;
00628
00629
00630
00631
00632 for (int k=0 ; k<np ; k++) {
00633 for (int j=0 ; j<nt ; j++) {
00634 for (int i=0 ; i<nr ; i++) {
00635
00636 double r = *pr_a ;
00637 double rd, tetd, phid ;
00638 if (r == __infinity) {
00639 rd = r ;
00640 tetd = *ptet_a ;
00641 phid = *pphi_a ;
00642 }
00643 else {
00644
00645
00646 double xd = *px_a + xx_a ;
00647 double yd = *py_a + yy_a ;
00648 double zd = *pz_a + zz_a ;
00649
00650
00651 double rhod2 = xd*xd + yd*yd ;
00652 double rhod = sqrt( rhod2 ) ;
00653 rd = sqrt(rhod2 + zd*zd) ;
00654 tetd = atan2(rhod, zd) ;
00655 phid = atan2(yd, xd) ;
00656 if (phid < 0) phid += 2*M_PI ;
00657 }
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667 int ld ;
00668 double xxd ;
00669 mp_d->val_lx(rd, tetd, phid, par_precis, ld, xxd) ;
00670
00671
00672 *ptx = va_d.c_cf->val_point(ld, xxd, tetd, phid) ;
00673
00674
00675 ptx++ ;
00676 pr_a++ ;
00677 ptet_a++ ;
00678 pphi_a++ ;
00679 px_a++ ;
00680 py_a++ ;
00681 pz_a++ ;
00682
00683 }
00684 }
00685 }
00686
00687
00688 }
00689
00690
00691
00692
00693 if (nzet < nz_a) {
00694 annule(nzet, nz_a - 1) ;
00695 }
00696
00697
00698
00699
00700
00701 set_dzpuis(0) ;
00702
00703 }