message: Implement (fix) the method Mesh::GetBdrElementTransformation for
  the case of meshes with discontinuous nodes, e.g. periodic meshes.
diff: @@ -419,15 +419,17 @@ void Mesh::GetBdrElementTransformation(int i, IsoparametricTransformation* ElTr)
  {
  ElTr->Attribute = GetBdrAttribute(i);
  ElTr->ElementNo = i; // boundary element number
  + DenseMatrix &pm = ElTr->GetPointMat();
  if (Nodes == NULL)
  {
  - GetBdrPointMatrix(i, ElTr->GetPointMat());
  - ElTr->SetFE(
  - GetTransformationFEforElementType(GetBdrElementType(i)));
  + GetBdrPointMatrix(i, pm);
  + ElTr->SetFE(GetTransformationFEforElementType(GetBdrElementType(i)));
  }
  else
  {
  - DenseMatrix &pm = ElTr->GetPointMat();
  + const FiniteElement *bdr_el = Nodes->FESpace()->GetBE(i);
  + if (bdr_el)
  + {
  Array<int> vdofs;
  Nodes->FESpace()->GetBdrElementVDofs(i, vdofs);
  int n = vdofs.Size()/spaceDim;
  @@ -439,7 +441,29 @@ void Mesh::GetBdrElementTransformation(int i, IsoparametricTransformation* ElTr)
  pm(k,j) = (*Nodes)(vdofs[n*k+j]);
  }
  }
  - ElTr->SetFE(Nodes->FESpace()->GetBE(i));
  + ElTr->SetFE(bdr_el);
  + }
  + else // L2 Nodes (e.g., periodic mesh)
  + {
  + int elem_id, face_info;
  + GetBdrElementAdjacentElement(i, elem_id, face_info);
  +
  + GetLocalFaceTransformation(GetBdrElementType(i),
  + GetElementType(elem_id),
  + FaceElemTr.Loc1.Transf, face_info);
  + // NOTE: FaceElemTr.Loc1 is overwritten here -- used as a temporary
  +
  + const FiniteElement *face_el =
  + Nodes->FESpace()->GetTraceElement(elem_id,
  + GetBdrElementBaseGeometry(i));
  +
  + IntegrationRule eir(face_el->GetDof());
  + FaceElemTr.Loc1.Transform(face_el->GetNodes(), eir);
  + // 'Transformation' is not used
  + Nodes->GetVectorValues(Transformation, eir, pm);
  +
  + ElTr->SetFE(face_el);
  + }
  }
  ElTr->FinalizeTransformation();
  }
  