# Factor the preconditioner mg.factor() subspace = 100 gmres = TACS.KSM(mg.getMat(), mg, subspace, isFlexible=1) gmres.setMonitor(comm, 'GMRES', 1) gmres.solve(res, ans) ans.scale(-1.0) assembler.setVariables(ans) # Output for visualization flag = (TACS.ToFH5.NODES | TACS.ToFH5.DISPLACEMENTS | TACS.ToFH5.STRAINS) f5 = TACS.ToFH5(assembler, TACS.PY_SHELL, flag) f5.writeToFile('visualization.f5') # Duplicate the forest and refine it uniformly forest_refined = forest.duplicate() forest_refined.setMeshOrder(4) forest_refined.balance(1) assembler_refined = creator.createTACS(forest_refined) ans_refined = assembler_refined.createVec() TMR.computeReconSolution(forest, assembler, forest_refined, assembler_refined, ans, ans_refined) assembler_refined.setVariables(ans_refined) # Output for visualization flag = (TACS.ToFH5.NODES | TACS.ToFH5.DISPLACEMENTS | TACS.ToFH5.STRAINS) f5 = TACS.ToFH5(assembler_refined, TACS.PY_SHELL, flag) f5.writeToFile('visualization_refined.f5')
# Compute the adjoint on the original mesh assembler.evalFunctions([func]) assembler.evalSVSens(func, res) gmres.solve(res, adjoint) adjoint.scale(-1.0) # Compute a reconstruction of the solution ans_interp = assembler_refined.createVec() if comm.size == 1: # Distribute the answer vector across all procs computeReconSolution(comm, forest, assembler, forest_refined, assembler_refined, ans, ans_interp) else: TMR.computeReconSolution(forest, assembler, forest_refined, assembler_refined, ans, ans_interp) # Set the interpolated solution on the fine mesh assembler_refined.setVariables(ans_interp) # Evaluate the function on the refined mesh func_refined = functions.KSFailure(assembler_refined, ksweight) func_refined.setKSFailureType('continuous') fval_refined = assembler_refined.evalFunctions([func_refined])[0] # Assemble the residual on the refined mesh res_refined = assembler_refined.createVec() assembler_refined.assembleRes(res_refined) # Approximate the difference between the refined adjoint # and the adjoint on the current mesh