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); |