Gideon Simpson <[email protected]> writes: > I'm trying to use 1D DMDA's to manage distributed monte carlo computations, > and I've got the following problem. If I know, in advance, how many floating > points are needed for each realization, everything is fine. But, if I want > to be able to set this at run time, I can't get it to work. What I have is: > > typedef struct { > PetscScalar id; > PetscScalar *x; > } Realization; > > then, in the main part of the code: > > Realization *realization_array; > DM sim_data_da; > Vec sim_data_vec; > > PetscInt xsize=10, realization_dof, i; > PetscOptionsGetInt(NULL, "-xsize", &xsize, NULL); > > realization_dof = xsize + 1; > > > DMDACreate1d(PETSC_COMM_WORLD,DMDA_BOUNDARY_NONE, batch_size, > realization_dof, 0, NULL, &sim_data_da); > DMCreateGlobalVector(sim_data_da,&sim_data_vec); > > DMDAVecGetArray(sim_data_da, sim_data_vec, & realization_array);
Vec can only hold PetscScalar, not pointers. > Up to this point, I have no problem, but, when I try to access > realization_array[i].x[j], I get memory errors. Is this > fundamentally unworkable, or is there a fix? You can't have this syntax in C or C++. I suggest tiny accessor functions that use the realization_dof to return the correct entries. The simplest version would look like realization_access(ctx,realization_array,i)[j] where ctx holds the block size and realization_array is just a plain PetscScalar*.
pgp41jYHGk8oc.pgp
Description: PGP signature
