double H1Seminorm( const Mesh& mesh, const CellFilter& filter, const Expr& f, const QuadratureFamily& quad, const WatchFlag& watch) { Expr grad = gradient(mesh.spatialDim()); return L2Norm(mesh, filter, grad*f, quad, watch); }
void Vector :: SetRandom () { INDEX i; for (i = 1; i <= Length(); i++) Elem(i) = rand (); double l2 = L2Norm(); if (l2 > 0) (*this) /= l2; // Elem(i) = 1.0 / double(i); // Elem(i) = drand48(); }
double PatchSideDataNormOpsComplex::RMSNorm( const boost::shared_ptr<pdat::SideData<dcomplex> >& data, const hier::Box& box, const boost::shared_ptr<pdat::SideData<double> >& cvol) const { TBOX_ASSERT(data); double retval = L2Norm(data, box, cvol); if (!cvol) { retval /= sqrt((double)numberOfEntries(data, box)); } else { retval /= sqrt(sumControlVolumes(data, cvol, box)); } return retval; }
double PatchSideDataNormOpsReal<TYPE>::RMSNorm( const boost::shared_ptr<pdat::SideData<TYPE> >& data, const hier::Box& box, const boost::shared_ptr<pdat::SideData<double> >& cvol) const { // SGS TBOX_ASSERT(data); double retval = L2Norm(data, box, cvol); if (!cvol) { retval /= sqrt((double)numberOfEntries(data, box)); } else { TBOX_ASSERT_OBJDIM_EQUALITY2(*data, *cvol); retval /= sqrt(sumControlVolumes(data, cvol, box)); } return retval; }
int main(int argc, char** argv) { try { Sundance::init(&argc, &argv); int np = MPIComm::world().getNProc(); int nx = 48; int ny = 48; int npx = -1; int npy = -1; PartitionedRectangleMesher::balanceXY(np, &npx, &npy); TEUCHOS_TEST_FOR_EXCEPT(npx < 1); TEUCHOS_TEST_FOR_EXCEPT(npy < 1); TEUCHOS_TEST_FOR_EXCEPT(npx * npy != np); MeshType meshType = new BasicSimplicialMeshType(); MeshSource mesher = new PartitionedRectangleMesher(0.0, 1.0, nx, npx, 0.0, 1.0, ny, npy, meshType); Mesh mesh = mesher.getMesh(); CellFilter interior = new MaximalCellFilter(); CellFilter bdry = new BoundaryCellFilter(); /* Create a vector space factory, used to * specify the low-level linear algebra representation */ VectorType<double> vecType = new EpetraVectorType(); /* create a discrete space on the mesh */ DiscreteSpace discreteSpace(mesh, new Lagrange(1), vecType); /* initialize the design, state, and multiplier vectors */ Expr alpha0 = new DiscreteFunction(discreteSpace, 1.0, "alpha0"); Expr u0 = new DiscreteFunction(discreteSpace, 1.0, "u0"); Expr lambda0 = new DiscreteFunction(discreteSpace, 1.0, "lambda0"); /* create symbolic objects for test and unknown functions */ Expr u = new UnknownFunction(new Lagrange(1), "u"); Expr lambda = new UnknownFunction(new Lagrange(1), "lambda"); Expr alpha = new UnknownFunction(new Lagrange(1), "alpha"); /* create symbolic differential operators */ Expr dx = new Derivative(0); Expr dy = new Derivative(1); Expr grad = List(dx, dy); /* create symbolic coordinate functions */ Expr x = new CoordExpr(0); Expr y = new CoordExpr(1); /* create target function */ const double pi = 4.0*atan(1.0); Expr uStar = sin(pi*x)*sin(pi*y); /* create quadrature rules of different orders */ QuadratureFamily q1 = new GaussianQuadrature(1); QuadratureFamily q2 = new GaussianQuadrature(2); QuadratureFamily q4 = new GaussianQuadrature(4); /* Regularization weight */ double R = 0.001; double U0 = 1.0/(1.0 + 4.0*pow(pi,4.0)*R); double A0 = -2.0*pi*pi*U0; /* Form objective function */ Expr reg = Integral(interior, 0.5 * R * alpha*alpha, q2); Expr fit = Integral(interior, 0.5 * pow(u-uStar, 2.0), q4); Expr constraintEqn = Integral(interior, (grad*lambda)*(grad*u) + lambda*alpha, q2); Expr L = reg + fit + constraintEqn; Expr constraintBC = EssentialBC(bdry, lambda*u, q2); Functional Lagrangian(mesh, L, constraintBC, vecType); LinearSolver<double> solver = LinearSolverBuilder::createSolver("amesos.xml"); RCP<ObjectiveBase> obj = rcp(new LinearPDEConstrainedObj( Lagrangian, u, u0, lambda, lambda0, alpha, alpha0, solver)); Vector<double> xInit = obj->getInit(); bool doFDCheck = false; if (doFDCheck) { Out::root() << "Doing FD check of gradient..." << endl; bool fdOK = obj->fdCheck(xInit, 1.0e-6, 2); if (fdOK) { Out::root() << "FD check OK" << endl; } else { Out::root() << "FD check FAILED" << endl; } } RCP<UnconstrainedOptimizerBase> opt = OptBuilder::createOptimizer("basicLMBFGS.xml"); opt->setVerb(2); OptState state = opt->run(obj, xInit); bool ok = true; if (state.status() != Opt_Converged) { Out::root()<< "optimization failed: " << state.status() << endl; TEUCHOS_TEST_FOR_EXCEPT(state.status() != Opt_Converged); } Out::root() << "opt converged: " << state.iter() << " iterations" << endl; Out::root() << "exact solution: U0=" << U0 << " A0=" << A0 << endl; FieldWriter w = new VTKWriter("PoissonSourceInversion"); w.addMesh(mesh); w.addField("u", new ExprFieldWrapper(u0)); w.addField("alpha", new ExprFieldWrapper(alpha0)); w.addField("lambda", new ExprFieldWrapper(lambda0)); w.write(); double uErr = L2Norm(mesh, interior, u0-U0*uStar, q4); double aErr = L2Norm(mesh, interior, alpha0-A0*uStar, q4); Out::root() << "error in u = " << uErr << endl; Out::root() << "error in alpha = " << aErr << endl; double tol = 0.01; Sundance::passFailTest(uErr + aErr, tol); } catch(std::exception& e) { cerr << "main() caught exception: " << e.what() << endl; } Sundance::finalize(); return Sundance::testStatus(); }
int main(int argc, char** argv) { try { int nx = 32; double convTol = 1.0e-8; double lambda = 0.5; Sundance::setOption("nx", nx, "Number of elements"); Sundance::setOption("tol", convTol, "Convergence tolerance"); Sundance::setOption("lambda", lambda, "Lambda (parameter in Bratu's equation)"); Sundance::init(&argc, &argv); Out::root() << "Bratu problem (lambda=" << lambda << ")" << endl; Out::root() << "Newton's method, linearized by hand" << endl << endl; VectorType<double> vecType = new EpetraVectorType(); MeshType meshType = new BasicSimplicialMeshType(); MeshSource mesher = new PartitionedLineMesher(0.0, 1.0, nx, meshType); Mesh mesh = mesher.getMesh(); CellFilter interior = new MaximalCellFilter(); CellFilter sides = new DimensionalCellFilter(mesh.spatialDim()-1); CellFilter left = sides.subset(new CoordinateValueCellPredicate(0, 0.0)); CellFilter right = sides.subset(new CoordinateValueCellPredicate(0, 1.0)); BasisFamily basis = new Lagrange(1); Expr w = new UnknownFunction(basis, "w"); Expr v = new TestFunction(basis, "v"); Expr grad = gradient(1); Expr x = new CoordExpr(0); const double pi = 4.0*atan(1.0); Expr uExact = sin(pi*x); Expr R = pi*pi*uExact - lambda*exp(uExact); QuadratureFamily quad4 = new GaussianQuadrature(4); QuadratureFamily quad2 = new GaussianQuadrature(2); DiscreteSpace discSpace(mesh, basis, vecType); Expr uPrev = new DiscreteFunction(discSpace, 0.5); Expr stepVal = copyDiscreteFunction(uPrev); Expr eqn = Integral(interior, (grad*v)*(grad*w) + (grad*v)*(grad*uPrev) - v*lambda*exp(uPrev)*(1.0+w) - v*R, quad4); Expr h = new CellDiameterExpr(); Expr bc = EssentialBC(left+right, v*(uPrev+w)/h, quad2); LinearProblem prob(mesh, eqn, bc, v, w, vecType); LinearSolver<double> linSolver = LinearSolverBuilder::createSolver("amesos.xml"); Out::root() << "Newton iteration" << endl; int maxIters = 20; Expr soln ; bool converged = false; for (int i=0; i<maxIters; i++) { /* solve for the next u */ prob.solve(linSolver, stepVal); Vector<double> stepVec = getDiscreteFunctionVector(stepVal); double deltaU = stepVec.norm2(); Out::root() << "Iter=" << setw(3) << i << " ||Delta u||=" << setw(20) << deltaU << endl; addVecToDiscreteFunction(uPrev, stepVec); if (deltaU < convTol) { soln = uPrev; converged = true; break; } } TEUCHOS_TEST_FOR_EXCEPTION(!converged, std::runtime_error, "Newton iteration did not converge after " << maxIters << " iterations"); FieldWriter writer = new DSVWriter("HandCodedBratu.dat"); writer.addMesh(mesh); writer.addField("soln", new ExprFieldWrapper(soln[0])); writer.write(); Out::root() << "Converged!" << endl << endl; double L2Err = L2Norm(mesh, interior, soln-uExact, quad4); Out::root() << "L2 Norm of error: " << L2Err << endl; Sundance::passFailTest(L2Err, 1.5/((double) nx*nx)); } catch(std::exception& e) { Sundance::handleException(e); } Sundance::finalize(); }
int main(int argc, char** argv) { try { const double pi = 4.0*atan(1.0); double lambda = 1.25*pi*pi; int nx = 32; int nt = 10; double tFinal = 1.0/lambda; Sundance::setOption("nx", nx, "Number of elements"); Sundance::setOption("nt", nt, "Number of timesteps"); Sundance::setOption("tFinal", tFinal, "Final time"); Sundance::init(&argc, &argv); /* Creation of vector type */ VectorType<double> vecType = new EpetraVectorType(); /* Set up mesh */ MeshType meshType = new BasicSimplicialMeshType(); MeshSource meshSrc = new PartitionedRectangleMesher( 0.0, 1.0, nx, 0.0, 1.0, nx, meshType); Mesh mesh = meshSrc.getMesh(); /* * Specification of cell filters */ CellFilter interior = new MaximalCellFilter(); CellFilter edges = new DimensionalCellFilter(1); CellFilter west = edges.coordSubset(0, 0.0); CellFilter east = edges.coordSubset(0, 1.0); CellFilter south = edges.coordSubset(1, 0.0); CellFilter north = edges.coordSubset(1, 1.0); /* set up test and unknown functions */ BasisFamily basis = new Lagrange(1); Expr u = new UnknownFunction(basis, "u"); Expr v = new TestFunction(basis, "v"); /* set up differential operators */ Expr grad = gradient(2); Expr x = new CoordExpr(0); Expr y = new CoordExpr(1); Expr t = new Sundance::Parameter(0.0); Expr tPrev = new Sundance::Parameter(0.0); DiscreteSpace discSpace(mesh, basis, vecType); Expr uExact = cos(0.5*pi*y)*sin(pi*x)*exp(-lambda*t); L2Projector proj(discSpace, uExact); Expr uPrev = proj.project(); /* * We need a quadrature rule for doing the integrations */ QuadratureFamily quad = new GaussianQuadrature(2); double deltaT = tFinal/nt; Expr gWest = -pi*exp(-lambda*t)*cos(0.5*pi*y); Expr gWestPrev = -pi*exp(-lambda*tPrev)*cos(0.5*pi*y); /* Create the weak form */ Expr eqn = Integral(interior, v*(u-uPrev)/deltaT + 0.5*(grad*v)*(grad*u + grad*uPrev), quad) + Integral(west, -0.5*v*(gWest+gWestPrev), quad); Expr bc = EssentialBC(east + north, v*u, quad); LinearProblem prob(mesh, eqn, bc, v, u, vecType); LinearSolver<double> solver = LinearSolverBuilder::createSolver("amesos.xml"); FieldWriter w0 = new VTKWriter("TransientHeat2D-0"); w0.addMesh(mesh); w0.addField("T", new ExprFieldWrapper(uPrev[0])); w0.write(); for (int i=0; i<nt; i++) { t.setParameterValue((i+1)*deltaT); tPrev.setParameterValue(i*deltaT); Out::root() << "t=" << (i+1)*deltaT << endl; Expr uNext = prob.solve(solver); ostringstream oss; oss << "TransientHeat2D-" << i+1; FieldWriter w = new VTKWriter(oss.str()); w.addMesh(mesh); w.addField("T", new ExprFieldWrapper(uNext[0])); w.write(); updateDiscreteFunction(uNext, uPrev); } double err = L2Norm(mesh, interior, uExact-uPrev, quad); Out::root() << "error norm=" << err << endl; double h = 1.0/(nx-1.0); double tol = 0.1*(pow(h,2.0) + pow(lambda*deltaT, 2.0)); Out::root() << "tol=" << tol << endl; Sundance::passFailTest(err, tol); } catch(std::exception& e) { Sundance::handleException(e); } Sundance::finalize(); return Sundance::testStatus(); }
int main(int argc, char** argv) { try { Sundance::init(&argc, &argv); int np = MPIComm::world().getNProc(); int nx = 64; const double pi = 4.0*atan(1.0); MeshType meshType = new BasicSimplicialMeshType(); MeshSource mesher = new PartitionedLineMesher(0.0, pi, nx, meshType); Mesh mesh = mesher.getMesh(); CellFilter interior = new MaximalCellFilter(); CellFilter bdry = new BoundaryCellFilter(); /* Create a vector space factory, used to * specify the low-level linear algebra representation */ VectorType<double> vecType = new EpetraVectorType(); /* create symbolic coordinate functions */ Expr x = new CoordExpr(0); /* create target function */ double R = 0.01; Expr sx = sin(x); Expr cx = cos(x); Expr ssx = sin(sx); Expr sx2 = sx*sx; Expr cx2 = cx*cx; Expr f = sx2 - sx - ssx; Expr uStar = 2.0*R*(sx2-cx2) + R*sx2*ssx + sx; /* Form exact solution */ Expr uEx = sx; Expr lambdaEx = R*sx2; Expr alphaEx = -lambdaEx/R; /* create a discrete space on the mesh */ BasisFamily bas = new Lagrange(1); DiscreteSpace discreteSpace(mesh, bas, vecType); /* initialize the design, state, and multiplier vectors to constants */ Expr alpha0 = new DiscreteFunction(discreteSpace, 0.25, "alpha0"); Expr u0 = new DiscreteFunction(discreteSpace, 0.5, "u0"); Expr lambda0 = new DiscreteFunction(discreteSpace, 0.25, "lambda0"); /* create symbolic objects for test and unknown functions */ Expr u = new UnknownFunction(bas, "u"); Expr lambda = new UnknownFunction(bas, "lambda"); Expr alpha = new UnknownFunction(bas, "alpha"); /* create symbolic differential operators */ Expr dx = new Derivative(0); Expr grad = dx; /* create quadrature rules of different orders */ QuadratureFamily q1 = new GaussianQuadrature(1); QuadratureFamily q2 = new GaussianQuadrature(2); QuadratureFamily q4 = new GaussianQuadrature(4); /* Form objective function */ Expr reg = Integral(interior, 0.5 * R * alpha*alpha, q2); Expr fit = Integral(interior, 0.5 * pow(u-uStar, 2.0), q4); Expr constraintEqn = Integral(interior, (grad*lambda)*(grad*u) + lambda*(alpha + sin(u) + f), q4); Expr L = reg + fit + constraintEqn; Expr constraintBC = EssentialBC(bdry, lambda*u, q2); Functional Lagrangian(mesh, L, constraintBC, vecType); LinearSolver<double> adjSolver = LinearSolverBuilder::createSolver("amesos.xml"); ParameterXMLFileReader reader("nox-amesos.xml"); ParameterList noxParams = reader.getParameters(); NOXSolver nonlinSolver(noxParams); RCP<PDEConstrainedObjBase> obj = rcp(new NonlinearPDEConstrainedObj( Lagrangian, u, u0, lambda, lambda0, alpha, alpha0, nonlinSolver, adjSolver)); Vector<double> xInit = obj->getInit(); bool doFDCheck = true; if (doFDCheck) { Out::root() << "Doing FD check of gradient..." << endl; bool fdOK = obj->fdCheck(xInit, 1.0e-6, 0); if (fdOK) { Out::root() << "FD check OK" << endl; } else { Out::root() << "FD check FAILED" << endl; TEUCHOS_TEST_FOR_EXCEPT(!fdOK); } } RCP<UnconstrainedOptimizerBase> opt = OptBuilder::createOptimizer("basicLMBFGS.xml"); opt->setVerb(3); OptState state = opt->run(obj, xInit); if (state.status() != Opt_Converged) { Out::root()<< "optimization failed: " << state.status() << endl; TEUCHOS_TEST_FOR_EXCEPT(state.status() != Opt_Converged); } else { Out::root() << "opt converged: " << state.iter() << " iterations" << endl; } FieldWriter w = new MatlabWriter("NonlinControl1D"); w.addMesh(mesh); w.addField("u", new ExprFieldWrapper(u0)); w.addField("alpha", new ExprFieldWrapper(alpha0)); w.addField("lambda", new ExprFieldWrapper(lambda0)); w.write(); double uErr = L2Norm(mesh, interior, u0-uEx, q4); double lamErr = L2Norm(mesh, interior, lambda0-lambdaEx, q4); double aErr = L2Norm(mesh, interior, alpha0-alphaEx, q4); Out::root() << "error in u = " << uErr << endl; Out::root() << "error in lambda = " << lamErr << endl; Out::root() << "error in alpha = " << aErr << endl; double tol = 0.05; Sundance::passFailTest(uErr + lamErr + aErr, tol); } catch(exception& e) { cerr << "main() caught exception: " << e.what() << endl; } Sundance::finalize(); return Sundance::testStatus(); }
/* * perform sparse coding with a learned dictionary. */ double MedSTC::sparse_coding(Document *doc, const int &docIx, Params *param, double* theta, double **s ) { double *sPtr = NULL, *bPtr = NULL, dval = 0; // initialize mu & theta double dThetaRatio = m_dGamma / (m_dLambda + doc->length * m_dGamma); int svmMuIx = docIx * m_nLabelNum; int gndIx = doc->gndlabel * m_nK; int nWrd = 0, xVal = 0, k, n; for ( k=0; k<m_nK; k++ ) { theta[k] = 0; } for ( n=0; n<doc->length; n++ ) { mu_[n] = 0 + m_dPoisOffset; nWrd = doc->words[n]; sPtr = s[n]; bPtr = m_dLogProbW[nWrd]; for ( k=0; k<m_nK; k++ ) { dval = sPtr[k]; if ( dval > 0 ) { mu_[n] += dval * bPtr[k]; theta[k] += dval; } } } // initialize theta for ( k=0; k<m_nK; k++ ) { theta[k] = theta[k] * dThetaRatio; } if ( param->SUPERVISED == 1 ) { if ( param->PRIMALSVM == 1 ) { if ( doc->lossAugLabel != -1 && doc->lossAugLabel != doc->gndlabel ) { int lossIx = doc->lossAugLabel * m_nK; double dHingeRatio = 0.5 * m_dC / (m_dLambda + doc->length * m_dGamma); for ( k=0; k<m_nK; k++ ) { theta[k] += (m_dEta[gndIx+k] - m_dEta[lossIx+k]) * dHingeRatio ; theta[k] = max(0.0, theta[k]); // enforce theta to be non-negative. } } } else { double dHingeRatio = 0.5 / (m_dLambda + doc->length * m_dGamma); for ( k=0; k<m_nK; k++ ) { for ( int m=0; m<m_nLabelNum; m++ ) { int yIx = m * m_nK; theta[k] += m_dMu[svmMuIx+m] * (m_dEta[gndIx+k] - m_dEta[yIx+k]) * dHingeRatio ; } theta[k] = max(0.0, theta[k]); // enforce theta to be non-negative. } } } else; // alternating minimization over theta & s. double dconverged=1, fval, dobj_val, dpreVal=1; double mu, eta, beta, aVal, bVal, cVal, discVal, sqrtDiscVal; double s1, s2; int it = 0; while (((dconverged < 0) || (dconverged > param->VAR_CONVERGED) || (it <= 2)) && (it <= param->VAR_MAX_ITER)) { for ( n=0; n<doc->length; n++ ) { nWrd = doc->words[n]; xVal = doc->counts[n]; bPtr = m_dLogProbW[nWrd]; // optimize over s. sPtr = s[n]; for ( k=0; k<m_nK; k++ ) { sold_[k] = sPtr[k]; beta = bPtr[k]; if ( beta > MIN_BETA ) { mu = mu_[n] - sold_[k] * beta; eta = beta + m_dRho - 2 * m_dGamma * theta[k]; // solve the quadratic equation. aVal = 2 * m_dGamma * beta; bVal = 2 * m_dGamma * mu + beta * eta; cVal = mu * eta - xVal * beta; discVal = bVal * bVal - 4 * aVal * cVal; sqrtDiscVal = sqrt( discVal ); s1 = max(0.0, (sqrtDiscVal - bVal) / (2*aVal)); // non-negative s2 = max(0.0, 0 - (sqrtDiscVal + bVal) / (2*aVal)); // non-negative sPtr[k] = max(s1, s2); } else { // solve the degenerated linear equation sPtr[k] = max(0.0, theta[k] - 0.5*m_dRho/m_dGamma); } // update mu. mu_[n] += (sPtr[k] - sold_[k]) * beta; } // update theta. for ( k=0; k<m_nK; k++ ) { theta[k] += (sPtr[k] - sold_[k]) * dThetaRatio; theta[k] = max(0.0, theta[k]); // enforce theta to be non-negative. } } // check optimality condition. fval = 0; m_dLogLoss = 0; for ( n=0; n<doc->length; n++ ) { double dval = mu_[n]; double dLogLoss = (dval - doc->counts[n] * log(dval)); m_dLogLoss += dLogLoss; fval += dLogLoss + m_dGamma * L2Dist(s[n], theta, m_nK) + m_dRho * L1Norm(s[n], m_nK); } fval += m_dLambda * L2Norm(theta, m_nK); dobj_val = fval; if ( param->SUPERVISED == 1 ) { // compute svm objective if ( param->PRIMALSVM == 1 ) { if ( doc->lossAugLabel != -1 && doc->lossAugLabel != doc->gndlabel ) { // hinge loss int lossIx = doc->lossAugLabel * m_nK; dval = loss( doc->gndlabel, doc->lossAugLabel ); for ( k=0; k<m_nK; k++ ) { dval += theta[k] * (m_dEta[lossIx+k] - m_dEta[gndIx+k]); } dobj_val += m_dC * dval; } } else { for ( int m=0; m<m_nLabelNum; m++ ) { int yIx = m * m_nK; dval = loss( doc->gndlabel, m ); for ( k=0; k<m_nK; k++ ) { dval += theta[k] * (m_dEta[yIx+k] - m_dEta[gndIx+k]); } dobj_val += m_dMu[svmMuIx+m] * dval; } } } dconverged = (dpreVal - dobj_val) / dpreVal; dpreVal = dobj_val; it ++; } return fval; }
int main(int argc, char** argv) { try { int nx = 32; double convTol = 1.0e-8; double lambda = 0.5; Sundance::setOption("nx", nx, "Number of elements"); Sundance::setOption("tol", convTol, "Convergence tolerance"); Sundance::setOption("lambda", lambda, "Lambda (parameter in Bratu's equation)"); Sundance::init(&argc, &argv); Out::root() << "Bratu problem (lambda=" << lambda << ")" << endl; Out::root() << "Fixed-point iteration" << endl << endl; VectorType<double> vecType = new EpetraVectorType(); MeshType meshType = new BasicSimplicialMeshType(); MeshSource mesher = new PartitionedLineMesher(0.0, 1.0, nx, meshType); Mesh mesh = mesher.getMesh(); CellFilter interior = new MaximalCellFilter(); CellFilter sides = new DimensionalCellFilter(mesh.spatialDim()-1); CellFilter left = sides.subset(new CoordinateValueCellPredicate(0, 0.0)); CellFilter right = sides.subset(new CoordinateValueCellPredicate(0, 1.0)); BasisFamily basis = new Lagrange(1); Expr u = new UnknownFunction(basis, "u"); Expr v = new TestFunction(basis, "v"); Expr grad = gradient(1); Expr x = new CoordExpr(0); const double pi = 4.0*atan(1.0); Expr uExact = sin(pi*x); Expr R = pi*pi*uExact - lambda*exp(uExact); QuadratureFamily quad4 = new GaussianQuadrature(4); QuadratureFamily quad2 = new GaussianQuadrature(2); DiscreteSpace discSpace(mesh, basis, vecType); Expr uPrev = new DiscreteFunction(discSpace, 0.5); Expr uCur = copyDiscreteFunction(uPrev); Expr eqn = Integral(interior, (grad*u)*(grad*v) - v*lambda*exp(uPrev) - v*R, quad4); Expr h = new CellDiameterExpr(); Expr bc = EssentialBC(left+right, v*u/h, quad4); LinearProblem prob(mesh, eqn, bc, v, u, vecType); Expr normSqExpr = Integral(interior, pow(u-uPrev, 2.0), quad2); Functional normSqFunc(mesh, normSqExpr, vecType); FunctionalEvaluator normSqEval = normSqFunc.evaluator(u, uCur); LinearSolver<double> linSolver = LinearSolverBuilder::createSolver("amesos.xml"); Out::root() << "Fixed-point iteration" << endl; int maxIters = 20; Expr soln ; bool converged = false; for (int i=0; i<maxIters; i++) { /* solve for the next u */ prob.solve(linSolver, uCur); /* evaluate the norm of (uCur-uPrev) using * the FunctionalEvaluator defined above */ double deltaU = sqrt(normSqEval.evaluate()); Out::root() << "Iter=" << setw(3) << i << " ||Delta u||=" << setw(20) << deltaU << endl; /* check for convergence */ if (deltaU < convTol) { soln = uCur; converged = true; break; } /* get the vector from the current discrete function */ Vector<double> uVec = getDiscreteFunctionVector(uCur); /* copy the vector into the previous discrete function */ setDiscreteFunctionVector(uPrev, uVec); } TEUCHOS_TEST_FOR_EXCEPTION(!converged, std::runtime_error, "Fixed point iteration did not converge after " << maxIters << " iterations"); FieldWriter writer = new DSVWriter("FixedPointBratu.dat"); writer.addMesh(mesh); writer.addField("soln", new ExprFieldWrapper(soln[0])); writer.write(); Out::root() << "Converged!" << endl << endl; double L2Err = L2Norm(mesh, interior, soln-uExact, quad4); Out::root() << "L2 Norm of error: " << L2Err << endl; Sundance::passFailTest(L2Err, 1.5/((double) nx*nx)); } catch(exception& e) { Sundance::handleException(e); } Sundance::finalize(); }
int main(int argc, char** argv) { try { int nx = 32; double convTol = 1.0e-8; double lambda = 0.5; Sundance::setOption("nx", nx, "Number of elements"); Sundance::setOption("tol", convTol, "Convergence tolerance"); Sundance::setOption("lambda", lambda, "Lambda (parameter in Bratu's equation)"); Sundance::init(&argc, &argv); Out::root() << "Bratu problem (lambda=" << lambda << ")" << endl; Out::root() << "Newton's method with automated linearization" << endl << endl; VectorType<double> vecType = new EpetraVectorType(); MeshType meshType = new BasicSimplicialMeshType(); MeshSource mesher = new PartitionedLineMesher(0.0, 1.0, nx, meshType); Mesh mesh = mesher.getMesh(); CellFilter interior = new MaximalCellFilter(); CellFilter sides = new DimensionalCellFilter(mesh.spatialDim()-1); CellFilter left = sides.subset(new CoordinateValueCellPredicate(0, 0.0)); CellFilter right = sides.subset(new CoordinateValueCellPredicate(0, 1.0)); BasisFamily basis = new Lagrange(1); Expr u = new UnknownFunction(basis, "w"); Expr v = new TestFunction(basis, "v"); Expr grad = gradient(1); Expr x = new CoordExpr(0); const double pi = 4.0*atan(1.0); Expr uExact = sin(pi*x); Expr R = pi*pi*uExact - lambda*exp(uExact); QuadratureFamily quad4 = new GaussianQuadrature(4); QuadratureFamily quad2 = new GaussianQuadrature(2); DiscreteSpace discSpace(mesh, basis, vecType); Expr uPrev = new DiscreteFunction(discSpace, 0.5); Expr eqn = Integral(interior, (grad*v)*(grad*u) - v*lambda*exp(u) - v*R, quad4); Expr h = new CellDiameterExpr(); Expr bc = EssentialBC(left+right, v*u/h, quad2); NonlinearProblem prob(mesh, eqn, bc, v, u, uPrev, vecType); NonlinearSolver<double> solver = NonlinearSolverBuilder::createSolver("playa-newton-amesos.xml"); Out::root() << "Newton solve" << endl; SolverState<double> state = prob.solve(solver); TEUCHOS_TEST_FOR_EXCEPTION(state.finalState() != SolveConverged, std::runtime_error, "Nonlinear solve failed to converge: message=" << state.finalMsg()); Expr soln = uPrev; FieldWriter writer = new DSVWriter("AutoLinearizedBratu.dat"); writer.addMesh(mesh); writer.addField("soln", new ExprFieldWrapper(soln[0])); writer.write(); Out::root() << "Converged!" << endl << endl; double L2Err = L2Norm(mesh, interior, soln-uExact, quad4); Out::root() << "L2 Norm of error: " << L2Err << endl; Sundance::passFailTest(L2Err, 1.5/((double) nx*nx)); } catch(std::exception& e) { Sundance::handleException(e); } Sundance::finalize(); return Sundance::testStatus(); }
void FluxTrace<D>::T_CalcElementMatrix (const FiniteElement & base_fel, const ElementTransformation & eltrans, FlatMatrix<SCAL> elmat, LocalHeap & lh) const { const CompoundFiniteElement & cfel // product space = dynamic_cast<const CompoundFiniteElement&> (base_fel); const HDivFiniteElement<D> & fel_q = // q space dynamic_cast<const HDivFiniteElement<D>& > (cfel[GetInd1()]); const ScalarFiniteElement<D> & fel_e = // e space dynamic_cast<const ScalarFiniteElement<D>&> (cfel[GetInd2()]); elmat = SCAL(0.0); IntRange rq = cfel.GetRange(GetInd1()); IntRange re = cfel.GetRange(GetInd2()); int ndofq = rq.Size(); int ndofe = re.Size(); FlatMatrix<SCAL> submat(ndofe,ndofq,lh); FlatMatrixFixWidth<D> shapeq(ndofq,lh); // q-basis (vec) values FlatVector<> shapee(ndofe,lh); // e-basis basis ELEMENT_TYPE eltype // get the type of element: = fel_q.ElementType(); // ET_TRIG in 2d, ET_TET in 3d. // transform facet integration points to volume integration points Facet2ElementTrafo transform(eltype); int nfa = ElementTopology::GetNFacets(eltype); /* nfa = number of facets of an element */ submat = 0.0; for(int k = 0; k<nfa; k++) { // type of geometry of k-th facet ELEMENT_TYPE eltype_facet = ElementTopology::GetFacetType(eltype, k); const IntegrationRule & facet_ir = SelectIntegrationRule (eltype_facet, fel_q.Order()+fel_e.Order()); // reference element normal vector FlatVec<D> normal_ref = ElementTopology::GetNormals(eltype) [k]; for (int l = 0; l < facet_ir.GetNIP(); l++) { // map 1D facet points to volume integration points IntegrationPoint volume_ip = transform(k, facet_ir[l]); MappedIntegrationPoint<D,D> mip (volume_ip, eltrans); // compute normal on physcial element Mat<D> inv_jac = mip.GetJacobianInverse(); double det = mip.GetJacobiDet(); Vec<D> normal = fabs(det) * Trans(inv_jac) * normal_ref; double len = L2Norm(normal); normal /= len; double weight = facet_ir[l].Weight()*len; // mapped H(div) basis fn values and DG fn (no need to map) values fel_q.CalcMappedShape(mip,shapeq); fel_e.CalcShape(volume_ip,shapee); // evaluate coefficient SCAL dd = coeff_d -> T_Evaluate<SCAL>(mip); // [ndofe x 1] [ndofq x D] * [D x 1] submat += (dd*weight) * shapee * Trans( shapeq * normal ) ; } } elmat.Rows(re).Cols(rq) += submat; elmat.Rows(rq).Cols(re) += Conj(Trans(submat)); }
void NeumannVolume<D> :: T_CalcElementVector (const FiniteElement & base_fel, const ElementTransformation & eltrans, FlatVector<SCAL> elvec, LocalHeap & lh) const { const CompoundFiniteElement & cfel = dynamic_cast<const CompoundFiniteElement&> (base_fel); const ScalarFiniteElement<D> & fel = dynamic_cast<const ScalarFiniteElement<D>&> (cfel[indx]); FlatVector<> ushape(fel.GetNDof(), lh); elvec = SCAL(0); IntRange re = cfel.GetRange(indx); int ndofe = re.Size(); FlatVector<SCAL> subvec(ndofe,lh); subvec = SCAL(0); const IntegrationRule ir(fel.ElementType(), 2*fel.Order()); ELEMENT_TYPE eltype = base_fel.ElementType(); int nfacet = ElementTopology::GetNFacets(eltype); Facet2ElementTrafo transform(eltype); FlatVector< Vec<D> > normals = ElementTopology::GetNormals<D>(eltype); const MeshAccess & ma = *(const MeshAccess*)eltrans.GetMesh(); Array<int> fnums, sels; ma.GetElFacets (eltrans.GetElementNr(), fnums); for (int k = 0; k < nfacet; k++) { ma.GetFacetSurfaceElements (fnums[k], sels); // if interior element, then do nothing: if (sels.Size() == 0) continue; // else: Vec<D> normal_ref = normals[k]; ELEMENT_TYPE etfacet = ElementTopology::GetFacetType (eltype, k); IntegrationRule ir_facet(etfacet, 2*fel.Order()); // map the facet integration points to volume reference elt ipts IntegrationRule & ir_facet_vol = transform(k, ir_facet, lh); // ... and further to the physical element MappedIntegrationRule<D,D> mir(ir_facet_vol, eltrans, lh); for (int i = 0 ; i < ir_facet_vol.GetNIP(); i++) { SCAL G[3] ; G[0] = coeff_Gx -> T_Evaluate<SCAL>(mir[i]); G[1] = coeff_Gy -> T_Evaluate<SCAL>(mir[i]); if (D==3) G[2] = coeff_Gz -> T_Evaluate<SCAL>(mir[i]); FlatVector<SCAL> Gval(D,lh); for (int dd=0; dd<D; dd++) Gval[dd] = G[dd]; SCAL g = coeff_g -> T_Evaluate<SCAL>(mir[i]); // this is contrived to get the surface measure in "len" Mat<D> inv_jac = mir[i].GetJacobianInverse(); double det = mir[i].GetMeasure(); Vec<D> normal = det * Trans (inv_jac) * normal_ref; double len = L2Norm (normal); SCAL gg = (InnerProduct(Gval,normal) + g*len) * ir_facet[i].Weight(); fel.CalcShape (ir_facet_vol[i], ushape); subvec += gg * ushape; } } elvec.Rows(re) += subvec; }
void RobinVolume<D> :: T_CalcElementMatrix (const FiniteElement & base_fel, const ElementTransformation & eltrans, FlatMatrix<SCAL> elmat, LocalHeap & lh) const { ELEMENT_TYPE eltype = base_fel.ElementType(); const CompoundFiniteElement & cfel // product space = dynamic_cast<const CompoundFiniteElement&> (base_fel); // note how we do NOT refer to D-1 elements here: const ScalarFiniteElement<D> & fel_u = // u space dynamic_cast<const ScalarFiniteElement<D>&> (cfel[GetInd1()]); const ScalarFiniteElement<D> & fel_e = // e space dynamic_cast<const ScalarFiniteElement<D>&> (cfel[GetInd2()]); elmat = SCAL(0); IntRange ru = cfel.GetRange(GetInd1()); IntRange re = cfel.GetRange(GetInd2()); int ndofe = re.Size(); int ndofu = ru.Size(); FlatVector<> ushape(fel_u.GetNDof(), lh); FlatVector<> eshape(fel_e.GetNDof(), lh); FlatMatrix<SCAL> submat(ndofe,ndofu,lh); submat = SCAL(0); int nfacet = ElementTopology::GetNFacets(eltype); Facet2ElementTrafo transform(eltype); FlatVector< Vec<D> > normals = ElementTopology::GetNormals<D>(eltype); const MeshAccess & ma = *(const MeshAccess*)eltrans.GetMesh(); Array<int> fnums, sels; ma.GetElFacets (eltrans.GetElementNr(), fnums); for (int k = 0; k < nfacet; k++) { ma.GetFacetSurfaceElements (fnums[k], sels); // if interior element, then do nothing: if (sels.Size() == 0) continue; // else: Vec<D> normal_ref = normals[k]; ELEMENT_TYPE etfacet=ElementTopology::GetFacetType(eltype, k); IntegrationRule ir_facet(etfacet, fel_e.Order()+fel_u.Order()); // map the facet integration points to volume reference elt ipts IntegrationRule & ir_facet_vol = transform(k, ir_facet, lh); // ... and further to the physical element MappedIntegrationRule<D,D> mir(ir_facet_vol, eltrans, lh); for (int i = 0 ; i < ir_facet_vol.GetNIP(); i++) { SCAL val = coeff_c->T_Evaluate<SCAL> (mir[i]); // this is contrived to get the surface measure in "len" Mat<D> inv_jac = mir[i].GetJacobianInverse(); double det = mir[i].GetMeasure(); Vec<D> normal = det * Trans (inv_jac) * normal_ref; double len = L2Norm (normal); val *= len * ir_facet[i].Weight(); fel_u.CalcShape (ir_facet_vol[i], ushape); fel_e.CalcShape (ir_facet_vol[i], eshape); submat += val * eshape * Trans(ushape); } } elmat.Rows(re).Cols(ru) += submat; if (GetInd1() != GetInd2()) elmat.Rows(ru).Cols(re) += Conj(Trans(submat)); }
void TraceTrace<D>::T_CalcElementMatrix (const FiniteElement & base_fel, const ElementTransformation & eltrans, FlatMatrix<SCAL> elmat, LocalHeap & lh) const { const CompoundFiniteElement & cfel // product space = dynamic_cast<const CompoundFiniteElement&> (base_fel); const ScalarFiniteElement<D> & fel_u = // u space dynamic_cast<const ScalarFiniteElement<D>&> (cfel[GetInd1()]); const ScalarFiniteElement<D> & fel_e = // e space dynamic_cast<const ScalarFiniteElement<D>&> (cfel[GetInd2()]); elmat = SCAL(0.0); IntRange ru = cfel.GetRange(GetInd1()); IntRange re = cfel.GetRange(GetInd2()); int ndofe = re.Size(); int ndofu = ru.Size(); FlatVector<> shapee(ndofe,lh); FlatVector<> shapeu(ndofu,lh); FlatMatrix<SCAL> submat(ndofe,ndofu, lh); submat = SCAL(0.0); ELEMENT_TYPE eltype = fel_u.ElementType(); Facet2ElementTrafo transform(eltype); int nfa = ElementTopology :: GetNFacets(eltype); for(int k = 0; k<nfa; k++) { // type of geometry of k-th facet ELEMENT_TYPE eltype_facet = ElementTopology::GetFacetType(eltype, k); const IntegrationRule & facet_ir = SelectIntegrationRule (eltype_facet, fel_u.Order()+fel_e.Order()); // reference element normal vector FlatVec<D> normal_ref = ElementTopology::GetNormals(eltype) [k]; for (int l = 0; l < facet_ir.GetNIP(); l++) { // map 1D facet points to volume integration points IntegrationPoint volume_ip = transform(k, facet_ir[l]); MappedIntegrationPoint<D,D> mip (volume_ip, eltrans); // compute normal on physcial element Mat<D> inv_jac = mip.GetJacobianInverse(); double det = mip.GetJacobiDet(); Vec<D> normal = fabs(det) * Trans(inv_jac) * normal_ref; double len = L2Norm(normal); normal /= len; double weight = facet_ir[l].Weight()*len; fel_e.CalcShape(volume_ip,shapee); fel_u.CalcShape(volume_ip,shapeu); SCAL cc = coeff_c -> T_Evaluate<SCAL>(mip); // [ndofe x 1] [1 x ndofu] submat += (cc*weight) * shapee * Trans(shapeu); } } elmat.Rows(re).Cols(ru) += submat; if (GetInd1() != GetInd2()) elmat.Rows(ru).Cols(re) += Conj(Trans(submat)); }