Mark Adams <mfad...@lbl.gov> writes: >> >> >>> I think I may know what your problem is. Plex evaluates the blocksize by >> looking for an equal number of dofs >> on each point. This is sufficient, but not necessary. If you are using >> higher order methods, there is block structure >> there that I will not see. >> > > I don't understand what the order has to do with it. > > I use code like this to setup the dofs: > > for (ii=0;ii<ctx->num_species;ii++) { > ierr = PetscFECreateDefault(PetscObjectComm((PetscObject) dm), dim, 1, > ctx->simplex, NULL, PETSC_DECIDE, &ctx->fe[ii]);CHKERRQ(ierr); > ierr = DMSetField(dm, ii, NULL, (PetscObject) > ctx->fe[ii]);CHKERRQ(ierr); > } > > Everything is constant, elements (eg, Q3) and dofs/vertex.
Everything in DMPlex is by *point*. A vertex has one block (num_species above), but a Q2 edge has two, a Q2 face has 4, and a Q2 cell has 8. Note that some DMPlex stuff might run faster if you just make one field with num_species components instead of num_species fields with one component each. It'll also make the block structure more exploitable.