struct sd_sch * sd_sch_new_emc(double time, double dt, double lam, struct sd_sys *sys, struct sd_hist *hist, struct sd_rng *rng) { struct data *d, z={0}; uint32_t n_dim = sys->get_n_dim(sys) , n_in = sys->get_n_in(sys) , n_out = sys->get_n_out(sys) ; if ((d = sd_malloc(sizeof(struct data))) == NULL || (*d=z, 0) || (d->f=sd_malloc(sizeof(double)*n_dim))==NULL || (d->g=sd_malloc(sizeof(double)*n_dim))==NULL || (d->z=sd_malloc(sizeof(double)*n_dim))==NULL || (d->eps=sd_malloc(sizeof(double)*n_dim))==NULL || sch_base_init(&d->base, time, dt, n_dim, n_in, n_out, sys, hist, rng, emc_n_byte, emc_free, emc_copy, emc_apply, &sample) != SD_OK ) { if (d->f!=NULL) sd_free(d->f); if (d->g!=NULL) sd_free(d->g); if (d->z!=NULL) sd_free(d->z); if (d->eps!=NULL) sd_free(d->eps); if (d != NULL) sd_free(d); sd_err("alloc for emc scheme failed."); return NULL; } d->first_call = true; d->lam = lam; d->base.sch.data = d; return &(d->base.sch); }
struct sd_sch * sd_sch_new_cb( double time, double dt, struct sd_sys *sys, struct sd_hist *hist, struct sd_rng *rng, void *user_data, enum sd_stat(*user_apply)(void *)) { struct data *data; if ((data = sd_malloc(sizeof(struct data))) == NULL) { sd_err("alloc sch cb failed."); return NULL; } sch_base_init(&data->base, time, dt, sys->get_n_dim(sys), sys->get_n_in(sys), sys->get_n_out(sys), sys, hist, rng, &n_byte, &cb_free, ©, &apply); data->base.sch.data = data; data->user_data = user_data; data->user_apply = user_apply; return &data->base.sch; }