Exemplo n.º 1
0
# 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')
Exemplo n.º 2
0
    # 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