void RHSTests::setup() { FieldContainer<double> quadPoints(4,2); quadPoints(0,0) = 0.0; // x1 quadPoints(0,1) = 0.0; // y1 quadPoints(1,0) = 1.0; quadPoints(1,1) = 0.0; quadPoints(2,0) = 1.0; quadPoints(2,1) = 1.0; quadPoints(3,0) = 0.0; quadPoints(3,1) = 1.0; int H1Order = 3; int delta_p = 3; // for test functions int horizontalCells = 2; int verticalCells = 2; double eps = 1.0; // not really testing for sharp gradients right now--just want to see if things basically work double beta_x = 1.0; double beta_y = 1.0; BFPtr confusionBF = ConfusionBilinearForm::confusionBF(eps,beta_x,beta_y); Teuchos::RCP<ConfusionProblemLegacy> confusionProblem = Teuchos::rcp( new ConfusionProblemLegacy(confusionBF, beta_x, beta_y) ); _rhs = confusionProblem; _mesh = MeshFactory::buildQuadMesh(quadPoints, horizontalCells, verticalCells, confusionBF, H1Order, H1Order+delta_p); _mesh->setUsePatchBasis(false); VarFactoryPtr varFactory = confusionBF->varFactory(); // Create test IDs that match the enum in ConfusionBilinearForm _tau = varFactory->testVar(ConfusionBilinearForm::S_TAU,HDIV); _v = varFactory->testVar(ConfusionBilinearForm::S_V,HGRAD); _rhsEasy = RHS::rhs(); _rhsEasy->addTerm( _v ); }
ConfusionManufacturedSolution::ConfusionManufacturedSolution(double epsilon, double beta_x, double beta_y) { _epsilon = epsilon; _beta_x = beta_x; _beta_y = beta_y; // set the class variables from ExactSolution: // _bc = Teuchos::rcp(this,false); // false: don't let the RCP own the memory // _rhs = Teuchos::rcp(this,false); BFPtr bf = ConfusionBilinearForm::confusionBF(epsilon,beta_x,beta_y); _bilinearForm = bf; VarFactoryPtr vf = bf->varFactory(); VarPtr u = vf->fieldVar(ConfusionBilinearForm::S_U); VarPtr sigma1 = vf->fieldVar(ConfusionBilinearForm::S_SIGMA_1); VarPtr sigma2 = vf->fieldVar(ConfusionBilinearForm::S_SIGMA_2); _u_hat = vf->traceVar(ConfusionBilinearForm::S_U_HAT); _beta_n_u_minus_sigma_hat = vf->fluxVar(ConfusionBilinearForm::S_BETA_N_U_MINUS_SIGMA_HAT); _v = vf->testVar(ConfusionBilinearForm::S_V, HGRAD); FunctionPtr u_exact = this->u(); FunctionPtr sigma_exact = epsilon * u_exact->grad(); FunctionPtr u_exact_laplacian = u_exact->dx()->dx() + u_exact->dy()->dy(); _rhs = RHS::rhs(); FunctionPtr f = - _epsilon * u_exact_laplacian + _beta_x * u_exact->dx() + _beta_y * u_exact->dy(); _rhs->addTerm( f * _v ); _bc = BC::bc(); _bc->addDirichlet(_u_hat, SpatialFilter::allSpace(), u_exact); FunctionPtr beta = Function::vectorize(Function::constant(_beta_x), Function::constant(_beta_y)); FunctionPtr n = Function::normal(); FunctionPtr one_skeleton = Function::meshSkeletonCharacteristic(); // allows restriction to skeleton FunctionPtr sigma_flux_exact = beta * ( n * u_exact - sigma_exact * one_skeleton); this->setSolutionFunction(u, u_exact); this->setSolutionFunction(sigma1, sigma_exact->x()); this->setSolutionFunction(sigma2, sigma_exact->y()); this->setSolutionFunction(_u_hat, u_exact); this->setSolutionFunction(_beta_n_u_minus_sigma_hat, sigma_flux_exact); }