// Neumann BCs void FELIX::StokesFO::constructNeumannEvaluators (const Teuchos::RCP<Albany::MeshSpecsStruct>& meshSpecs) { // Note: we only enter this function if sidesets are defined in the mesh file // i.e. meshSpecs.ssNames.size() > 0 Albany::BCUtils<Albany::NeumannTraits> nbcUtils; // Check to make sure that Neumann BCs are given in the input file if(!nbcUtils.haveBCSpecified(this->params)) { return; } // Construct BC evaluators for all side sets and names // Note that the string index sets up the equation offset, so ordering is important std::vector<std::string> neumannNames(neq + 1); Teuchos::Array<Teuchos::Array<int> > offsets; offsets.resize(neq + 1); neumannNames[0] = "U0"; offsets[0].resize(1); offsets[0][0] = 0; offsets[neq].resize(neq); offsets[neq][0] = 0; if (neq>1){ neumannNames[1] = "U1"; offsets[1].resize(1); offsets[1][0] = 1; offsets[neq][1] = 1; } if (neq>2){ neumannNames[2] = "U2"; offsets[2].resize(1); offsets[2][0] = 2; offsets[neq][2] = 2; } neumannNames[neq] = "all"; // Construct BC evaluators for all possible names of conditions // Should only specify flux vector components (dCdx, dCdy, dCdz), or dCdn, not both std::vector<std::string> condNames(6); //(dCdx, dCdy, dCdz), dCdn, basal, P, lateral, basal_scalar_field Teuchos::ArrayRCP<std::string> dof_names(1); dof_names[0] = "Velocity"; // Note that sidesets are only supported for two and 3D currently if(numDim == 2) condNames[0] = "(dFluxdx, dFluxdy)"; else if(numDim == 3) condNames[0] = "(dFluxdx, dFluxdy, dFluxdz)"; else TEUCHOS_TEST_FOR_EXCEPTION(true, Teuchos::Exceptions::InvalidParameter, std::endl << "Error: Sidesets only supported in 2 and 3D." << std::endl); condNames[1] = "dFluxdn"; condNames[2] = "basal"; condNames[3] = "P"; condNames[4] = "lateral"; condNames[5] = "basal_scalar_field"; std::vector< Teuchos::RCP<PHX::Evaluator<PHAL::AlbanyTraits> > > extra_evaluators; ConstructBasalEvaluatorOp constructor(*this,extra_evaluators); boost::mpl::for_each<PHAL::AlbanyTraits::BEvalTypes>(constructor); nfm.resize(1); // FELIX problem only has one element block nfm[0] = nbcUtils.constructBCEvaluators(meshSpecs, neumannNames, dof_names, true, 0, condNames, offsets, dl, this->params, this->paramLib, extra_evaluators); }
// Neumann BCs void Albany::HMCProblem::constructNeumannEvaluators( const Teuchos::RCP<Albany::MeshSpecsStruct>& meshSpecs) { // Note: we only enter this function if sidesets are defined in the mesh file // i.e. meshSpecs.ssNames.size() > 0 Albany::BCUtils<Albany::NeumannTraits> neuUtils; // Check to make sure that Neumann BCs are given in the input file if(!neuUtils.haveBCSpecified(this->params)) return; // Construct BC evaluators for all side sets and names // Note that the string index sets up the equation offset, so ordering is important std::vector<std::string> neumannNames(neq + 1); Teuchos::Array<Teuchos::Array<int>> offsets; offsets.resize(neq + 1); neumannNames[0] = "sig_x"; offsets[0].resize(1); offsets[0][0] = 0; offsets[neq].resize(neq); offsets[neq][0] = 0; if (neq>1){ neumannNames[1] = "sig_y"; offsets[1].resize(1); offsets[1][0] = 1; offsets[neq][1] = 1; } if (neq>2){ neumannNames[2] = "sig_z"; offsets[2].resize(1); offsets[2][0] = 2; offsets[neq][2] = 2; } neumannNames[neq] = "all"; // Construct BC evaluators for all possible names of conditions // Should only specify flux vector components (dudx, dudy, dudz), or dudn, not both std::vector<std::string> condNames(3); //dudx, dudy, dudz, dudn, P Teuchos::ArrayRCP<std::string> dof_names(1); dof_names[0] = "Displacement"; // Note that sidesets are only supported for two and 3D currently if(numDim == 2) condNames[0] = "(t_x, t_y)"; else if(numDim == 3) condNames[0] = "(t_x, t_y, t_z)"; else TEUCHOS_TEST_FOR_EXCEPTION(true, Teuchos::Exceptions::InvalidParameter, std::endl << "Error: Sidesets only supported in 2 and 3D." << std::endl); condNames[1] = "dudn"; condNames[2] = "P"; nfm.resize(1); // HMC problem only has one element block nfm[0] = neuUtils.constructBCEvaluators(meshSpecs, neumannNames, dof_names, true, 0, condNames, offsets, dl, this->params, this->paramLib); }
// Neumann BCs void Aeras::XScalarAdvectionProblem:: constructNeumannEvaluators(const Teuchos::RCP<Albany::MeshSpecsStruct>& meshSpecs) { // Note: we only enter this function if sidesets are defined in the mesh file // i.e. meshSpecs.ssNames.size() > 0 Albany::BCUtils<Albany::NeumannTraits> nbcUtils; // Check to make sure that Neumann BCs are given in the input file if(!nbcUtils.haveBCSpecified(this->params)) { return; } // Construct BC evaluators for all side sets and names // Note that the string index sets up the equation offset, so ordering is important std::vector<std::string> neumannNames(1 + 1); Teuchos::Array<Teuchos::Array<int> > offsets; offsets.resize(1 + 1); neumannNames[0] = "rho"; offsets[0].resize(1); offsets[0][0] = 0; offsets[1].resize(1); offsets[1][0] = 0; neumannNames[1] = "all"; // Construct BC evaluators for all possible names of conditions // Should only specify flux vector components (dUdx, dUdy, dUdz) std::vector<std::string> condNames(1); //(dUdx, dUdy, dUdz) Teuchos::ArrayRCP<std::string> dof_names(1); dof_names[0] = "rho"; // Note that sidesets are only supported for two and 3D currently if(numDim == 1) condNames[0] = "(dFluxdx)"; else if(numDim == 2) condNames[0] = "(dFluxdx, dFluxdy)"; else if(numDim == 3) condNames[0] = "(dFluxdx, dFluxdy, dFluxdz)"; else TEUCHOS_TEST_FOR_EXCEPTION(true, Teuchos::Exceptions::InvalidParameter, std::endl << "Error: Sidesets only supported in 2 and 3D." << std::endl); // condNames[1] = "dFluxdn"; // condNames[2] = "basal"; // condNames[3] = "P"; // condNames[4] = "lateral"; nfm.resize(1); // Aeras X scalar advection problem only has one // element block nfm[0] = nbcUtils.constructBCEvaluators(meshSpecs, neumannNames, dof_names, true, 0, condNames, offsets, dl, this->params, this->paramLib); }