| 489 |
|
static void |
| 490 |
|
check_normal_incidence(void) |
| 491 |
|
{ |
| 492 |
< |
const int saved_nprocs = nprocs; |
| 493 |
< |
RBFNODE *near_rbf, *mir_rbf, *rbf; |
| 494 |
< |
double bestd; |
| 495 |
< |
int n, i, j; |
| 492 |
> |
static const FVECT norm_vec = {.0, .0, 1.}; |
| 493 |
> |
const int saved_nprocs = nprocs; |
| 494 |
> |
RBFNODE *near_rbf, *mir_rbf, *rbf; |
| 495 |
> |
double bestd; |
| 496 |
> |
int n; |
| 497 |
|
|
| 498 |
|
if (dsf_list == NULL) |
| 499 |
|
return; /* XXX should be error? */ |
| 543 |
|
nprocs = 1; /* compute migration matrix */ |
| 544 |
|
if (mig_list != create_migration(mir_rbf, near_rbf)) |
| 545 |
|
exit(1); /* XXX should never happen! */ |
| 546 |
< |
n = 0; /* count migrating particles */ |
| 547 |
< |
for (i = 0; i < mtx_nrows(mig_list); i++) |
| 547 |
< |
for (j = 0; j < mtx_ncols(mig_list); j++) |
| 548 |
< |
n += (mtx_coef(mig_list,i,j) > FTINY); |
| 549 |
< |
rbf = (RBFNODE *)malloc(sizeof(RBFNODE) + sizeof(RBFVAL)*(n-1)); |
| 550 |
< |
if (rbf == NULL) |
| 551 |
< |
goto memerr; |
| 552 |
< |
rbf->next = NULL; rbf->ejl = NULL; |
| 553 |
< |
rbf->invec[0] = rbf->invec[1] = 0; rbf->invec[2] = 1.; |
| 554 |
< |
rbf->nrbf = n; |
| 555 |
< |
rbf->vtotal = .5 + .5*mig_list->rbfv[1]->vtotal/mig_list->rbfv[0]->vtotal; |
| 556 |
< |
n = 0; /* advect RBF lobes halfway */ |
| 557 |
< |
for (i = 0; i < mtx_nrows(mig_list); i++) { |
| 558 |
< |
const RBFVAL *rbf0i = &mig_list->rbfv[0]->rbfa[i]; |
| 559 |
< |
const float peak0 = rbf0i->peak; |
| 560 |
< |
const double rad0 = R2ANG(rbf0i->crad); |
| 561 |
< |
FVECT v0; |
| 562 |
< |
float mv; |
| 563 |
< |
ovec_from_pos(v0, rbf0i->gx, rbf0i->gy); |
| 564 |
< |
for (j = 0; j < mtx_ncols(mig_list); j++) |
| 565 |
< |
if ((mv = mtx_coef(mig_list,i,j)) > FTINY) { |
| 566 |
< |
const RBFVAL *rbf1j = &mig_list->rbfv[1]->rbfa[j]; |
| 567 |
< |
double rad2; |
| 568 |
< |
FVECT v; |
| 569 |
< |
int pos[2]; |
| 570 |
< |
rad2 = R2ANG(rbf1j->crad); |
| 571 |
< |
rad2 = .5*(rad0*rad0 + rad2*rad2); |
| 572 |
< |
rbf->rbfa[n].peak = peak0 * mv * rbf->vtotal * |
| 573 |
< |
rad0*rad0/rad2; |
| 574 |
< |
rbf->rbfa[n].crad = ANG2R(sqrt(rad2)); |
| 575 |
< |
ovec_from_pos(v, rbf1j->gx, rbf1j->gy); |
| 576 |
< |
geodesic(v, v0, v, .5, GEOD_REL); |
| 577 |
< |
pos_from_vec(pos, v); |
| 578 |
< |
rbf->rbfa[n].gx = pos[0]; |
| 579 |
< |
rbf->rbfa[n].gy = pos[1]; |
| 580 |
< |
++n; |
| 581 |
< |
} |
| 582 |
< |
} |
| 583 |
< |
rbf->vtotal *= mig_list->rbfv[0]->vtotal; |
| 546 |
> |
/* interpolate normal dist. */ |
| 547 |
> |
rbf = e_advect_rbf(mig_list, norm_vec, 2*near_rbf->nrbf); |
| 548 |
|
nprocs = saved_nprocs; /* final clean-up */ |
| 549 |
|
free(mir_rbf); |
| 550 |
|
free(mig_list); |