Elements Removal Visualization#

[11]:
import opstool as opst
import openseespy.opensees as ops

Model#

[13]:
opst.load_ops_examples("Shell3D")
The original Tcl file comes from http://www.dinochen.com/, and the Python version is converted by opstool.tcl2py().
[15]:
ModelData = opst.GetFEMdata(results_dir="opstool_output")
ModelData.get_model_data(save_file="ModelData.hdf5")
opsvis = opst.OpsVisPyvista(
    point_size=2,
    line_width=3,
    results_dir="opstool_output",
)
opsvis.model_vis(
    input_file="ModelData.hdf5",
    show_node_label=True,
    show_ele_label=True,
    show_outline=False,
)
Model data saved in opstool_output/ModelData.hdf5!
../../_images/EleRemovalModel.png

Gravity analysis#

We use get_resp_step a to save the response data of each analysis step, remember to set model_update to True. When model_update=True, the data of different analysis cases will be continuously saved.

[4]:
ops.timeSeries("Linear", 1)
ops.pattern("Plain", 1, 1)
ops.load(14, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(20, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(26, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(32, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(56, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(72, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(88, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(104, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.load(120, 0.0, 0.0, -1000000.0, 0.0, 0.0, 0.0)
ops.constraints("Plain",)
ops.numberer("Plain",)
ops.system("BandGeneral")
ops.test("EnergyIncr", 1e-06, 200)
ops.algorithm("Newton",)
ops.integrator("LoadControl", 0.1)
ops.analysis("Static",)
[ ]:
for i in range(10):
    ops.analyze(1)
    ModelData.get_resp_step(model_update=True)   # here!
ops.loadConst(0,)

Elements removal#

[5]:
ops.wipeAnalysis()
ops.timeSeries("Linear", 2)
ops.pattern("Plain", 2, 2)
ops.constraints("Transformation",)
ops.test("NormDispIncr", 0.0001, 60)
ops.algorithm("KrylovNewton",)
ops.numberer("RCM",)
ops.system("BandGeneral",)
ops.integrator("LoadControl", 1)
ops.analysis("Static",)

we want to remove these elements: [32, 50, 52, 70, 31, 49, 51, 69].

Note

After some elements are removed, some free nodes appear in the model, which needs to be fixed.

[6]:
eleTags = [32, 50, 52, 70, 31, 49, 51, 69]   # removed ele tags
for tag in eleTags:
    ops.remove("element", tag)
    if tag == 49:
        ops.fix(67, 1, 1, 1, 1, 1, 1)
    if tag == 51:
        ops.fix(81, 1, 1, 1, 1, 1, 1)
    if tag == 69:
        ops.fix(83, 1, 1, 1, 1, 1, 1)
    ok = ops.analyze(10)
    ModelData.get_resp_step(model_update=True)

Finally, save all results to hdf5 files.

[7]:
ModelData.save_resp_all(save_file="RespStepData.hdf5", reset_state=True)
All responses data saved in opstool_output/RespStepData.hdf5!

Visual deformation, slider style

[16]:
opsvis.deform_vis(
    input_file="RespStepData.hdf5",
    slider=True,
    response="disp",
    alpha=1.0,
    show_outline=False,
    show_origin=True,
    show_face_line=False,
    opacity=1,
    model_update=True,
)
../../_images/EleRemovalDefo.png

create an animated gif

opsvis.deform_anim(
    input_file="RespStepData.hdf5",
    response="disp",
    alpha=1.0,
    show_outline=False,
    show_face_line=False,
    opacity=1,
    model_update=True,
    framerate=5,
    save_fig="deform_anim.gif"
)
StreamPlayer