[petsc-users] dmda and structures
Gideon Simpson
gideon.simpson at icloud.com
Sun Dec 29 13:38:27 CST 2013
How would that work? I took Jed's advice, and set it up so that I have access via:
realization_array[ realization_dof * i + 1 +j] = jth point of ith realization
and then I further used a pointer:
PetscScalar *x;
x = & realization_array[ realization_dof * i + 1];
so that I have "clean" access to the elements of each realization through x[j].
-gideon
On Dec 29, 2013, at 2:33 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:
>
> DMDAVecGetArrayDOF() might serve your needs. You would access with realization_array[i][j] for the ith grid point and j th realization
>
> Barry
>
>
>
> On Dec 28, 2013, at 7:44 PM, Gideon Simpson <gideon.simpson at icloud.com> wrote:
>
>> 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);
>>
>> 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?
>>
>> -gideon
>>
>
More information about the petsc-users
mailing list