I believe I've gotten things to work in both cases, but I wanted to clarify what the substantial difference between DMDAVecGetArray and DMDAVecGetArrayDOF. Is it just that it allows me to do indexing of the form realization_array[i][j] instead of realization_array[i * num_dof +j], or is there something more here, in terms of how things are distributed?
-gideon On Dec 29, 2013, at 2:53 PM, Barry Smith <[email protected]> wrote: > > On Dec 29, 2013, at 1:38 PM, Gideon Simpson <[email protected]> wrote: > >> How would that work? > > I’ve modified your code fragment below with how I think you could do it. > >> 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 <[email protected]> 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 <[email protected]> >>> 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: >>>> >>>> >>>> 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); >>>> > PetscScalar **realization_array; > >>>> DMDAVecGetArrayDOF(sim_data_da, sim_data_vec, & realization_array); > > something = realization_array[i][j]; here i varies from xs to xs+xm-1 > and j varies from 0 to realization_dof-1 > >>>> >>>> >>>> -gideon >>>> >>> >> >
