[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