message: split parallel global assembly of the diagonal part of the derefinement matrix into continous and discontinuous cases, analogous to fespace.cpp; one processor case now works
diff: @@ -3025,6 +3025,47 @@ ParFiniteElementSpace::ParallelDerefinementMatrix(int old_ndofs,
  Array<char> mark(diag->Height());
  mark = 0;
  + if (FEColl()->GetContType() == FiniteElementCollection::DISCONTINUOUS)
  + {
  + for (int k = 0; k < dtrans.embeddings.Size(); k++)
  + {
  + const Embedding &emb = dtrans.embeddings[k];
  + if (emb.parent < 0) { continue; }
  +
  + int coarse_rank = old_pncmesh->ElementRank(emb.parent);
  + int fine_rank = old_ranks[k];
  +
  + if (coarse_rank == MyRank && fine_rank == MyRank)
  + {
  + Geometry::Type geom = mesh->GetElementBaseGeometry(emb.parent);
  + DenseMatrix &lR = localR[geom](emb.matrix);
  +
  + elem_dof->GetRow(emb.parent, dofs);
  + old_elem_dof->GetRow(k, old_dofs);
  +
  + for (int vd = 0; vd < vdim; vd++)
  + {
  + old_dofs.Copy(old_vdofs);
  + DofsToVDofs(vd, old_vdofs, old_ndofs);
  +
  + for (int i = 0; i < lR.Height(); i++)
  + {
  + if (!std::isfinite(lR(i, 0))) { continue; }
  +
  + int r = DofToVDof(dofs[i], vd);
  +
  + lR.GetRow(i, row);
  + for (int j = 0; j < old_vdofs.Size(); j++) {
  + diag->Set(r, old_vdofs[j], row[j]);
  + }
  + }
  + }
  + }
  + }
  + }
  + else
  + {
  +
  for (int k = 0; k < dtrans.embeddings.Size(); k++)
  {
  const Embedding &emb = dtrans.embeddings[k];
  @@ -3063,6 +3104,7 @@ ParFiniteElementSpace::ParallelDerefinementMatrix(int old_ndofs,
  }
  }
  }
  + }
  diag->Finalize();
  // wait for all sends/receives to complete
  