rng_t* posix_rng_new(size_t state_size) { static const int num_bytes = 256; char* state = polymec_malloc(sizeof(char) * num_bytes); rng_vtable vtable = {.set_seed = posix_set_seed, .get = posix_get, .dtor = posix_free}; initstate(random(), state, num_bytes); return rng_new("posix RNG", state, 0, posix_max, vtable, true, false); }
static gridRegularDistrib_t local_getFakeDistrib(void) { gridRegularDistrib_t distrib; gridRegular_t grid; gridPatch_t patch; dataVar_t var; gridPointDbl_t origin = {0., 0., 0.}; gridPointDbl_t extent = {1., 1., 1.}; gridPointUint32_t dims = {256, 256, 256}; gridPointInt_t nProcs = {0, 0, 0}; rng_t rng; int rank = 0; int size = 1; double *data; uint64_t num; grid = gridRegular_new("TEST", origin, extent, dims); var = dataVar_new("TESTVAR", DATAVARTYPE_DOUBLE, 1); gridRegular_attachVar(grid, var); distrib = gridRegularDistrib_new(grid, nProcs); #ifdef WITH_MPI MPI_Comm_size(MPI_COMM_WORLD, &size); gridRegularDistrib_initMPI(distrib, nProcs, MPI_COMM_WORLD); rank = gridRegularDistrib_getLocalRank(distrib); #endif patch = gridRegularDistrib_getPatchForRank(distrib, rank); gridRegular_attachPatch(grid, patch); data = gridPatch_getVarDataHandle(patch, 0); rng = rng_new(3, size, 45452); num = gridPatch_getNumCells(patch); for (uint64_t i = 0; i < num; i++) { data[i] = rng_getGauss(rng, 0, LOCAL_FAKE_MEAN, sqrt(LOCAL_FAKE_VARIANCE)); } rng_del(&rng); gridRegular_del(&grid); return distrib; } /* local_getFakeDistrib */
/*--- Implementations of local functions --------------------------------*/ static gridPatch_t local_getFakePatch(void) { gridPatch_t patch; dataVar_t var; gridPointUint32_t idxLo; gridPointUint32_t idxHi; double *data; uint64_t num; rng_t rng; int size = 1; #ifdef WITH_MPI MPI_Comm_size(MPI_COMM_WORLD, &size); #endif var = dataVar_new("TEST", DATAVARTYPE_DOUBLE, 1); idxLo[0] = 0; idxHi[0] = 15; idxLo[1] = 0; idxHi[1] = 127; #if (NDIM > 2) idxLo[2] = 0; idxHi[2] = 127; #endif patch = gridPatch_new(idxLo, idxHi); gridPatch_attachVar(patch, var); data = gridPatch_getVarDataHandle(patch, 0); rng = rng_new(3, size, 45452); num = gridPatch_getNumCells(patch); for (uint64_t i = 0; i < num; i++) { data[i] = rng_getGauss(rng, 0, LOCAL_FAKE_MEAN, sqrt(LOCAL_FAKE_VARIANCE)); } dataVar_del(&var); rng_del(&rng); return patch; } /* local_getFakePatch */
static void precalculate_effector(EffectorCache *eff) { unsigned int cfra = (unsigned int)(eff->scene->r.cfra >= 0 ? eff->scene->r.cfra : -eff->scene->r.cfra); if(!eff->pd->rng) eff->pd->rng = rng_new(eff->pd->seed + cfra); else rng_srandom(eff->pd->rng, eff->pd->seed + cfra); if(eff->pd->forcefield == PFIELD_GUIDE && eff->ob->type==OB_CURVE) { Curve *cu= eff->ob->data; if(cu->flag & CU_PATH) { if(cu->path==NULL || cu->path->data==NULL) makeDispListCurveTypes(eff->scene, eff->ob, 0); if(cu->path && cu->path->data) { where_on_path(eff->ob, 0.0, eff->guide_loc, eff->guide_dir, NULL, &eff->guide_radius, NULL); mul_m4_v3(eff->ob->obmat, eff->guide_loc); mul_mat3_m4_v3(eff->ob->obmat, eff->guide_dir); } } } else if(eff->pd->shape == PFIELD_SHAPE_SURFACE) { eff->surmd = (SurfaceModifierData *)modifiers_findByType ( eff->ob, eModifierType_Surface ); if(eff->ob->type == OB_CURVE) eff->flag |= PE_USE_NORMAL_DATA; } else if(eff->psys) psys_update_particle_tree(eff->psys, eff->scene->r.cfra); /* Store object velocity */ if(eff->ob) { float old_vel[3]; where_is_object_time(eff->scene, eff->ob, cfra - 1.0f); copy_v3_v3(old_vel, eff->ob->obmat[3]); where_is_object_time(eff->scene, eff->ob, cfra); sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel); } }