int main(int argc, char *argv[]) { // This little trick lets us print to std::cout only if a (dummy) command-line argument is provided. int iprint = argc - 1; Teuchos::RCP<std::ostream> outStream; Teuchos::oblackholestream bhs; // outputs nothing /*** Initialize communicator. ***/ Teuchos::GlobalMPISession mpiSession (&argc, &argv, &bhs); Teuchos::RCP<const Teuchos::Comm<int> > comm = Tpetra::DefaultPlatform::getDefaultPlatform().getComm(); const int myRank = comm->getRank(); if ((iprint > 0) && (myRank == 0)) { outStream = Teuchos::rcp(&std::cout, false); } else { outStream = Teuchos::rcp(&bhs, false); } int errorFlag = 0; // *** Example body. try { /*** Read in XML input ***/ std::string filename = "input.xml"; Teuchos::RCP<Teuchos::ParameterList> parlist = Teuchos::rcp( new Teuchos::ParameterList() ); Teuchos::updateParametersFromXmlFile( filename, parlist.ptr() ); /*** Initialize main data structure. ***/ Teuchos::RCP<ElasticitySIMPOperators<RealT> > data = Teuchos::rcp(new ElasticitySIMPOperators<RealT>(comm, parlist, outStream)); /*** Build vectors and dress them up as ROL vectors. ***/ Teuchos::RCP<const Tpetra::Map<> > vecmap_u = data->getDomainMapA(); Teuchos::RCP<const Tpetra::Map<> > vecmap_z = data->getCellMap(); Teuchos::RCP<Tpetra::MultiVector<> > u_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_u, 1, true)); Teuchos::RCP<Tpetra::MultiVector<> > z_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_z, 1, true)); Teuchos::RCP<Tpetra::MultiVector<> > du_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_u, 1, true)); Teuchos::RCP<Tpetra::MultiVector<> > dw_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_u, 1, true)); Teuchos::RCP<Tpetra::MultiVector<> > dz_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_z, 1, true)); Teuchos::RCP<Tpetra::MultiVector<> > dz2_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_z, 1, true)); Teuchos::RCP<std::vector<RealT> > vscale_rcp = Teuchos::rcp(new std::vector<RealT>(1, 0)); Teuchos::RCP<std::vector<RealT> > vc_rcp = Teuchos::rcp(new std::vector<RealT>(1, 0)); Teuchos::RCP<std::vector<RealT> > vc_lam_rcp = Teuchos::rcp(new std::vector<RealT>(1, 0)); // Set all values to 1 in u, z. u_rcp->putScalar(1.0); // Set z to gray solution. RealT volFrac = parlist->sublist("ElasticityTopoOpt").get("Volume Fraction", 0.5), one(1), two(2); z_rcp->putScalar(volFrac); (*vscale_rcp)[0] = one/std::pow(static_cast<RealT>(z_rcp->getGlobalLength())*(one-volFrac),two); //test /*data->updateMaterialDensity (z_rcp); Teuchos::RCP<Tpetra::MultiVector<RealT> > rhs = Teuchos::rcp(new Tpetra::MultiVector<> (data->getVecF()->getMap(), 1, true)); data->ApplyMatAToVec(rhs, u_rcp); data->outputTpetraVector(rhs, "KU0.txt"); data->ApplyInverseJacobian1ToVec(u_rcp, rhs, false); data->outputTpetraVector(u_rcp, "KKU0.txt"); data->ApplyJacobian1ToVec(rhs, u_rcp); data->outputTpetraVector(rhs, "KU1.txt"); data->ApplyInverseJacobian1ToVec(u_rcp, rhs, false); data->outputTpetraVector(u_rcp, "KKU1.txt"); */ //u_rcp->putScalar(1.0); //z_rcp->putScalar(1.0); // Randomize d vectors. du_rcp->randomize(); dw_rcp->randomize(); dz_rcp->randomize(); dz2_rcp->randomize(); // Create ROL::TpetraMultiVectors. Teuchos::RCP<ROL::Vector<RealT> > up = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(u_rcp)); Teuchos::RCP<ROL::Vector<RealT> > zp = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(z_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dup = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(du_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dwp = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(dw_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dzp = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(dz_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dz2p = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(dz2_rcp)); Teuchos::RCP<ROL::Vector<RealT> > vcp = Teuchos::rcp(new ROL::PrimalScaledStdVector<RealT>(vc_rcp,vscale_rcp)); Teuchos::RCP<ROL::Vector<RealT> > vc_lamp = Teuchos::rcp(new ROL::DualScaledStdVector<RealT>(vc_lam_rcp,vscale_rcp)); // Create ROL SimOpt vectors. ROL::Vector_SimOpt<RealT> x(up,zp); ROL::Vector_SimOpt<RealT> d(dup,dzp); ROL::Vector_SimOpt<RealT> d2(dwp,dz2p); /*** Build objective function, constraint and reduced objective function. ***/ Teuchos::RCP<ROL::Objective_SimOpt<RealT> > obj = Teuchos::rcp(new Objective_PDEOPT_ElasticitySIMP<RealT>(data, parlist)); Teuchos::RCP<ROL::EqualityConstraint_SimOpt<RealT> > con = Teuchos::rcp(new EqualityConstraint_PDEOPT_ElasticitySIMP<RealT>(data, parlist)); Teuchos::RCP<ROL::Reduced_Objective_SimOpt<RealT> > objReduced = Teuchos::rcp(new ROL::Reduced_Objective_SimOpt<RealT>(obj, con, up, dwp)); Teuchos::RCP<ROL::EqualityConstraint<RealT> > volcon = Teuchos::rcp(new EqualityConstraint_PDEOPT_ElasticitySIMP_Volume<RealT>(data, parlist)); /*** Build bound constraint ***/ Teuchos::RCP<Tpetra::MultiVector<> > lo_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_z, 1, true)); Teuchos::RCP<Tpetra::MultiVector<> > hi_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_z, 1, true)); lo_rcp->putScalar(0.0); hi_rcp->putScalar(1.0); Teuchos::RCP<ROL::Vector<RealT> > lop = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(lo_rcp)); Teuchos::RCP<ROL::Vector<RealT> > hip = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(hi_rcp)); Teuchos::RCP<ROL::BoundConstraint<RealT> > bnd = Teuchos::rcp(new ROL::BoundConstraint<RealT>(lop,hip)); /*** Check functional interface. ***/ *outStream << "Checking Objective:" << "\n"; obj->checkGradient(x,d,true,*outStream); obj->checkHessVec(x,d,true,*outStream); obj->checkHessSym(x,d,d2,true,*outStream); *outStream << "Checking Constraint:" << "\n"; con->checkAdjointConsistencyJacobian(*dup,d,x,true,*outStream); con->checkAdjointConsistencyJacobian_1(*dwp, *dup, *up, *zp, true, *outStream); con->checkAdjointConsistencyJacobian_2(*dwp, *dzp, *up, *zp, true, *outStream); con->checkInverseJacobian_1(*up,*up,*up,*zp,true,*outStream); con->checkInverseAdjointJacobian_1(*up,*up,*up,*zp,true,*outStream); con->checkApplyJacobian(x,d,*up,true,*outStream); con->checkApplyAdjointHessian(x,*dup,d,x,true,*outStream); *outStream << "Checking Reduced Objective:" << "\n"; objReduced->checkGradient(*zp,*dzp,true,*outStream); objReduced->checkHessVec(*zp,*dzp,true,*outStream); *outStream << "Checking Volume Constraint:" << "\n"; volcon->checkAdjointConsistencyJacobian(*vcp,*dzp,*zp,true,*outStream); volcon->checkApplyJacobian(*zp,*dzp,*vcp,true,*outStream); volcon->checkApplyAdjointHessian(*zp,*vcp,*dzp,*zp,true,*outStream); /*** Run optimization ***/ ROL::AugmentedLagrangian<RealT> augLag(objReduced,volcon,*vc_lamp,1.0,*zp,*vcp,*parlist); ROL::Algorithm<RealT> algo("Augmented Lagrangian",*parlist,false); algo.run(*zp,*vc_lamp,augLag,*volcon,*bnd,true,*outStream); //ROL::MoreauYosidaPenalty<RealT> MYpen(objReduced,bnd,*zp,1.0); //ROL::Algorithm<RealT> algo("Moreau-Yosida Penalty",*parlist,false); //algo.run(*zp,*vc_lamp,MYpen,*volcon,*bnd,true,*outStream); data->outputTpetraVector(z_rcp, "density.txt"); data->outputTpetraVector(u_rcp, "state.txt"); } catch (std::logic_error err) { *outStream << err.what() << "\n"; errorFlag = -1000; }; // end try if (errorFlag != 0) std::cout << "End Result: TEST FAILED\n"; else std::cout << "End Result: TEST PASSED\n"; return 0; }
int main(int argc, char *argv[]) { // This little trick lets us print to std::cout only if a (dummy) command-line argument is provided. int iprint = argc - 1; Teuchos::RCP<std::ostream> outStream; Teuchos::oblackholestream bhs; // outputs nothing /*** Initialize communicator. ***/ Teuchos::GlobalMPISession mpiSession (&argc, &argv, &bhs); Teuchos::RCP<const Teuchos::Comm<int> > comm = Tpetra::DefaultPlatform::getDefaultPlatform().getComm(); const int myRank = comm->getRank(); if ((iprint > 0) && (myRank == 0)) { outStream = Teuchos::rcp(&std::cout, false); } else { outStream = Teuchos::rcp(&bhs, false); } int errorFlag = 0; // *** Example body. try { RealT tol(1e-8), one(1); /*** Read in XML input ***/ std::string filename = "input.xml"; Teuchos::RCP<Teuchos::ParameterList> parlist = Teuchos::rcp( new Teuchos::ParameterList() ); Teuchos::updateParametersFromXmlFile( filename, parlist.ptr() ); // Retrieve parameters. const RealT domainWidth = parlist->sublist("Geometry").get("Width", 1.0); const RealT domainHeight = parlist->sublist("Geometry").get("Height", 1.0); const RealT volFraction = parlist->sublist("Problem").get("Volume Fraction", 0.4); const RealT objFactor = parlist->sublist("Problem").get("Objective Scaling", 1e-4); /*** Initialize main data structure. ***/ Teuchos::RCP<MeshManager<RealT> > meshMgr = Teuchos::rcp(new MeshManager_TopoOpt<RealT>(*parlist)); // Initialize PDE describing elasticity equations. Teuchos::RCP<PDE_TopoOpt<RealT> > pde = Teuchos::rcp(new PDE_TopoOpt<RealT>(*parlist)); Teuchos::RCP<ROL::EqualityConstraint_SimOpt<RealT> > con = Teuchos::rcp(new PDE_Constraint<RealT>(pde,meshMgr,comm,*parlist,*outStream)); // Initialize the filter PDE. Teuchos::RCP<PDE_Filter<RealT> > pdeFilter = Teuchos::rcp(new PDE_Filter<RealT>(*parlist)); Teuchos::RCP<ROL::EqualityConstraint_SimOpt<RealT> > conFilter = Teuchos::rcp(new Linear_PDE_Constraint<RealT>(pdeFilter,meshMgr,comm,*parlist,*outStream)); // Cast the constraint and get the assembler. Teuchos::RCP<PDE_Constraint<RealT> > pdecon = Teuchos::rcp_dynamic_cast<PDE_Constraint<RealT> >(con); Teuchos::RCP<Assembler<RealT> > assembler = pdecon->getAssembler(); con->setSolveParameters(*parlist); // Create state vector. Teuchos::RCP<Tpetra::MultiVector<> > u_rcp = assembler->createStateVector(); u_rcp->randomize(); Teuchos::RCP<ROL::Vector<RealT> > up = Teuchos::rcp(new PDE_PrimalSimVector<RealT>(u_rcp,pde,assembler,*parlist)); Teuchos::RCP<Tpetra::MultiVector<> > p_rcp = assembler->createStateVector(); p_rcp->randomize(); Teuchos::RCP<ROL::Vector<RealT> > pp = Teuchos::rcp(new PDE_PrimalSimVector<RealT>(p_rcp,pde,assembler,*parlist)); // Create control vector. Teuchos::RCP<Tpetra::MultiVector<> > z_rcp = assembler->createControlVector(); //z_rcp->randomize(); z_rcp->putScalar(volFraction); //z_rcp->putScalar(0); Teuchos::RCP<ROL::Vector<RealT> > zp = Teuchos::rcp(new PDE_PrimalOptVector<RealT>(z_rcp,pde,assembler,*parlist)); // Create residual vector. Teuchos::RCP<Tpetra::MultiVector<> > r_rcp = assembler->createResidualVector(); r_rcp->putScalar(0.0); Teuchos::RCP<ROL::Vector<RealT> > rp = Teuchos::rcp(new PDE_DualSimVector<RealT>(r_rcp,pde,assembler,*parlist)); // Create state direction vector. Teuchos::RCP<Tpetra::MultiVector<> > du_rcp = assembler->createStateVector(); du_rcp->randomize(); //du_rcp->putScalar(0); Teuchos::RCP<ROL::Vector<RealT> > dup = Teuchos::rcp(new PDE_PrimalSimVector<RealT>(du_rcp,pde,assembler,*parlist)); // Create control direction vector. Teuchos::RCP<Tpetra::MultiVector<> > dz_rcp = assembler->createControlVector(); dz_rcp->randomize(); dz_rcp->scale(0.01); Teuchos::RCP<ROL::Vector<RealT> > dzp = Teuchos::rcp(new PDE_PrimalOptVector<RealT>(dz_rcp,pde,assembler,*parlist)); // Create control test vector. Teuchos::RCP<Tpetra::MultiVector<> > rz_rcp = assembler->createControlVector(); rz_rcp->randomize(); Teuchos::RCP<ROL::Vector<RealT> > rzp = Teuchos::rcp(new PDE_PrimalOptVector<RealT>(rz_rcp,pde,assembler,*parlist)); Teuchos::RCP<Tpetra::MultiVector<> > dualu_rcp = assembler->createStateVector(); Teuchos::RCP<ROL::Vector<RealT> > dualup = Teuchos::rcp(new PDE_DualSimVector<RealT>(dualu_rcp,pde,assembler,*parlist)); Teuchos::RCP<Tpetra::MultiVector<> > dualz_rcp = assembler->createControlVector(); Teuchos::RCP<ROL::Vector<RealT> > dualzp = Teuchos::rcp(new PDE_DualOptVector<RealT>(dualz_rcp,pde,assembler,*parlist)); // Create ROL SimOpt vectors. ROL::Vector_SimOpt<RealT> x(up,zp); ROL::Vector_SimOpt<RealT> d(dup,dzp); // Initialize "filtered" of "unfiltered" constraint. Teuchos::RCP<ROL::EqualityConstraint_SimOpt<RealT> > pdeWithFilter; bool useFilter = parlist->sublist("Problem").get("Use Filter", true); if (useFilter) { pdeWithFilter = Teuchos::rcp(new ROL::CompositeEqualityConstraint_SimOpt<RealT>(con, conFilter, *rp, *rp, *up, *zp, *zp)); } else { pdeWithFilter = con; } pdeWithFilter->setSolveParameters(*parlist); // Initialize compliance objective function. Teuchos::ParameterList list(*parlist); list.sublist("Vector").sublist("Sim").set("Use Riesz Map",true); list.sublist("Vector").sublist("Sim").set("Lump Riesz Map",false); // Has state Riesz map enabled for mesh-independent compliance scaling. Teuchos::RCP<Tpetra::MultiVector<> > f_rcp = assembler->createResidualVector(); f_rcp->putScalar(0.0); Teuchos::RCP<ROL::Vector<RealT> > fp = Teuchos::rcp(new PDE_DualSimVector<RealT>(f_rcp,pde,assembler,list)); up->zero(); con->value(*fp, *up, *zp, tol); RealT objScaling = objFactor, fnorm2 = fp->dot(*fp); if (fnorm2 > 1e2*ROL::ROL_EPSILON<RealT>()) { objScaling /= fnorm2; } u_rcp->randomize(); std::vector<Teuchos::RCP<QoI<RealT> > > qoi_vec(1,Teuchos::null); qoi_vec[0] = Teuchos::rcp(new QoI_TopoOpt<RealT>(pde->getFE(), pde->getLoad(), pde->getFieldHelper(), objScaling)); Teuchos::RCP<ROL::Objective_SimOpt<RealT> > obj = Teuchos::rcp(new PDE_Objective<RealT>(qoi_vec,assembler)); // Initialize volume constraint, Teuchos::RCP<QoI<RealT> > qoi_vol = Teuchos::rcp(new QoI_Volume_TopoOpt<RealT>(pde->getFE(),pde->getFieldHelper(),*parlist)); Teuchos::RCP<IntegralOptConstraint<RealT> > vcon = Teuchos::rcp(new IntegralOptConstraint<RealT>(qoi_vol,assembler)); // Create volume constraint vector and set to zero RealT vecScaling = one / std::pow(domainWidth*domainHeight*(one-volFraction), 2); Teuchos::RCP<std::vector<RealT> > scalevec_rcp = Teuchos::rcp(new std::vector<RealT>(1,vecScaling)); Teuchos::RCP<std::vector<RealT> > c1_rcp = Teuchos::rcp(new std::vector<RealT>(1,0)); Teuchos::RCP<ROL::Vector<RealT> > c1p = Teuchos::rcp(new ROL::PrimalScaledStdVector<RealT>(c1_rcp, scalevec_rcp)); Teuchos::RCP<std::vector<RealT> > c2_rcp = Teuchos::rcp(new std::vector<RealT>(1,1)); Teuchos::RCP<ROL::Vector<RealT> > c2p = Teuchos::rcp(new ROL::DualScaledStdVector<RealT>(c2_rcp, scalevec_rcp)); // Initialize bound constraints. Teuchos::RCP<Tpetra::MultiVector<> > lo_rcp = assembler->createControlVector(); Teuchos::RCP<Tpetra::MultiVector<> > hi_rcp = assembler->createControlVector(); lo_rcp->putScalar(0.0); hi_rcp->putScalar(1.0); Teuchos::RCP<ROL::Vector<RealT> > lop = Teuchos::rcp(new PDE_PrimalOptVector<RealT>(lo_rcp,pde,assembler)); Teuchos::RCP<ROL::Vector<RealT> > hip = Teuchos::rcp(new PDE_PrimalOptVector<RealT>(hi_rcp,pde,assembler)); Teuchos::RCP<ROL::BoundConstraint<RealT> > bnd = Teuchos::rcp(new ROL::BoundConstraint<RealT>(lop,hip)); // Initialize Augmented Lagrangian functional. bool storage = parlist->sublist("Problem").get("Use state storage",true); Teuchos::RCP<ROL::SimController<RealT> > stateStore = Teuchos::rcp(new ROL::SimController<RealT>()); Teuchos::RCP<ROL::Reduced_Objective_SimOpt<RealT> > objRed = Teuchos::rcp(new ROL::Reduced_Objective_SimOpt<RealT>(obj,pdeWithFilter, stateStore,up,zp,pp, storage)); ROL::AugmentedLagrangian<RealT> augLag(objRed,vcon,*c2p,1, *zp,*c1p,*parlist); // Run derivative checks bool checkDeriv = parlist->sublist("Problem").get("Check derivatives",false); if ( checkDeriv ) { *outStream << "\n\nCheck Opt Vector\n"; zp->checkVector(*dzp,*rzp,true,*outStream); *outStream << "\n\nCheck Gradient of Full Objective Function\n"; obj->checkGradient(x,d,true,*outStream); *outStream << "\n\nCheck Hessian of Full Objective Function\n"; obj->checkHessVec(x,d,true,*outStream); *outStream << "\n\nCheck Full Jacobian of PDE Constraint\n"; con->checkApplyJacobian(x,d,*rp,true,*outStream); *outStream << "\n\nCheck Jacobian_1 of PDE Constraint\n"; con->checkApplyJacobian_1(*up,*zp,*dup,*rp,true,*outStream); *outStream << "\n\nCheck Jacobian_2 of PDE Constraint\n"; con->checkApplyJacobian_2(*up,*zp,*dzp,*rp,true,*outStream); *outStream << "\n\nCheck Full Hessian of PDE Constraint\n"; con->checkApplyAdjointHessian(x,*pp,d,x,true,*outStream); *outStream << "\n\nCheck Hessian_11 of PDE Constraint\n"; con->checkApplyAdjointHessian_11(*up,*zp,*pp,*dup,*dualup,true,*outStream); *outStream << "\n\nCheck Hessian_21 of PDE Constraint\n"; con->checkApplyAdjointHessian_21(*up,*zp,*pp,*dzp,*dualup,true,*outStream); *outStream << "\n\nCheck Hessian_12 of PDE Constraint\n"; con->checkApplyAdjointHessian_12(*up,*zp,*pp,*dup,*dualzp,true,*outStream); *outStream << "\n\nCheck Hessian_22 of PDE Constraint\n"; con->checkApplyAdjointHessian_22(*up,*zp,*pp,*dzp,*dualzp,true,*outStream); *outStream << "\n"; con->checkAdjointConsistencyJacobian(*dup,d,x,true,*outStream); *outStream << "\n"; con->checkInverseJacobian_1(*up,*up,*up,*zp,true,*outStream); *outStream << "\n"; con->checkInverseAdjointJacobian_1(*up,*up,*up,*zp,true,*outStream); *outStream << "\n\nCheck Full Jacobian of Filter\n"; conFilter->checkApplyJacobian(x,d,*rp,true,*outStream); *outStream << "\n\nCheck Jacobian_1 of Filter\n"; conFilter->checkApplyJacobian_1(*up,*zp,*dup,*rp,true,*outStream); *outStream << "\n\nCheck Jacobian_2 of Filter\n"; conFilter->checkApplyJacobian_2(*up,*zp,*dzp,*rp,true,*outStream); *outStream << "\n\nCheck Full Hessian of Filter\n"; conFilter->checkApplyAdjointHessian(x,*pp,d,x,true,*outStream); *outStream << "\n\nCheck Hessian_11 of Filter\n"; conFilter->checkApplyAdjointHessian_11(*up,*zp,*pp,*dup,*dualup,true,*outStream); *outStream << "\n\nCheck Hessian_21 of Filter\n"; conFilter->checkApplyAdjointHessian_21(*up,*zp,*pp,*dzp,*dualup,true,*outStream); *outStream << "\n\nCheck Hessian_12 of Filter\n"; conFilter->checkApplyAdjointHessian_12(*up,*zp,*pp,*dup,*dualzp,true,*outStream); *outStream << "\n\nCheck Hessian_22 of Filter\n"; conFilter->checkApplyAdjointHessian_22(*up,*zp,*pp,*dzp,*dualzp,true,*outStream); *outStream << "\n"; conFilter->checkAdjointConsistencyJacobian(*dup,d,x,true,*outStream); *outStream << "\n"; conFilter->checkInverseJacobian_1(*up,*up,*up,*zp,true,*outStream); *outStream << "\n"; conFilter->checkInverseAdjointJacobian_1(*up,*up,*up,*zp,true,*outStream); *outStream << "\n\nCheck Full Jacobian of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyJacobian(x,d,*rp,true,*outStream); *outStream << "\n\nCheck Jacobian_1 of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyJacobian_1(*up,*zp,*dup,*rp,true,*outStream); *outStream << "\n\nCheck Jacobian_2 of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyJacobian_2(*up,*zp,*dzp,*rp,true,*outStream); *outStream << "\n\nCheck Full Hessian of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyAdjointHessian(x,*pp,d,x,true,*outStream); *outStream << "\n\nCheck Hessian_11 of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyAdjointHessian_11(*up,*zp,*pp,*dup,*dualup,true,*outStream); *outStream << "\n\nCheck Hessian_21 of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyAdjointHessian_21(*up,*zp,*pp,*dzp,*dualup,true,*outStream); *outStream << "\n\nCheck Hessian_12 of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyAdjointHessian_12(*up,*zp,*pp,*dup,*dualzp,true,*outStream); *outStream << "\n\nCheck Hessian_22 of Filtered PDE Constraint\n"; pdeWithFilter->checkApplyAdjointHessian_22(*up,*zp,*pp,*dzp,*dualzp,true,*outStream); *outStream << "\n"; pdeWithFilter->checkAdjointConsistencyJacobian(*dup,d,x,true,*outStream); *outStream << "\n"; pdeWithFilter->checkInverseJacobian_1(*up,*up,*up,*zp,true,*outStream); *outStream << "\n"; pdeWithFilter->checkInverseAdjointJacobian_1(*up,*up,*up,*zp,true,*outStream); *outStream << "\n\nCheck Gradient of Reduced Objective Function\n"; objRed->checkGradient(*zp,*dzp,true,*outStream); *outStream << "\n\nCheck Hessian of Reduced Objective Function\n"; objRed->checkHessVec(*zp,*dzp,true,*outStream); *outStream << "\n\nCheck Full Jacobian of Volume Constraint\n"; vcon->checkApplyJacobian(*zp,*dzp,*c1p,true,*outStream); *outStream << "\n"; vcon->checkAdjointConsistencyJacobian(*c1p,*dzp,*zp,true,*outStream); *outStream << "\n\nCheck Full Hessian of Volume Constraint\n"; vcon->checkApplyAdjointHessian(*zp,*c2p,*dzp,*zp,true,*outStream); *outStream << "\n\nCheck Gradient of Augmented Lagrangian Function\n"; augLag.checkGradient(*zp,*dzp,true,*outStream); *outStream << "\n\nCheck Hessian of Augmented Lagrangian Function\n"; augLag.checkHessVec(*zp,*dzp,true,*outStream); *outStream << "\n"; } ROL::Algorithm<RealT> algo("Augmented Lagrangian",*parlist,false); Teuchos::Time algoTimer("Algorithm Time", true); algo.run(*zp,*c2p,augLag,*vcon,*bnd,true,*outStream); algoTimer.stop(); *outStream << "Total optimization time = " << algoTimer.totalElapsedTime() << " seconds.\n"; // Output. pdecon->printMeshData(*outStream); con->solve(*rp,*up,*zp,tol); pdecon->outputTpetraVector(u_rcp,"state.txt"); pdecon->outputTpetraVector(z_rcp,"density.txt"); //Teuchos::Array<RealT> res(1,0); //con->value(*rp,*up,*zp,tol); //r_rcp->norm2(res.view(0,1)); //*outStream << "Residual Norm: " << res[0] << std::endl; //errorFlag += (res[0] > 1.e-6 ? 1 : 0); //pdecon->outputTpetraData(); // Get a summary from the time monitor. Teuchos::TimeMonitor::summarize(); } catch (std::logic_error err) { *outStream << err.what() << "\n"; errorFlag = -1000; }; // end try if (errorFlag != 0) std::cout << "End Result: TEST FAILED\n"; else std::cout << "End Result: TEST PASSED\n"; return 0; }
int main(int argc, char *argv[]) { // feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT); // This little trick lets us print to std::cout only if a (dummy) command-line argument is provided. int iprint = argc - 1; Teuchos::RCP<std::ostream> outStream; Teuchos::oblackholestream bhs; // outputs nothing /*** Initialize communicator. ***/ Teuchos::GlobalMPISession mpiSession (&argc, &argv, &bhs); Teuchos::RCP<const Teuchos::Comm<int> > comm = Tpetra::DefaultPlatform::getDefaultPlatform().getComm(); const int myRank = comm->getRank(); if ((iprint > 0) && (myRank == 0)) { outStream = Teuchos::rcp(&std::cout, false); } else { outStream = Teuchos::rcp(&bhs, false); } int errorFlag = 0; // *** Example body. try { /*** Read in XML input ***/ std::string filename = "input.xml"; Teuchos::RCP<Teuchos::ParameterList> parlist = Teuchos::rcp( new Teuchos::ParameterList() ); Teuchos::updateParametersFromXmlFile( filename, parlist.ptr() ); std::string stoch_filename = "stochastic.xml"; Teuchos::RCP<Teuchos::ParameterList> stoch_parlist = Teuchos::rcp( new Teuchos::ParameterList() ); Teuchos::updateParametersFromXmlFile( stoch_filename, stoch_parlist.ptr() ); /*** Initialize main data structure. ***/ Teuchos::RCP<const Teuchos::Comm<int> > serial_comm = Teuchos::rcp(new Teuchos::SerialComm<int>()); Teuchos::RCP<ElasticitySIMPOperators<RealT> > data = Teuchos::rcp(new ElasticitySIMPOperators<RealT>(serial_comm, parlist, outStream)); /*** Initialize density filter. ***/ Teuchos::RCP<DensityFilter<RealT> > filter = Teuchos::rcp(new DensityFilter<RealT>(serial_comm, parlist, outStream)); /*** Build vectors and dress them up as ROL vectors. ***/ Teuchos::RCP<const Tpetra::Map<> > vecmap_u = data->getDomainMapA(); Teuchos::RCP<const Tpetra::Map<> > vecmap_z = data->getCellMap(); Teuchos::RCP<Tpetra::MultiVector<> > u_rcp = createTpetraVector(vecmap_u); Teuchos::RCP<Tpetra::MultiVector<> > z_rcp = createTpetraVector(vecmap_z); Teuchos::RCP<Tpetra::MultiVector<> > du_rcp = createTpetraVector(vecmap_u); Teuchos::RCP<Tpetra::MultiVector<> > dw_rcp = createTpetraVector(vecmap_u); Teuchos::RCP<Tpetra::MultiVector<> > dz_rcp = createTpetraVector(vecmap_z); Teuchos::RCP<Tpetra::MultiVector<> > dz2_rcp = createTpetraVector(vecmap_z); Teuchos::RCP<std::vector<RealT> > vc_rcp = Teuchos::rcp(new std::vector<RealT>(1, 0)); Teuchos::RCP<std::vector<RealT> > vc_lam_rcp = Teuchos::rcp(new std::vector<RealT>(1, 0)); Teuchos::RCP<std::vector<RealT> > vscale_rcp = Teuchos::rcp(new std::vector<RealT>(1, 0)); // Set all values to 1 in u, z. RealT one(1), two(2); u_rcp->putScalar(one); // Set z to gray solution. RealT volFrac = parlist->sublist("ElasticityTopoOpt").get<RealT>("Volume Fraction"); z_rcp->putScalar(volFrac); // Set scaling vector for constraint RealT W = parlist->sublist("Geometry").get<RealT>("Width"); RealT H = parlist->sublist("Geometry").get<RealT>("Height"); (*vscale_rcp)[0] = one/std::pow(W*H*(one-volFrac),two); // Set Scaling vector for density bool useZscale = parlist->sublist("Problem").get<bool>("Use Scaled Density Vectors"); RealT densityScaling = parlist->sublist("Problem").get<RealT>("Density Scaling"); Teuchos::RCP<Tpetra::MultiVector<> > scaleVec = createTpetraVector(vecmap_z); scaleVec->putScalar(densityScaling); if ( !useZscale ) { scaleVec->putScalar(one); } Teuchos::RCP<const Tpetra::Vector<> > zscale_rcp = scaleVec->getVector(0); // Randomize d vectors. du_rcp->randomize(); //du_rcp->scale(0); dw_rcp->randomize(); dz_rcp->randomize(); //dz_rcp->scale(0); dz2_rcp->randomize(); // Create ROL::TpetraMultiVectors. Teuchos::RCP<ROL::Vector<RealT> > up = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(u_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dup = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(du_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dwp = Teuchos::rcp(new ROL::TpetraMultiVector<RealT>(dw_rcp)); Teuchos::RCP<ROL::Vector<RealT> > zp = Teuchos::rcp(new ROL::PrimalScaledTpetraMultiVector<RealT>(z_rcp,zscale_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dzp = Teuchos::rcp(new ROL::PrimalScaledTpetraMultiVector<RealT>(dz_rcp,zscale_rcp)); Teuchos::RCP<ROL::Vector<RealT> > dz2p = Teuchos::rcp(new ROL::PrimalScaledTpetraMultiVector<RealT>(dz2_rcp,zscale_rcp)); Teuchos::RCP<ROL::Vector<RealT> > vcp = Teuchos::rcp(new ROL::PrimalScaledStdVector<RealT>(vc_rcp,vscale_rcp)); Teuchos::RCP<ROL::Vector<RealT> > vc_lamp = Teuchos::rcp(new ROL::DualScaledStdVector<RealT>(vc_lam_rcp,vscale_rcp)); // Create ROL SimOpt vectors. ROL::Vector_SimOpt<RealT> x(up,zp); ROL::Vector_SimOpt<RealT> d(dup,dzp); ROL::Vector_SimOpt<RealT> d2(dwp,dz2p); /*** Build sampler. ***/ BuildSampler<RealT> buildSampler(comm,*stoch_parlist,*parlist); buildSampler.print("samples"); /*** Compute compliance objective function scaling. ***/ RealT min(ROL::ROL_INF<RealT>()), gmin(0), max(0), gmax(0), sum(0), gsum(0), tmp(0); Teuchos::Array<RealT> dotF(1, 0); RealT minDensity = parlist->sublist("ElasticitySIMP").get<RealT>("Minimum Density"); for (int i = 0; i < buildSampler.get()->numMySamples(); ++i) { data->updateF(buildSampler.get()->getMyPoint(i)); (data->getVecF())->dot(*(data->getVecF()),dotF.view(0,1)); tmp = minDensity/dotF[0]; min = ((min < tmp) ? min : tmp); max = ((max > tmp) ? max : tmp); sum += buildSampler.get()->getMyWeight(i) * tmp; } ROL::Elementwise::ReductionMin<RealT> ROLmin; buildSampler.getBatchManager()->reduceAll(&min,&gmin,ROLmin); ROL::Elementwise::ReductionMax<RealT> ROLmax; buildSampler.getBatchManager()->reduceAll(&max,&gmax,ROLmax); buildSampler.getBatchManager()->sumAll(&sum,&gsum,1); bool useExpValScale = stoch_parlist->sublist("Problem").get("Use Expected Value Scaling",false); RealT scale = (useExpValScale ? gsum : gmin); /*** Build objective function, constraint and reduced objective function. ***/ Teuchos::RCP<ROL::Objective_SimOpt<RealT> > obj = Teuchos::rcp(new ParametrizedObjective_PDEOPT_ElasticitySIMP<RealT>(data, filter, parlist,scale)); Teuchos::RCP<ROL::EqualityConstraint_SimOpt<RealT> > con = Teuchos::rcp(new ParametrizedEqualityConstraint_PDEOPT_ElasticitySIMP<RealT>(data, filter, parlist)); Teuchos::RCP<ROL::Reduced_Objective_SimOpt<RealT> > objReduced = Teuchos::rcp(new ROL::Reduced_Objective_SimOpt<RealT>(obj, con, up, zp, dwp)); Teuchos::RCP<ROL::EqualityConstraint<RealT> > volcon = Teuchos::rcp(new EqualityConstraint_PDEOPT_ElasticitySIMP_Volume<RealT>(data, parlist)); /*** Build bound constraint ***/ Teuchos::RCP<Tpetra::MultiVector<> > lo_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_z, 1, true)); Teuchos::RCP<Tpetra::MultiVector<> > hi_rcp = Teuchos::rcp(new Tpetra::MultiVector<>(vecmap_z, 1, true)); lo_rcp->putScalar(0.0); hi_rcp->putScalar(1.0); Teuchos::RCP<ROL::Vector<RealT> > lop = Teuchos::rcp(new ROL::PrimalScaledTpetraMultiVector<RealT>(lo_rcp, zscale_rcp)); Teuchos::RCP<ROL::Vector<RealT> > hip = Teuchos::rcp(new ROL::PrimalScaledTpetraMultiVector<RealT>(hi_rcp, zscale_rcp)); Teuchos::RCP<ROL::BoundConstraint<RealT> > bnd = Teuchos::rcp(new ROL::BoundConstraint<RealT>(lop,hip)); /*** Build Stochastic Functionality. ***/ ROL::StochasticProblem<RealT> opt(*stoch_parlist,objReduced,buildSampler.get(),zp,bnd); /*** Check functional interface. ***/ bool checkDeriv = parlist->sublist("Problem").get("Derivative Check",false); if ( checkDeriv ) { // *outStream << "Checking Objective:" << "\n"; // obj->checkGradient(x,d,true,*outStream); // obj->checkHessVec(x,d,true,*outStream); // obj->checkHessSym(x,d,d2,true,*outStream); // *outStream << "Checking Constraint:" << "\n"; // con->checkAdjointConsistencyJacobian(*dup,d,x,true,*outStream); // con->checkAdjointConsistencyJacobian_1(*dwp, *dup, *up, *zp, true, *outStream); // con->checkAdjointConsistencyJacobian_2(*dwp, *dzp, *up, *zp, true, *outStream); // con->checkInverseJacobian_1(*up,*up,*up,*zp,true,*outStream); // con->checkInverseAdjointJacobian_1(*up,*up,*up,*zp,true,*outStream); // con->checkApplyJacobian(x,d,*up,true,*outStream); // con->checkApplyAdjointHessian(x,*dup,d,x,true,*outStream); *outStream << "Checking Reduced Objective:" << "\n"; opt.checkObjectiveGradient(*dzp,true,*outStream); opt.checkObjectiveHessVec(*dzp,true,*outStream); *outStream << "Checking Volume Constraint:" << "\n"; volcon->checkAdjointConsistencyJacobian(*vcp,*dzp,*zp,true,*outStream); volcon->checkApplyJacobian(*zp,*dzp,*vcp,true,*outStream); volcon->checkApplyAdjointHessian(*zp,*vcp,*dzp,*zp,true,*outStream); } /*** Run optimization ***/ ROL::AugmentedLagrangian<RealT> augLag(opt.getObjective(),volcon,*vc_lamp,1.0, *opt.getSolutionVector(),*vcp,*parlist); ROL::Algorithm<RealT> algo("Augmented Lagrangian",*parlist,false); std::clock_t timer = std::clock(); algo.run(*opt.getSolutionVector(),*vc_lamp,augLag,*volcon,*opt.getBoundConstraint(),true,*outStream); *outStream << "Optimization time: " << static_cast<RealT>(std::clock()-timer)/static_cast<RealT>(CLOCKS_PER_SEC) << " seconds." << std::endl; data->outputTpetraVector(z_rcp, "density.txt"); data->outputTpetraVector(u_rcp, "state.txt"); data->outputTpetraVector(zscale_rcp, "weights.txt"); // Build objective function distribution RealT val(0); int nSamp = stoch_parlist->sublist("Problem").get("Number of Output Samples",10); stoch_parlist->sublist("Problem").set("Number of Samples",nSamp); BuildSampler<RealT> buildSampler_dist(comm,*stoch_parlist,*parlist); std::stringstream name; name << "samples_" << buildSampler_dist.getBatchManager()->batchID() << ".txt"; std::ofstream file; file.open(name.str()); std::vector<RealT> sample; RealT tol = 1.e-8; std::clock_t timer_print = std::clock(); for (int i = 0; i < buildSampler_dist.get()->numMySamples(); ++i) { sample = buildSampler_dist.get()->getMyPoint(i); objReduced->setParameter(sample); val = objReduced->value(*zp,tol); for (int j = 0; j < static_cast<int>(sample.size()); ++j) { file << sample[j] << " "; } file << val << "\n"; } file.close(); *outStream << "Output time: " << static_cast<RealT>(std::clock()-timer_print)/static_cast<RealT>(CLOCKS_PER_SEC) << " seconds." << std::endl; } catch (std::logic_error err) { *outStream << err.what() << "\n"; errorFlag = -1000; }; // end try if (errorFlag != 0) std::cout << "End Result: TEST FAILED\n"; else std::cout << "End Result: TEST PASSED\n"; return 0; }