Beispiel #1
0
void
dispose_multi_fit_engine_cache(struct multi_fit_engine *f)
{
    gsl_vector_free(f->jac_th);

    switch(f->system_kind) {
    case SYSTEM_REFLECTOMETER:
        gsl_vector_free(f->jac_n.refl);
        f->jac_n.refl = NULL;
        break;
    case SYSTEM_ELLISS_AB:
    case SYSTEM_ELLISS_PSIDEL:
        cmpl_vector_free(f->jac_n.ell);
        f->jac_n.ell = NULL;
    default:
        /* */
        ;
    }

    f->jac_th = NULL;

    dispose_stack_cache(& f->cache);
}
Beispiel #2
0
void
test_elliss_deriv (enum se_type spkind,
                   size_t _nb, const cmpl ns[], double phi0,
                   const double ds[], double lambda,
                   double anlz)
{
    gsl_vector *jacob_th;
    cmpl_vector *jacob_n;
    struct aux_param p[1];
    size_t j, nb = _nb;
    size_t nblyr = nb - 2;
    double *myds;
    cmpl *myns;
    ell_ab_t e;
    size_t noff;

#define TEST_CHANNEL 1

    printf ("LAMBDA: %f\n", lambda);

    jacob_th = gsl_vector_alloc (2 * nblyr);
    jacob_n  = cmpl_vector_alloc (2 * nb);

    myds = emalloc (nblyr * sizeof(double));
    myns = emalloc (nb * sizeof(cmpl));

    mult_layer_se_jacob (spkind, nb, ns, phi0, ds, lambda, anlz,
                         e, jacob_th, jacob_n);

    p->nb = nb;
    p->spkind = spkind;
    p->lambda = lambda;
    p->phi0 = phi0;
    p->anlz = anlz;

    p->ds = myds;
    p->ns = myns;

    p->thickness = 1;
    p->channel = TEST_CHANNEL;
    noff = (p->channel == 0 ? 0 : nblyr);
    for (j = 1; j < nb - 1; j++)
    {
        gsl_function F;
        double result, abserr;

        p->layer = j;

        F.function = & der_aux_f;
        F.params = p;

        memcpy (myds, ds, nblyr * sizeof(double));
        memcpy (myns, ns, nb * sizeof(cmpl));

        gsl_deriv_central (&F, ds[j-1], 1e-8, &result, &abserr);

        printf ("TH layer: %2i, numeric: %.6f, calcul.: %.6f, err: %f\n", j,
                result, gsl_vector_get (jacob_th, noff+j-1), abserr);
    }

    p->thickness = 0;
    p->channel = TEST_CHANNEL;
    noff = (p->channel == 0 ? 0 : nb);
    for (j = 0; j < nb; j++)
    {
        gsl_function F;
        double result, abserr;

        p->layer = j;

        F.function = & der_aux_f;
        F.params = p;

        memcpy (myds, ds, nblyr * sizeof(double));
        memcpy (myns, ns, nb * sizeof(cmpl));

        p->real_part = 1;
        gsl_deriv_central (&F, creal(ns[j]), 1e-8, &result, &abserr);
        printf ("Re{n} layer: %2i, numeric: %.6f, calcul.: %.6f, err: %f\n", j,
                result, creal(cmpl_vector_get (jacob_n, noff+j)), abserr);

        p->real_part = 0;
        gsl_deriv_central (&F, cimag(ns[j]), 1e-8, &result, &abserr);
        printf ("Im{n} layer: %2i, numeric: %.6f, calcul.: %.6f, err: %f\n", j,
                result, -cimag(cmpl_vector_get (jacob_n, noff+j)), abserr);
    }

    free (myds), free (myns);
    gsl_vector_free (jacob_th);
    cmpl_vector_free (jacob_n);
}