Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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 */
Exemplo n.º 3
0
/*--- 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 */
Exemplo n.º 4
0
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);
	}
}