//**********************************************************************
PHX_EVALUATOR_CTOR(DirichletResidual_EdgeBasis,p)
{
    std::string residual_name = p.get<std::string>("Residual Name");

    basis = p.get<Teuchos::RCP<const panzer::PureBasis> >("Basis");
    pointRule = p.get<Teuchos::RCP<const panzer::PointRule> >("Point Rule");

    std::string field_name = p.get<std::string>("DOF Name");
    std::string dof_name = field_name+"_"+pointRule->getName();
    std::string value_name = p.get<std::string>("Value Name");

    Teuchos::RCP<PHX::DataLayout> basis_layout = basis->functional;
    Teuchos::RCP<PHX::DataLayout> vector_layout_dof    = pointRule->dl_vector;
    Teuchos::RCP<PHX::DataLayout> vector_layout_vector = basis->functional_grad;

    // some sanity checks
    TEUCHOS_ASSERT(basis->isVectorBasis());
    TEUCHOS_ASSERT(basis_layout->dimension(0)==vector_layout_dof->dimension(0));
    TEUCHOS_ASSERT(basis_layout->dimension(1)==vector_layout_dof->dimension(1));
    TEUCHOS_ASSERT(basis->dimension()==vector_layout_dof->dimension(2));
    TEUCHOS_ASSERT(vector_layout_vector->dimension(0)==vector_layout_dof->dimension(0));
    TEUCHOS_ASSERT(vector_layout_vector->dimension(1)==vector_layout_dof->dimension(1));
    TEUCHOS_ASSERT(vector_layout_vector->dimension(2)==vector_layout_dof->dimension(2));

    residual = PHX::MDField<ScalarT,Cell,BASIS>(residual_name, basis_layout);
    dof      = PHX::MDField<ScalarT,Cell,Point,Dim>(dof_name, vector_layout_dof);
    value    = PHX::MDField<ScalarT,Cell,Point,Dim>(value_name, vector_layout_vector);

    // setup the orientation field
    std::string orientationFieldName = basis->name() + " Orientation";
    // std::string orientationFieldName = field_name+" Orientation";
    // if(p.isType<std::string>("Orientation Field Name"))
    //   orientationFieldName = p.get<std::string>("Orientation Field Name");
    dof_orientation = PHX::MDField<ScalarT,Cell,BASIS>(orientationFieldName,
                      basis_layout);

    // setup all basis fields that are required
    panzer::MDFieldArrayFactory af_pv(pointRule->getName()+"_");

    // setup all fields to be evaluated and constructed
    pointValues.setupArrays(pointRule,af_pv);

    // the field manager will allocate all of these field
    this->addDependentField(pointValues.jac);


    this->addEvaluatedField(residual);
    this->addDependentField(dof);
    this->addDependentField(dof_orientation);
    this->addDependentField(value);
    this->addDependentField(pointValues.jac);

    std::string n = "Dirichlet Residual Edge Basis Evaluator";
    this->setName(n);
}
panzer::GatherTangents<EvalT, Traits>::
GatherTangents(
  const Teuchos::ParameterList& p)
{ 
  dof_name = (p.get< std::string >("DOF Name"));

  if(p.isType< Teuchos::RCP<PureBasis> >("Basis"))
    basis = p.get< Teuchos::RCP<PureBasis> >("Basis");
  else
    basis = p.get< Teuchos::RCP<const PureBasis> >("Basis");

  pointRule = p.get<Teuchos::RCP<const PointRule> >("Point Rule");

  Teuchos::RCP<PHX::DataLayout> basis_layout         = basis->functional;
  Teuchos::RCP<PHX::DataLayout> vector_layout_vector = basis->functional_grad;

  // some sanity checks
  TEUCHOS_ASSERT(basis->isVectorBasis());

  // setup the orientation field
  std::string orientationFieldName = basis->name() + " Orientation";
  dof_orientation = PHX::MDField<ScalarT,Cell,NODE>(orientationFieldName, basis_layout);

  // setup all basis fields that are required
  MDFieldArrayFactory af_pv(pointRule->getName()+"_");

  // setup all fields to be evaluated and constructed
  pointValues.setupArrays(pointRule,af_pv);

  // the field manager will allocate all of these field
  this->addDependentField(dof_orientation);
  this->addDependentField(pointValues.jac);

  gatherFieldTangents = PHX::MDField<ScalarT,Cell,NODE,Dim>(dof_name+"_Tangents",vector_layout_vector);
  this->addEvaluatedField(gatherFieldTangents);

  this->setName("Gather Tangents");
}