From 9c7a8d6ebd8c840bbd755c6466850959f534a02f Mon Sep 17 00:00:00 2001 From: Vinicius Campos Date: Sat, 16 Mar 2024 17:56:18 -0300 Subject: [PATCH] update v0.2.6 --> v0.2.7 --- docs/tutoriais/analise_pos/tutorial_01.py | 574 ++++++++++++++ docs/tutoriais/analise_pos/tutorial_02.py | 109 +++ docs/tutoriais/analise_pos/tutorial_03.py | 221 ++++++ docs/tutoriais/analise_pos/tutorial_04.py | 690 ++++++++++++++++ docs/tutoriais/analise_pos/tutorial_05.py | 453 +++++++++++ docs/tutoriais/analise_pos/tutorial_06.py | 82 ++ .../tutoriais/forcas_boundcond/tutorial_01.py | 351 ++++++++ .../tutoriais/forcas_boundcond/tutorial_02.py | 109 +++ .../tutoriais/forcas_boundcond/tutorial_03.py | 221 ++++++ .../tutoriais/forcas_boundcond/tutorial_04.py | 627 +++++++++++++++ docs/tutoriais/malha/tutorial_01.py | 143 ++++ docs/tutoriais/malha/tutorial_02.py | 109 +++ docs/tutoriais/malha/tutorial_03.py | 199 +++++ docs/tutoriais/malha/tutorial_04.py | 530 +++++++++++++ docs/tutoriais/malha/tutorial_05.py | 361 +++++++++ docs/tutoriais/malha/tutorial_06.py | 82 ++ docs/tutoriais/malha/tutorial_06_cad.stp | 613 ++++++++++++++ docs/tutoriais/malha/tutorial_06_mesh.msh1 | 748 ++++++++++++++++++ myfempy/core/elements/plane.py | 24 +- myfempy/core/shapes/quad4.py | 5 +- myfempy/core/shapes/quad4_tasks.pyx | 10 +- myfempy/core/shapes/tria3.py | 123 +-- myfempy/core/shapes/tria3_tasks.pyx | 170 ++++ myfempy/core/solver/staticlinear.py | 2 +- myfempy/setup/fea.py | 3 +- pyproject.toml | 2 +- setup_wrap_cy_pyx.py | 1 + 27 files changed, 6437 insertions(+), 125 deletions(-) create mode 100644 docs/tutoriais/analise_pos/tutorial_01.py create mode 100644 docs/tutoriais/analise_pos/tutorial_02.py create mode 100644 docs/tutoriais/analise_pos/tutorial_03.py create mode 100644 docs/tutoriais/analise_pos/tutorial_04.py create mode 100644 docs/tutoriais/analise_pos/tutorial_05.py create mode 100644 docs/tutoriais/analise_pos/tutorial_06.py create mode 100644 docs/tutoriais/forcas_boundcond/tutorial_01.py create mode 100644 docs/tutoriais/forcas_boundcond/tutorial_02.py create mode 100644 docs/tutoriais/forcas_boundcond/tutorial_03.py create mode 100644 docs/tutoriais/forcas_boundcond/tutorial_04.py create mode 100644 docs/tutoriais/malha/tutorial_01.py create mode 100644 docs/tutoriais/malha/tutorial_02.py create mode 100644 docs/tutoriais/malha/tutorial_03.py create mode 100644 docs/tutoriais/malha/tutorial_04.py create mode 100644 docs/tutoriais/malha/tutorial_05.py create mode 100644 docs/tutoriais/malha/tutorial_06.py create mode 100644 docs/tutoriais/malha/tutorial_06_cad.stp create mode 100644 docs/tutoriais/malha/tutorial_06_mesh.msh1 create mode 100644 myfempy/core/shapes/tria3_tasks.pyx diff --git a/docs/tutoriais/analise_pos/tutorial_01.py b/docs/tutoriais/analise_pos/tutorial_01.py new file mode 100644 index 0000000..c9f331a --- /dev/null +++ b/docs/tutoriais/analise_pos/tutorial_01.py @@ -0,0 +1,574 @@ +''' +myfempy Tutorial 01 + +Geração da malha manual + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + +# # Retangulo estado plano (malha manual quad 4) 100 x 50 mm com forcas e bc. nodais + +# f1 = { +# 'DEF': 'forcenode', +# 'DOF': 'fy', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 0, 'z': 0}, +# 'VAL': [-1000.0], +# } + +# f2 = { +# 'DEF': 'forcenode', +# 'DOF': 'fy', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 50, 'z': 0}, +# 'VAL': [-1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 0, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 50, 'z': 0}, +# } + + +# elementos = [[1,"plane41","material","geometria",[1, 2, 3, 4]]] + + +# coordenadas = [[1, 0, 0, 0], +# [2, 100, 0, 0], +# [3, 100, 50, 0], +# [4, 0, 50, 0]] + + +# meshdata = {"ADD121": elementos, +# "NODELIST": coordenadas, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1,f2], +# "BOUNDCOND": [bc1,bc2], +# "QUADRATURE":{'meth':'gaussian','npp':4}, +# "DOMAIN":'structural' +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# # previewset = {'RENDER': {'filename': 'tutorial_01a', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# # } + +# # preview_plot(previewset, modelinfo) + +# #-------------------------------- SOLVER -------------------------------------# +# solverset = {"SOLVER": 'SLD', #SLI +# 'TOL': 1E-8, +# "STEPSET": {'type': 'table', # mode, freq, time ... +# 'start': 0, +# 'end': 1, +# 'step': 1}, +# #"TRACKER": {'show': False, 'result2plot': 'displ', 'max': []} +# } + +# solution = Solver.get_static_solve(solverset, modelinfo) + +# #----------------------------- POST-PROCESS ----------------------------------# +# postprocset = {"SOLUTION": solution, +# "COMPUTER": {'elasticity': {'displ': True, 'stress': True, 'average': True}}, +# # 'step':2 +# "PLOTSET": {'show': True, 'data': {'displ': []}, 'filename': 'tutorial_01a_sim', 'savepng': True}, +# # "TRACKER": {'show': True, 'result2plot':'stress', 'point': {'x':6,'y':1.5,'z':0}} +# } + +# postporc_result = PostProcess(modelinfo).compute(postprocset) + +# #----------------------------- VIEW SOLUTION ---------------------------------# +# postproc_plot(postprocset, postporc_result, modelinfo) + + + +#---------------------------------------------- + +# # Retangulo estado plano (malha legacy quad 4 10x5) 100 x 50 mm com forcas e bc distribuida + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fy', +# 'DIR': 'edgey', +# 'LOC': {'x': 999, 'y': 50, 'z': 0}, +# 'VAL': [-1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'edgex', +# 'LOC': {'x': 0, 'y': 999, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 0, 'z': 0}, +# } + +# meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'quad4', 'elem': 'plane41', 'nx': 10, 'ny': 5}, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1,bc2], +# "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, +# "DOMAIN":'structural' +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# # previewset = {'RENDER': {'filename': 'tutorial_01c', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# # } + +# # preview_plot(previewset, modelinfo) + + +# #-------------------------------- SOLVER -------------------------------------# +# solverset = {"SOLVER": 'SLD', #SLI +# 'TOL': 1E-8, +# "STEPSET": {'type': 'table', # mode, freq, time ... +# 'start': 0, +# 'end': 1, +# 'step': 1}, +# #"TRACKER": {'show': False, 'result2plot': 'displ', 'max': []} +# } + +# solution = Solver.get_static_solve(solverset, modelinfo) + +# #----------------------------- POST-PROCESS ----------------------------------# +# postprocset = {"SOLUTION": solution, +# "COMPUTER": {'elasticity': {'displ': True, 'stress': True, 'average': True}}, +# # 'step':2 +# "PLOTSET": {'show': True, 'data': {'displ': []}, 'filename': 'tutorial_01b_sim', 'savepng': True}, +# # "TRACKER": {'show': True, 'result2plot':'stress', 'point': {'x':6,'y':1.5,'z':0}} +# } + +# postporc_result = PostProcess(modelinfo).compute(postprocset) + +# #----------------------------- VIEW SOLUTION ---------------------------------# +# postproc_plot(postprocset, postporc_result, modelinfo) + + + + + + +# -------------------------------- + + + +# # Retangulo estado plano (malha legacy quad 4 10x5) 100 x 50 mm com forcas e bc distribuida + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fy', +# 'DIR': 'edgey', +# 'LOC': {'x': 999, 'y': 50, 'z': 0}, +# 'VAL': [0, -10, -50, -100], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'edgex', +# 'LOC': {'x': 0, 'y': 999, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 0, 'z': 0}, +# } + +# meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'quad4', 'elem': 'plane41', 'nx': 10, 'ny': 5}, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1,bc2], +# "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, +# "DOMAIN":'structural' +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# # previewset = {'RENDER': {'filename': 'tutorial_01c', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# # } + +# # preview_plot(previewset, modelinfo) + + +# #-------------------------------- SOLVER -------------------------------------# +# solverset = {"SOLVER": 'SLI', #SLI +# 'TOL': 1E-8, +# "STEPSET": {'type': 'table', # mode, freq, time ... +# 'start': 0, +# 'end': 4, +# 'step': 1}, +# } + +# solution = Solver.get_static_solve(solverset, modelinfo) + +# #----------------------------- POST-PROCESS ----------------------------------# +# postprocset = {"SOLUTION": solution, +# "COMPUTER": {'elasticity': {'displ': True, 'stress': True, 'average': True}}, +# "PLOTSET": {'show': True, 'data': {'displ': []}, 'filename': 'tutorial_01c_sim', 'savepng': True}, +# } + +# postporc_result = PostProcess(modelinfo).compute(postprocset) + +# #----------------------------- VIEW SOLUTION ---------------------------------# +# postproc_plot(postprocset, postporc_result, modelinfo) + + + + + + + + + +# ---------------------------- + + + + + + + + +# # # Retangulo estado plano dois materiais (malha manual quad 4) 200 x 100 mm com forcas e bc. nodais + +# mat2 = { +# "NAME": "material2", +# "VXX": 0.25, +# "EXX": 100E6, +# "MAT": 'isotropic', +# "DEF": 'planestress' +# } + +# geo2 = { +# "NAME": "geometria2", +# "THICKN": 1.0 +# } + +# f1 = { +# 'DEF': 'forcenode', +# 'DOF': 'fx', +# 'DIR': 'node', +# 'LOC': {'x': 200, 'y': 0, 'z': 0}, +# 'VAL': [100.0], +# } + +# f2 = { +# 'DEF': 'forcenode', +# 'DOF': 'fx', +# 'DIR': 'node', +# 'LOC': {'x': 200, 'y': 100, 'z': 0}, +# 'VAL': [100.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 0, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 0, 'z': 0}, +# } + +# bc3 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'node', +# 'LOC': {'x': 200, 'y': 0, 'z': 0}, +# } + +# bc4 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 100, 'z': 0}, +# } + +# bc5 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 100, 'z': 0}, +# } + +# bc6 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'node', +# 'LOC': {'x': 200, 'y': 100, 'z': 0}, +# } + + +# elementos = [[1,"plane41","material2","geometria",[1, 2, 3, 4]], +# [2,"plane41","material","geometria2",[2, 5, 6, 3]]] + + +# coordenadas = [[1, 0, 0, 0], +# [2, 100, 0, 0], +# [3, 100, 100, 0], +# [4, 0, 100, 0], +# [5, 200, 0, 0], +# [6, 200, 100, 0]] + + +# meshdata = {"ADD121": elementos, +# "NODELIST": coordenadas, +# "PROPMAT": [mat2,mat], +# "PROPGEO": [geo,geo2], +# "FORCES": [f1,f2], +# "BOUNDCOND": [bc1,bc2,bc3,bc4,bc5,bc6], +# "QUADRATURE":{'meth':'gaussian','npp':4}, +# "DOMAIN":'structural' +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# print(modelinfo['inci']) + +# previewset = {'RENDER': {'filename': 'tutorial_01d', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + + + +# #-------------------------------- SOLVER -------------------------------------# +# solverset = {"SOLVER": 'SLI', #SLI +# 'TOL': 1E-8, +# "STEPSET": {'type': 'table', # mode, freq, time ... +# 'start': 0, +# 'end': 1, +# 'step': 1}, +# } + +# solution = Solver.get_static_solve(solverset, modelinfo) + +# #----------------------------- POST-PROCESS ----------------------------------# +# postprocset = {"SOLUTION": solution, +# "COMPUTER": {'elasticity': {'displ': True, 'stress': True, 'average': True}}, +# "PLOTSET": {'show': True, 'data': {'displ': []}, 'filename': 'tutorial_01d_sim', 'savepng': True}, +# } + +# postporc_result = PostProcess(modelinfo).compute(postprocset) + +# #----------------------------- VIEW SOLUTION ---------------------------------# +# postproc_plot(postprocset, postporc_result, modelinfo) + + + + +# ----------------------------------- + +# Dois Solidos 100 x 100 x 100 mm diferentes materiais + +mat1 = { + "NAME": "material1", + "VXX": 0.25, + "EXX": 100E6, + "MAT": 'isotropic', + "DEF": 'solid' + } + + +mat2 = { + "NAME": "material2", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'solid' + } + +geo2 = { + "NAME": "geometria2", + "THICKN": 0.0 + } + + +coordenadas = [[1, 0, 0, 0], + [2, 100, 0, 0], + [3, 100, 100, 0], + [4, 0, 100, 0], + [5, 0, 0, 100], + [6, 100, 0, 100], + [7, 100, 100, 100], + [8, 0, 100, 100], + [9, 200, 0, 0], + [10, 200, 100, 0], + [11, 200, 0, 100], + [12, 200, 100, 100], + ] + +elementos = [[1,"solid81","material1","geometria2",[1, 2, 3, 4, 5, 6, 7, 8]], + [2,"solid81","material1","geometria2",[2, 9, 10, 3, 6, 11, 12, 7]] + ] + + +# f1 = { +# 'DEF': 'forcesurf', #forcesurf +# 'DOF': 'fx', +# 'DIR': 'surfyz', +# 'LOC': {'x': 200, 'y': 999, 'z': 999}, +# 'VAL': [100.0], +# } + +f1 = { + 'DEF': 'forcenode', #forcesurf + 'DOF': 'fz', + 'DIR': 'node', + 'LOC': {'x': 200, 'y': 100, 'z': 100}, + 'VAL': [100.0], + } + +f2 = { + 'DEF': 'forcenode', #forcesurf + 'DOF': 'fy', + 'DIR': 'node', + 'LOC': {'x': 200, 'y': 0, 'z': 100}, + 'VAL': [-100.0], + } + +f3 = { + 'DEF': 'forcenode', #forcesurf + 'DOF': 'fz', + 'DIR': 'node', + 'LOC': {'x': 200, 'y': 0, 'z': 0}, + 'VAL': [-100.0], + } + +f4 = { + 'DEF': 'forcenode', #forcesurf + 'DOF': 'fy', + 'DIR': 'node', + 'LOC': {'x': 200, 'y': 100, 'z': 0}, + 'VAL': [100.0], + } + + +bc1 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'surfzx', + 'LOC': {'x': 999, 'y': 100, 'z': 999}, + } + +bc2 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'surfzx', + 'LOC': {'x': 999, 'y': 0, 'z': 999}, + } + +bc3 = { + 'DEF': 'fixed', + 'DOF': 'uz', + 'DIR': 'surfzx', + 'LOC': {'x': 999, 'y': 100, 'z': 999}, + } + +bc4 = { + 'DEF': 'fixed', + 'DOF': 'uz', + 'DIR': 'surfzx', + 'LOC': {'x': 999, 'y': 0, 'z': 999}, + } + +bc5 = { + 'DEF': 'fixed', + 'DOF': 'all', + 'DIR': 'surfyz', + 'LOC': {'x': 0, 'y': 999, 'z': 999}, + } + + +meshdata = {"ADD121": elementos, + "NODELIST": coordenadas, + "PROPMAT": [mat1,mat2], + "PROPGEO": [geo2,geo2], + "FORCES": [f1,f2,f3,f4], + "BOUNDCOND": [bc5], + "QUADRATURE":{'meth':'gaussian','npp':8}, + "DOMAIN":'structural' + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_01e', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, + 'LABELS': {'show': True, 'lines': True, 'scale': 10}, + } + +preview_plot(previewset, modelinfo) + + +#-------------------------------- SOLVER -------------------------------------# +solverset = {"SOLVER": 'SLIPRE', #SLI + 'TOL': 1E-8, + "STEPSET": {'type': 'table', # mode, freq, time ... + 'start': 0, + 'end': 1, + 'step': 1}, + } + +solution = Solver.get_static_solve(solverset, modelinfo) + +#----------------------------- POST-PROCESS ----------------------------------# +postprocset = {"SOLUTION": solution, + "COMPUTER": {'elasticity': {'displ': True, 'stress': True, 'average': True}}, + "PLOTSET": {'show': True, 'data': {'displ': []}, 'filename': 'tutorial_01e_sim', 'savepng': True}, + } + +postporc_result = PostProcess(modelinfo).compute(postprocset) + +#----------------------------- VIEW SOLUTION ---------------------------------# +postproc_plot(postprocset, postporc_result, modelinfo) + + diff --git a/docs/tutoriais/analise_pos/tutorial_02.py b/docs/tutoriais/analise_pos/tutorial_02.py new file mode 100644 index 0000000..e3c0a3f --- /dev/null +++ b/docs/tutoriais/analise_pos/tutorial_02.py @@ -0,0 +1,109 @@ +''' +myfempy Tutorial 02 + +Geração da malha por meio da opção legacy + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot +from math import pi + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'axial' + } + + +geo = { + "NAME": "geo", + "SEC":"I", + 'DIM':{'b':100,'h':150,'t':5,'d':5}} + +# Linha (malha beam 2) 500 mm + +meshdata = {"LEGACY": {'lx': 400, 'mesh': 'line2', 'elem': 'beam21', 'nx': 2}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02a', 'show': True, 'scale': 1, 'savepng': True, 'lines': True, 'cs': True}, + } + +preview_plot(previewset, modelinfo) + + +sys.exit() +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +# Retangulo estado plano (malha quad 4) 100 x 50 mm + +meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'quad4', 'elem': 'plane41', 'nx': 10, 'ny': 5}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02b', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + } + +preview_plot(previewset, modelinfo) + + +# Retangulo estado plano (malha tria 3) 100 x 50 mm + +meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'tria3', 'elem': 'plane31', 'nx': 10, 'ny': 5}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02c', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/analise_pos/tutorial_03.py b/docs/tutoriais/analise_pos/tutorial_03.py new file mode 100644 index 0000000..c597215 --- /dev/null +++ b/docs/tutoriais/analise_pos/tutorial_03.py @@ -0,0 +1,221 @@ +''' +myfempy Tutorial 03 + +Geração da malha com gmsh + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + +# ---------------------------------------------------------- + +# Placa L estado plano (malha quad 4) 100 x 100 mm + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fy', +# 'DIR': 'edge', +# 'TAG': 3, +# 'VAL': [-1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'edge', +# 'TAG': 5, +# } + + +# points = [[0, 0, 0], +# [100, 0, 0], +# [100, 50, 0], +# [50, 50, 0], +# [50, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 4], +# [4, 5], +# [5, 6], +# [6, 1], +# ] + +# plane = [[1, 2, 3, 4, 5, 6]] + +# meshdata = {"GMSH": {'filename': 'tutorial_03a', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tria3', #tria3 +# 'elem': 'plane31', #plane31 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': 'all', +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_03a', +# 'show': True, +# 'scale': 5, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': True, +# 'edge': True}}, +# } + +# preview_plot(previewset, modelinfo) + + +# -------------------------------------------------- + +# # Placa H estado plano (malha quad 4) 100 x 100 mm + +f1 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 8, + 'VAL': [100.0], + } + +f2 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 10, + 'VAL': [-100.0], + } + +f3 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 4, + 'VAL': [100.0], + } + +f4 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 2, + 'VAL': [-100.0], + } + +bc1 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 3, + } + +bc2 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 9, + } + +points = [ + [0, 0, 0], + [20, 0, 0], + [20, 30, 0], + [80, 30, 0], + [80, 0, 0], + [100, 0, 0], + [100, 100, 0], + [80, 100, 0], + [80, 70, 0], + [20, 70, 0], + [20, 100, 0], + [0, 100, 0], + ] + +lines = [[1, 2], + [2, 3], + [3, 4], + [4, 5], + [5, 6], + [6, 7], + [7, 8], + [8, 9], + [9, 10], + [10, 11], + [11, 12], + [12, 1], + ] + +plane = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]] + +meshdata = {"GMSH": {'filename': 'tutorial_03b', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'quad4', #tria3 + 'elem': 'plane41', #plane31 + 'sizeelement': 5, + 'meshmap': {'on': True, + 'edge': 'all', + # "numbernodes": 10, + } + } + }, + "PROPMAT": [mat], + "PROPGEO": [geo], + "FORCES": [f1, f2, f3, f4], + "BOUNDCOND": [bc1, bc2], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_03b', + 'show': True, + 'scale': 4, + 'savepng': True, + 'lines': True, + 'plottags': { + # 'point': True, + 'edge': True, + # 'surf': True + } + }, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/analise_pos/tutorial_04.py b/docs/tutoriais/analise_pos/tutorial_04.py new file mode 100644 index 0000000..ddfd688 --- /dev/null +++ b/docs/tutoriais/analise_pos/tutorial_04.py @@ -0,0 +1,690 @@ +''' +myfempy Tutorial 04 + +Geração da malha com gmsh/ criação de curvas e furos e áreas compostas + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +import sys + +# Definição do material, geometria + +mat1 = { + "NAME": "material1", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +mat2 = { + "NAME": "material2", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo1 = { + "NAME": "geometria1", + "THICKN": 1.0 + } + +geo2 = { + "NAME": "geometria2", + "THICKN": 1.0 + } + + +# #----------------------------------------------------- + +# # 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fx', +# 'DIR': 'edge', +# 'TAG': 1, +# 'VAL': [1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'edge', +# 'TAG': 3, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'edge', +# 'TAG': 4, +# } + + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 5], +# [4, 1], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 5]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04a', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 5, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat1], +# "PROPGEO": [geo1], +# "FORCES": [f1], +# "BOUNDCOND": [bc1, bc2], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04a', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': True, +# 'edge': True}}, +# } + +# preview_plot(previewset, modelinfo) + + +# sys.exit() + + +#------------------------------------------ + +# # Placa completa multiplos furos (dia. 10, 10, 30 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 200, 0], +# [0, 200, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# ] + +# arcs = [[30, [150, 100, 0], ['0', '2*Pi']], # line 5 +# [10, [30, 150, 0], ['0', '2*Pi']], # line 6 +# [10, [30, 50, 0], ['0', '2*Pi']], # line 7 +# ] + +# plane = [[1, 2, 3, 4], +# [-5], +# [-6], +# [-7], +# # [5], +# # [6], +# # [7] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04b', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# # 'meshmap': {'on': True, +# # 'edge': [5], #'all' +# # "numbernodes": 60, +# # } +# } +# }, +# "PROPMAT": [mat1,mat2,mat2,mat2], +# "PROPGEO": [geo1,geo1,geo1,geo1], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04b', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 0.2}, +# } + +# preview_plot(previewset, modelinfo) + + + + +# # ------------------------------------------------------ + +# # Placa completa furo quadrado central (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 100, 0], +# [0, 100, 0], +# [75, 25, 0], +# [125, 25, 0], +# [125, 75, 0], +# [75, 75, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [5, 6], # line 5 +# [6, 7], # line 6 +# [7, 8], # line 7 +# [8, 5], # line 8 +# ] + + +# plane = [[1, 2, 3, 4], +# [-5, -6, -7, -8], +# # [5, 6, 7, 8] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04c', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 5, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat1,mat2], +# "PROPGEO": [geo1,geo2], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04c', +# 'show': True, 'scale': 2, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# 'point': True, +# # 'edge': True, +# # 'surf': True +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 0.1}, +# } + +# preview_plot(previewset, modelinfo) + + + + + +# ------------------------------------------------------ + +# Duas Placa composta estado plano (malha quad 4) 200 x 200 mm + +mat2 = { + "NAME": "material2", + "VXX": 0.25, + "EXX": 2000E18, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +f1 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 6, + 'VAL': [-10], + } + +bc1 = { + 'DEF': 'fixed', + 'DOF': 'all', + 'DIR': 'edge', + 'TAG': 4, + } + +bc2 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 3, + } + +bc3 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 1, + } + +bc4 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 7, + } + +bc5 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 5, + } + + +points = [ + [0, 0, 0], # point 1 + [100, 0, 0], # point 2 + [100, 100, 0], # point 3 + [0, 100, 0], # point 4 + [200, 0, 0], # point 5 + [200, 100, 0], # point 6 + ] + + +lines = [[1, 2], # line 1 + [2, 3], # line 2 + [3, 4], # line 3 + [4, 1], # line 4 + [2, 5], # line 5 + [5, 6], # line 6 + [6, 3], # line 7 + ] + + +plane = [[1, 2, 3, 4], # plane 1 + [5, 6, 7, 2], # plane 2 + ] + +meshdata = {"GMSH": {'filename': 'tutorial_04d', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'quad4', #quad4 + 'elem': 'plane41', #plane41 + 'sizeelement': 5, + 'meshmap': {'on': True, + 'edge': 'all', #'all' [2, 5, 6, 7] + # "numbernodes": 5, + } + } + }, + "PROPMAT": [mat2, mat1], + "PROPGEO": [geo1, geo1], + "FORCES": [f1], + "BOUNDCOND": [bc1, bc2, bc3], + "QUADRATURE":{'meth':'gaussian','npp':4}, + "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + + +previewset = {'RENDER': {'filename': 'tutorial_04d', + 'show': True, 'scale': 5, + 'savepng': True, + 'lines': True, + 'plottags': { + # 'point': True, + 'edge': True, + # 'surf': True + }}, + # 'LABELS': {'show': True, 'lines': True, 'scale': 0.5}, + } + +preview_plot(previewset, modelinfo) + +#-------------------------------- SOLVER -------------------------------------# +solverset = {"SOLVER": 'SLIPRE', #SLI + 'TOL': 1E-8, + "STEPSET": {'type': 'table', # mode, freq, time ... + 'start': 0, + 'end': 1, + 'step': 1}, + } + +solution = Solver.get_static_solve(solverset, modelinfo) + +#----------------------------- POST-PROCESS ----------------------------------# +postprocset = {"SOLUTION": solution, + "COMPUTER": {'elasticity': {'displ': True, 'stress': True, 'average': True}}, + "PLOTSET": {'show': True, 'data': {'displ': []}, 'filename': 'tutorial_04d_sim', 'savepng': True}, + } + +postporc_result = PostProcess(modelinfo).compute(postprocset) + +#----------------------------- VIEW SOLUTION ---------------------------------# +postproc_plot(postprocset, postporc_result, modelinfo) + + + + + + + + + + + + + + + + +# ------------------------------------------------------ + +# # Duas Placa composta com furo em 0,0,0 (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [100, 0, 0], # point 1 +# [100, 100, 0], # point 2 +# [0, 100, 0], # point 3 +# [200, 0, 0], # point 4 +# [200, 100, 0], # point 5 +# ] + + +# lines = [ +# [6, 1], # line 1 +# [1, 2], # line 2 +# [2, 3], # line 3 +# [3, 7], # line 4 +# [1, 4], # line 5 +# [4, 5], # line 6 +# [5, 2], # line 7 +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']], # line 8 +# ] + +# plane = [[1, 2, 3, 4, 8], # plane 1 +# [5, 6, 7, 2], # plane 2 +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04e', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tria3', #quad4 +# 'elem': 'plane31', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': [8], #'all' +# "numbernodes": 20, +# } +# } +# }, +# "PROPMAT": [mat1,mat2], +# "PROPGEO": [geo1,geo2], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04e', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True, +# # 'surf': True +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + +# ----------------------------------- + +# # disco (dia. 200 mm) com furo central (dia. 100 mm) estado plano (malha quad 4) + +# points = [ +# # [100, 0, 0], +# # [100, 100, 0], +# # [0, 100, 0], +# ] + +# lines = [ +# # [1, 2], +# # [2, 3], +# # [3, 5], +# # [4, 1], +# ] + +# arcs = [[200, [0, 0, 0], ['0', '2*Pi']],[100, [0, 0, 0], ['0', '2*Pi']]] + +# plane = [[1],[-2]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04f', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'tria3', #quad4 +# 'elem': 'plane31', #plane41 +# 'sizeelement': 40, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 80, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04f', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# 'edge': True, +# # 'surf': True +# }}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + + +# ----------------------------------- + +# # 1/4 de placa com bara no furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# [0, 0, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 6], +# [5, 1], +# [4, 5], +# [6, 4], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 7],[5, 6, 7]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04g', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': [7], #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat1,mat2], +# "PROPGEO": [geo1,geo2], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04g', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True, +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 2}, +# } + +# preview_plot(previewset, modelinfo) + + +# #----------------------------------------------------- + +# 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm malha mapeada + + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fx', +# 'DIR': 'edge', +# 'TAG': 1, +# 'VAL': [1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'edge', +# 'TAG': 3, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'edge', +# 'TAG': 4, +# } + + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], # 1 +# [2, 3], # 2 +# [3, 7], # 3 +# [4, 1], # 4 +# [2, 5], # 5 +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/4']], # 6 +# [50, [0, 0, 0], ['Pi/4', 'Pi/2']]] # 7 + +# plane = [[1, 5, 6, 4], +# [5, 2, 3, 7]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04h', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1, bc2], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04h', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True +# }}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 0.5}, +# } + +# preview_plot(previewset, modelinfo) diff --git a/docs/tutoriais/analise_pos/tutorial_05.py b/docs/tutoriais/analise_pos/tutorial_05.py new file mode 100644 index 0000000..96e0940 --- /dev/null +++ b/docs/tutoriais/analise_pos/tutorial_05.py @@ -0,0 +1,453 @@ +''' +myfempy Tutorial 05 + +Geração da malha com gmsh/ solidos + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +# #----------------------------------------------------- + +# # 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 5], +# [4, 1], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 5]] + +# meshdata = {"GMSH": {'filename': 'tutorial_05a', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'tetr4', #tetr4 hexa8 +# 'elem': 'solid41', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05a', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': True, +# 'edge': True}}, +# } + +# preview_plot(previewset, modelinfo) + + +#------------------------------------------ + + +# # Placa completa multiplos furos (dia. 10, 10, 30 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 200, 0], +# [0, 200, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# ] + +# arcs = [[30, [150, 100, 0], ['0', '2*Pi']], # line 5 +# [10, [30, 150, 0], ['0', '2*Pi']], # line 6 +# [10, [30, 50, 0], ['0', '2*Pi']], # line 7 +# ] + +# plane = [[1, 2, 3, 4], +# [-5], +# [-6], +# [-7], +# # [5], +# # [6], +# # [7] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_05b', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tetr4', #tetr4 hexa8 +# 'elem': 'solid41', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05b', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + + + +# # ------------------------------------------------------ + +# # Placa completa furo quadrado central (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 100, 0], +# [0, 100, 0], +# [75, 25, 0], +# [125, 25, 0], +# [125, 75, 0], +# [75, 75, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [5, 6], # line 5 +# [6, 7], # line 6 +# [7, 8], # line 7 +# [8, 5], # line 8 +# ] + + +# plane = [[1, 2, 3, 4], +# [-5, -6, -7, -8], +# # [5, 6, 7, 8] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_05c', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'hexa8', #tetr4 hexa8 +# 'elem': 'solid81', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05c', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# 'point': True, +# # 'edge': True, +# # 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + + +# ------------------------------------------------------ + + +# # Duas Placa composta estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [0, 0, 0], # point 1 +# [100, 0, 0], # point 2 +# [100, 100, 0], # point 3 +# [0, 100, 0], # point 4 +# [200, 0, 0], # point 5 +# [200, 100, 0], # point 6 +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [2, 5], # line 5 +# [5, 6], # line 6 +# [6, 3], # line 7 +# ] + + +# plane = [[1, 2, 3, 4], # plane 1 +# [5, 6, 7, 2], # plane 2 +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_05d', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tetr4', #tetr4 hexa8 +# 'elem': 'solid41', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': [2, 6], #'all' +# "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05d', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True, +# # 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + +# # ------------------------------------------------------ + +# # Duas Placa composta com furo em 0,0,0 (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + + +f1 = { + 'DEF': 'forcesurf', + 'DOF': 'fx', + 'DIR': 'surf', + 'TAG': 10, + 'VAL': [100.0], + } + +bc1 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'surf', + 'TAG': 5, + } + +bc2 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'surf', + 'TAG': 11, + } + + +bc3 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'surf', + 'TAG': 3, + } + + +bc4 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'surf', + 'TAG': 9, + } + + +bc5 = { + 'DEF': 'fixed', + 'DOF': 'ux', + 'DIR': 'surf', + 'TAG': 6, + } + + +mat1 = { + "NAME": "material1", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'solid' + } + + +mat2 = { + "NAME": "material2", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'solid' + } + + +points = [ + [100, 0, 0], # point 1 + [100, 100, 0], # point 2 + [0, 100, 0], # point 3 + [200, 0, 0], # point 4 + [200, 100, 0], # point 5 + ] + + +lines = [ + [6, 1], # line 1 + [1, 2], # line 2 + [2, 3], # line 3 + [3, 7], # line 4 + [1, 4], # line 5 + [4, 5], # line 6 + [5, 2], # line 7 + ] + +arcs = [[50, [0, 0, 0], ['0', 'Pi/2']], # line 8 + ] + +plane = [[1, 2, 3, 4, 8], # plane 1 + [5, 6, 7, 2], # plane 2 + ] + +meshdata = {"GMSH": {'filename': 'tutorial_05e', + 'pointlist': points, + 'linelist': lines, + 'arc': arcs, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'tetr4', #tetr4 hexa8 + 'elem': 'solid41', #solid41 solid81 + 'sizeelement': 5, + 'extrude': 20, + # 'meshmap': {'on': True, + # 'edge': 'all', + # "numbernodes": 20, + # } + } + }, + "PROPMAT": [mat1,mat2], + "PROPGEO": [geo,geo], + "FORCES": [f1], + "BOUNDCOND": [bc1, bc2, bc3, bc4, bc5], + # "QUADRATURE":{'meth':'gaussian','npp':4}, + "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_05e', + 'show': True, 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': { + # 'point': True, + # 'edge': True, + 'surf': True + }}, + } + +preview_plot(previewset, modelinfo) + + +#-------------------------------- SOLVER -------------------------------------# +solverset = {"SOLVER": 'SLIPRE', #SLI + 'TOL': 1E-8, + "STEPSET": {'type': 'table', # mode, freq, time ... + 'start': 0, + 'end': 1, + 'step': 1}, + } + +solution = Solver.get_static_solve(solverset, modelinfo) + +#----------------------------- POST-PROCESS ----------------------------------# +postprocset = {"SOLUTION": solution, + "COMPUTER": {'elasticity': {'displ': True, 'stress': True, 'average': True}}, + "PLOTSET": {'show': True, 'data': {'displ': []}, 'filename': 'tutorial_05e_sim', 'savepng': True}, + } + +postporc_result = PostProcess(modelinfo).compute(postprocset) + +#----------------------------- VIEW SOLUTION ---------------------------------# +postproc_plot(postprocset, postporc_result, modelinfo) diff --git a/docs/tutoriais/analise_pos/tutorial_06.py b/docs/tutoriais/analise_pos/tutorial_06.py new file mode 100644 index 0000000..3d72457 --- /dev/null +++ b/docs/tutoriais/analise_pos/tutorial_06.py @@ -0,0 +1,82 @@ +''' +myfempy Tutorial 06 + +Geração da malha com gmsh/ importação de modelos cad (.stp/ .step) e malha (.vtk) externa + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +#--------------------------------------------- + + +# # import cad .stp + +# meshdata = {"GMSH": {'filename': 'tutorial_06a', +# 'cadimport': {'object': 'tutorial_06_cad.stp'}, +# 'meshconfig': {'mesh': 'tetr4', 'elem': 'solid41', 'sizeelement': 10}}, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_06a', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': False, +# 'edge': False}}, +# } + +# preview_plot(previewset, modelinfo) + + +# ---------------------------------------------------- + +# import mesh .vtk + +meshdata = {"GMSH": {'filename': 'tutorial_06b', + 'meshimport':{'object':'tutorial_06_mesh'}, + 'meshconfig': {'mesh': 'tetr4', 'elem': 'solid41', 'sizeelement': 10}}, + "PROPMAT": [mat], + "PROPGEO": [geo], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_06b', + 'show': True, 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': {'point': False, + 'surf': True}}, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/forcas_boundcond/tutorial_01.py b/docs/tutoriais/forcas_boundcond/tutorial_01.py new file mode 100644 index 0000000..c705ccb --- /dev/null +++ b/docs/tutoriais/forcas_boundcond/tutorial_01.py @@ -0,0 +1,351 @@ +''' +myfempy Tutorial 01 + +Geração da malha manual + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + +# # Retangulo estado plano (malha manual quad 4) 100 x 50 mm com forcas e bc. nodais + +# f1 = { +# 'DEF': 'forcenode', +# 'DOF': 'fy', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 0, 'z': 0}, +# 'VAL': [-1000.0], +# } + +# f2 = { +# 'DEF': 'forcenode', +# 'DOF': 'fy', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 50, 'z': 0}, +# 'VAL': [-1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 0, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 50, 'z': 0}, +# } + + +# elementos = [[1,"plane41","material","geometria",[1, 2, 3, 4]]] + + +# coordenadas = [[1, 0, 0, 0], +# [2, 100, 0, 0], +# [3, 100, 50, 0], +# [4, 0, 50, 0]] + + +# meshdata = {"ADD121": elementos, +# "NODELIST": coordenadas, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1,f2], +# "BOUNDCOND": [bc1,bc2], +# "QUADRATURE":{'meth':'gaussian','npp':4}, +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_01a', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + +#---------------------------------------------- + +# # Retangulo estado plano (malha manual quad 4) 100 x 50 mm com forcas distribuida e bc. nodais + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fy', +# 'DIR': 'edgex', +# 'LOC': {'x': 100, 'y': 999, 'z': 0}, +# 'VAL': [-1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 0, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 50, 'z': 0}, +# } + + +# elementos = [[1,"plane41","material","geometria",[1, 2, 3, 4]]] + + +# coordenadas = [[1, 0, 0, 0], +# [2, 100, 0, 0], +# [3, 100, 50, 0], +# [4, 0, 50, 0]] + + +# meshdata = {"ADD121": elementos, +# "NODELIST": coordenadas, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1,bc2], +# "QUADRATURE":{'meth':'gaussian','npp':4}, +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_01b', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + + +#---------------------------------------------- + +# # Retangulo estado plano (malha legacy quad 4 10x5) 100 x 50 mm com forcas e bc distribuida + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fy', +# 'DIR': 'edgey', +# 'LOC': {'x': 999, 'y': 50, 'z': 0}, +# 'VAL': [-1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'edgex', +# 'LOC': {'x': 0, 'y': 999, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 0, 'z': 0}, +# } + +# meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'quad4', 'elem': 'plane41', 'nx': 10, 'ny': 5}, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1,bc2], +# "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, +# # "DOMAIN":'structural' +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_01c', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + + +# -------------------------------- + +# # Retangulo estado plano (malha manual quad 4) 100 x 50 mm com massa e mola concentrada + +# f1 = { +# 'DEF': 'forcenode', +# 'DOF': 'spring2ground', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 0, 'z': 0}, +# 'VAL': [100.0], +# } + +# f2 = { +# 'DEF': 'forcenode', +# 'DOF': 'damper2ground', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 50, 'z': 0}, +# 'VAL': [100.0], +# } + +# f3 = { +# 'DEF': 'forcenode', +# 'DOF': 'masspoint', +# 'DIR': 'node', +# 'LOC': {'x': 100, 'y': 50, 'z': 0}, +# 'VAL': [1.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 0, 'z': 0}, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'node', +# 'LOC': {'x': 0, 'y': 50, 'z': 0}, +# } + + +# elementos = [[1,"plane41","material","geometria",[1, 2, 3, 4]]] + + +# coordenadas = [[1, 0, 0, 0], +# [2, 100, 0, 0], +# [3, 100, 50, 0], +# [4, 0, 50, 0]] + + +# meshdata = {"ADD121": elementos, +# "NODELIST": coordenadas, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1,f2,f3], +# "BOUNDCOND": [bc1,bc2], +# "QUADRATURE":{'meth':'gaussian','npp':4}, +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_01a', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + + +# ---------------------------- + +# Retangulo estado plano dois materiais (malha manual quad 4) 200 x 100 mm com forcas e bc. nodais + +mat2 = { + "NAME": "material2", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo2 = { + "NAME": "geometria2", + "THICKN": 1.0 + } + +f1 = { + 'DEF': 'forcenode', + 'DOF': 'fy', + 'DIR': 'node', + 'LOC': {'x': 0, 'y': 100, 'z': 0}, + 'VAL': [-100.0], + } + +f2 = { + 'DEF': 'forcenode', + 'DOF': 'fy', + 'DIR': 'node', + 'LOC': {'x': 100, 'y': 100, 'z': 0}, + 'VAL': [-100.0], + } + +f3 = { + 'DEF': 'forcenode', + 'DOF': 'fy', + 'DIR': 'node', + 'LOC': {'x': 200, 'y': 100, 'z': 0}, + 'VAL': [-100.0], + } + +bc1 = { + 'DEF': 'fixed', + 'DOF': 'all', + 'DIR': 'node', + 'LOC': {'x': 200, 'y': 0, 'z': 0}, + } + +bc2 = { + 'DEF': 'fixed', + 'DOF': 'ux', + 'DIR': 'node', + 'LOC': {'x': 0, 'y': 0, 'z': 0}, + } + +bc3 = { + 'DEF': 'fixed', + 'DOF': 'ux', + 'DIR': 'node', + 'LOC': {'x': 0, 'y': 100, 'z': 0}, + } + + +elementos = [[1,"plane41","material","geometria",[1, 2, 3, 4]], + [2,"plane41","material2","geometria2",[2, 5, 6, 3]]] + + +coordenadas = [[1, 0, 0, 0], + [2, 100, 0, 0], + [3, 100, 100, 0], + [4, 0, 100, 0], + [5, 200, 0, 0], + [6, 200, 100, 0]] + + +meshdata = {"ADD121": elementos, + "NODELIST": coordenadas, + "PROPMAT": [mat,mat2], + "PROPGEO": [geo,geo2], + "FORCES": [f1,f2,f3], + "BOUNDCOND": [bc1,bc2,bc3], + "QUADRATURE":{'meth':'gaussian','npp':4}, + } + +modelinfo = ModelGen.get_model(meshdata) + +print(modelinfo['inci']) + +previewset = {'RENDER': {'filename': 'tutorial_01a', 'show': True, 'scale': 10, 'savepng': True, 'lines': True}, + 'LABELS': {'show': True, 'lines': True, 'scale': 10}, + } + +preview_plot(previewset, modelinfo) + diff --git a/docs/tutoriais/forcas_boundcond/tutorial_02.py b/docs/tutoriais/forcas_boundcond/tutorial_02.py new file mode 100644 index 0000000..e3c0a3f --- /dev/null +++ b/docs/tutoriais/forcas_boundcond/tutorial_02.py @@ -0,0 +1,109 @@ +''' +myfempy Tutorial 02 + +Geração da malha por meio da opção legacy + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot +from math import pi + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'axial' + } + + +geo = { + "NAME": "geo", + "SEC":"I", + 'DIM':{'b':100,'h':150,'t':5,'d':5}} + +# Linha (malha beam 2) 500 mm + +meshdata = {"LEGACY": {'lx': 400, 'mesh': 'line2', 'elem': 'beam21', 'nx': 2}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02a', 'show': True, 'scale': 1, 'savepng': True, 'lines': True, 'cs': True}, + } + +preview_plot(previewset, modelinfo) + + +sys.exit() +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +# Retangulo estado plano (malha quad 4) 100 x 50 mm + +meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'quad4', 'elem': 'plane41', 'nx': 10, 'ny': 5}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02b', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + } + +preview_plot(previewset, modelinfo) + + +# Retangulo estado plano (malha tria 3) 100 x 50 mm + +meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'tria3', 'elem': 'plane31', 'nx': 10, 'ny': 5}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02c', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/forcas_boundcond/tutorial_03.py b/docs/tutoriais/forcas_boundcond/tutorial_03.py new file mode 100644 index 0000000..c597215 --- /dev/null +++ b/docs/tutoriais/forcas_boundcond/tutorial_03.py @@ -0,0 +1,221 @@ +''' +myfempy Tutorial 03 + +Geração da malha com gmsh + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + +# ---------------------------------------------------------- + +# Placa L estado plano (malha quad 4) 100 x 100 mm + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fy', +# 'DIR': 'edge', +# 'TAG': 3, +# 'VAL': [-1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'edge', +# 'TAG': 5, +# } + + +# points = [[0, 0, 0], +# [100, 0, 0], +# [100, 50, 0], +# [50, 50, 0], +# [50, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 4], +# [4, 5], +# [5, 6], +# [6, 1], +# ] + +# plane = [[1, 2, 3, 4, 5, 6]] + +# meshdata = {"GMSH": {'filename': 'tutorial_03a', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tria3', #tria3 +# 'elem': 'plane31', #plane31 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': 'all', +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_03a', +# 'show': True, +# 'scale': 5, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': True, +# 'edge': True}}, +# } + +# preview_plot(previewset, modelinfo) + + +# -------------------------------------------------- + +# # Placa H estado plano (malha quad 4) 100 x 100 mm + +f1 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 8, + 'VAL': [100.0], + } + +f2 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 10, + 'VAL': [-100.0], + } + +f3 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 4, + 'VAL': [100.0], + } + +f4 = { + 'DEF': 'forceedge', + 'DOF': 'fx', + 'DIR': 'edge', + 'TAG': 2, + 'VAL': [-100.0], + } + +bc1 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 3, + } + +bc2 = { + 'DEF': 'fixed', + 'DOF': 'uy', + 'DIR': 'edge', + 'TAG': 9, + } + +points = [ + [0, 0, 0], + [20, 0, 0], + [20, 30, 0], + [80, 30, 0], + [80, 0, 0], + [100, 0, 0], + [100, 100, 0], + [80, 100, 0], + [80, 70, 0], + [20, 70, 0], + [20, 100, 0], + [0, 100, 0], + ] + +lines = [[1, 2], + [2, 3], + [3, 4], + [4, 5], + [5, 6], + [6, 7], + [7, 8], + [8, 9], + [9, 10], + [10, 11], + [11, 12], + [12, 1], + ] + +plane = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]] + +meshdata = {"GMSH": {'filename': 'tutorial_03b', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'quad4', #tria3 + 'elem': 'plane41', #plane31 + 'sizeelement': 5, + 'meshmap': {'on': True, + 'edge': 'all', + # "numbernodes": 10, + } + } + }, + "PROPMAT": [mat], + "PROPGEO": [geo], + "FORCES": [f1, f2, f3, f4], + "BOUNDCOND": [bc1, bc2], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_03b', + 'show': True, + 'scale': 4, + 'savepng': True, + 'lines': True, + 'plottags': { + # 'point': True, + 'edge': True, + # 'surf': True + } + }, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/forcas_boundcond/tutorial_04.py b/docs/tutoriais/forcas_boundcond/tutorial_04.py new file mode 100644 index 0000000..e53583e --- /dev/null +++ b/docs/tutoriais/forcas_boundcond/tutorial_04.py @@ -0,0 +1,627 @@ +''' +myfempy Tutorial 04 + +Geração da malha com gmsh/ criação de curvas e furos e áreas compostas + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +import sys + +# Definição do material, geometria + +mat1 = { + "NAME": "material1", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +mat2 = { + "NAME": "material2", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo1 = { + "NAME": "geometria1", + "THICKN": 1.0 + } + +geo2 = { + "NAME": "geometria2", + "THICKN": 1.0 + } + + +# #----------------------------------------------------- + +# # 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fx', +# 'DIR': 'edge', +# 'TAG': 1, +# 'VAL': [1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'edge', +# 'TAG': 3, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'edge', +# 'TAG': 4, +# } + + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 5], +# [4, 1], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 5]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04a', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 5, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat1], +# "PROPGEO": [geo1], +# "FORCES": [f1], +# "BOUNDCOND": [bc1, bc2], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04a', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': True, +# 'edge': True}}, +# } + +# preview_plot(previewset, modelinfo) + + +# sys.exit() + + +#------------------------------------------ + +# # Placa completa multiplos furos (dia. 10, 10, 30 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 200, 0], +# [0, 200, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# ] + +# arcs = [[30, [150, 100, 0], ['0', '2*Pi']], # line 5 +# [10, [30, 150, 0], ['0', '2*Pi']], # line 6 +# [10, [30, 50, 0], ['0', '2*Pi']], # line 7 +# ] + +# plane = [[1, 2, 3, 4], +# [-5], +# [-6], +# [-7], +# # [5], +# # [6], +# # [7] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04b', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# # 'meshmap': {'on': True, +# # 'edge': [5], #'all' +# # "numbernodes": 60, +# # } +# } +# }, +# "PROPMAT": [mat1,mat2,mat2,mat2], +# "PROPGEO": [geo1,geo1,geo1,geo1], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04b', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 0.2}, +# } + +# preview_plot(previewset, modelinfo) + + + + +# # ------------------------------------------------------ + +# Placa completa furo quadrado central (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm + +points = [ + [0, 0, 0], + [200, 0, 0], + [200, 100, 0], + [0, 100, 0], + [75, 25, 0], + [125, 25, 0], + [125, 75, 0], + [75, 75, 0], + ] + + +lines = [[1, 2], # line 1 + [2, 3], # line 2 + [3, 4], # line 3 + [4, 1], # line 4 + [5, 6], # line 5 + [6, 7], # line 6 + [7, 8], # line 7 + [8, 5], # line 8 + ] + + +plane = [[1, 2, 3, 4], + [-5, -6, -7, -8], + # [5, 6, 7, 8] + ] + +meshdata = {"GMSH": {'filename': 'tutorial_04c', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'quad4', #quad4 + 'elem': 'plane41', #plane41 + 'sizeelement': 5, + 'meshmap': {'on': True, + 'edge': 'all', #'all' + # "numbernodes": 10, + } + } + }, + "PROPMAT": [mat1,mat2], + "PROPGEO": [geo1,geo2], + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_04c', + 'show': True, 'scale': 2, + 'savepng': True, + 'lines': True, + 'plottags': { + 'point': True, + # 'edge': True, + # 'surf': True + }}, + 'LABELS': {'show': True, 'lines': True, 'scale': 0.1}, + } + +preview_plot(previewset, modelinfo) + + + +# ------------------------------------------------------ + +# Duas Placa composta estado plano (malha quad 4) 200 x 200 mm + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fx', +# 'DIR': 'edge', +# 'TAG': 6, +# 'VAL': [1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'edge', +# 'TAG': 4, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'edge', +# 'TAG': 3, +# } + +# bc3 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'edge', +# 'TAG': 1, +# } + + +# points = [ +# [0, 0, 0], # point 1 +# [100, 0, 0], # point 2 +# [100, 100, 0], # point 3 +# [0, 100, 0], # point 4 +# [200, 0, 0], # point 5 +# [200, 100, 0], # point 6 +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [2, 5], # line 5 +# [5, 6], # line 6 +# [6, 3], # line 7 +# ] + + +# plane = [[1, 2, 3, 4], # plane 1 +# [5, 6, 7, 2], # plane 2 +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04d', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 50, +# 'meshmap': {'on': True, +# 'edge': [2, 5, 6, 7], #'all' +# "numbernodes": 5, +# } +# } +# }, +# "PROPMAT": [mat1, mat2], +# "PROPGEO": [geo1, geo2], +# "FORCES": [f1], +# "BOUNDCOND": [bc1, bc2, bc3], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04d', +# 'show': True, 'scale': 5, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True, +# # 'surf': True +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 0.5}, +# } + +# preview_plot(previewset, modelinfo) + + +# ------------------------------------------------------ + +# # Duas Placa composta com furo em 0,0,0 (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [100, 0, 0], # point 1 +# [100, 100, 0], # point 2 +# [0, 100, 0], # point 3 +# [200, 0, 0], # point 4 +# [200, 100, 0], # point 5 +# ] + + +# lines = [ +# [6, 1], # line 1 +# [1, 2], # line 2 +# [2, 3], # line 3 +# [3, 7], # line 4 +# [1, 4], # line 5 +# [4, 5], # line 6 +# [5, 2], # line 7 +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']], # line 8 +# ] + +# plane = [[1, 2, 3, 4, 8], # plane 1 +# [5, 6, 7, 2], # plane 2 +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04e', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tria3', #quad4 +# 'elem': 'plane31', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': [8], #'all' +# "numbernodes": 20, +# } +# } +# }, +# "PROPMAT": [mat1,mat2], +# "PROPGEO": [geo1,geo2], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04e', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True, +# # 'surf': True +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + +# ----------------------------------- + +# # disco (dia. 200 mm) com furo central (dia. 100 mm) estado plano (malha quad 4) + +# points = [ +# # [100, 0, 0], +# # [100, 100, 0], +# # [0, 100, 0], +# ] + +# lines = [ +# # [1, 2], +# # [2, 3], +# # [3, 5], +# # [4, 1], +# ] + +# arcs = [[200, [0, 0, 0], ['0', '2*Pi']],[100, [0, 0, 0], ['0', '2*Pi']]] + +# plane = [[1],[-2]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04f', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'tria3', #quad4 +# 'elem': 'plane31', #plane41 +# 'sizeelement': 40, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 80, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04f', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# 'edge': True, +# # 'surf': True +# }}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + + +# ----------------------------------- + +# # 1/4 de placa com bara no furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# [0, 0, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 6], +# [5, 1], +# [4, 5], +# [6, 4], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 7],[5, 6, 7]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04g', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': [7], #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat1,mat2], +# "PROPGEO": [geo1,geo2], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04g', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True, +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 2}, +# } + +# preview_plot(previewset, modelinfo) + + +# #----------------------------------------------------- + +# 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm malha mapeada + + +# f1 = { +# 'DEF': 'forceedge', +# 'DOF': 'fx', +# 'DIR': 'edge', +# 'TAG': 1, +# 'VAL': [1000.0], +# } + +# bc1 = { +# 'DEF': 'fixed', +# 'DOF': 'ux', +# 'DIR': 'edge', +# 'TAG': 3, +# } + +# bc2 = { +# 'DEF': 'fixed', +# 'DOF': 'uy', +# 'DIR': 'edge', +# 'TAG': 4, +# } + + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], # 1 +# [2, 3], # 2 +# [3, 7], # 3 +# [4, 1], # 4 +# [2, 5], # 5 +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/4']], # 6 +# [50, [0, 0, 0], ['Pi/4', 'Pi/2']]] # 7 + +# plane = [[1, 5, 6, 4], +# [5, 2, 3, 7]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04h', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# "FORCES": [f1], +# "BOUNDCOND": [bc1, bc2], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04h', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True +# }}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 0.5}, +# } + +# preview_plot(previewset, modelinfo) diff --git a/docs/tutoriais/malha/tutorial_01.py b/docs/tutoriais/malha/tutorial_01.py new file mode 100644 index 0000000..1257e62 --- /dev/null +++ b/docs/tutoriais/malha/tutorial_01.py @@ -0,0 +1,143 @@ +''' +myfempy Tutorial 01 + +Geração da malha manual + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + +# force = { +# 'DEF': 'forceedge', +# 'DOF': 'fx', +# 'DIR': 'edgex', +# 'LOC': {'x': 0, 'y': 999, 'z': 0}, +# 'VAL': [1.0], +# } + +# bondcond = { +# 'DEF': 'fixed', +# 'DOF': 'all', +# 'DIR': 'edgey', +# 'LOC': {'x': 999, 'y': 0, 'z': 0}, +# } + +# Retangulo estado plano (malha quad 4) 100 x 50 mm + +elementos = [[1,"plane41","material","geometria",[1, 2, 3, 4]]] + + +coordenadas = [[1, 0, 0, 0], + [2, 100, 0, 0], + [3, 100, 50, 0], + [4, 0, 50, 0]] + + +meshdata = {"ADD121": elementos, + "NODELIST": coordenadas, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE":{'meth':'gaussian','npp':8}, + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_01a', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + } + +preview_plot(previewset, modelinfo) + +# Retangulo estado plano (malha tria 4) 50 x 50 mm/ teste de qualidade 'Aspect Ratio' + +elementos = [[1,"plane31","material","geometria",[1, 2, 4]], + [2,"plane31","material","geometria",[2, 3, 4]]] + + +coordenadas = [[1, 0, 0, 0], + [2, 50, 0, 0], + [3, 50, 40, 0], + [4, 0, 50, 0]] + + +meshdata = {"ADD121": elementos, + "NODELIST": coordenadas, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE":{'meth':'gaussian','npp':8}, + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_01b', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + 'QUALITY': {'show': True, 'method': 1, 'scale': 0.1}, + } + +preview_plot(previewset, modelinfo) + +# Solido 100 x 100 x 100 mm + +mat2 = { + "NAME": "material2", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'solid' + } + +geo2 = { + "NAME": "geometria2", + "THICKN": 0.0 + } + +elementos = [[1,"solid81","material2","geometria2",[1, 2, 3, 4, 5, 6, 7, 8]]] + +coordenadas = [[1, 0, 0, 0], + [2, 100, 0, 0], + [3, 100, 100, 0], + [4, 0, 100, 0], + [5, 0, 0, 100], + [6, 100, 0, 100], + [7, 100, 100, 100], + [8, 0, 100, 100]] + +meshdata = {"ADD121": elementos, + "NODELIST": coordenadas, + "PROPMAT": [mat2], + "PROPGEO": [geo2], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE":{'meth':'gaussian','npp':8}, + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_01c', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + 'LABELS': {'show': True, 'lines': True, 'scale': 10}, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/malha/tutorial_02.py b/docs/tutoriais/malha/tutorial_02.py new file mode 100644 index 0000000..e3c0a3f --- /dev/null +++ b/docs/tutoriais/malha/tutorial_02.py @@ -0,0 +1,109 @@ +''' +myfempy Tutorial 02 + +Geração da malha por meio da opção legacy + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot +from math import pi + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'axial' + } + + +geo = { + "NAME": "geo", + "SEC":"I", + 'DIM':{'b':100,'h':150,'t':5,'d':5}} + +# Linha (malha beam 2) 500 mm + +meshdata = {"LEGACY": {'lx': 400, 'mesh': 'line2', 'elem': 'beam21', 'nx': 2}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02a', 'show': True, 'scale': 1, 'savepng': True, 'lines': True, 'cs': True}, + } + +preview_plot(previewset, modelinfo) + + +sys.exit() +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +# Retangulo estado plano (malha quad 4) 100 x 50 mm + +meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'quad4', 'elem': 'plane41', 'nx': 10, 'ny': 5}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02b', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + } + +preview_plot(previewset, modelinfo) + + +# Retangulo estado plano (malha tria 3) 100 x 50 mm + +meshdata = {"LEGACY": {'lx': 100, 'ly': 50, 'mesh': 'tria3', 'elem': 'plane31', 'nx': 10, 'ny': 5}, + "PROPMAT": [mat], + "PROPGEO": [geo], + # "FORCES": [force], + # "BOUNDCOND": [bondcond], + # "QUADRATURE": {'meth': 'gaussian', 'npp': 4}, + # "DOMAIN":'structural' + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_02c', 'show': True, 'scale': 1, 'savepng': True, 'lines': True}, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/malha/tutorial_03.py b/docs/tutoriais/malha/tutorial_03.py new file mode 100644 index 0000000..21c2b0a --- /dev/null +++ b/docs/tutoriais/malha/tutorial_03.py @@ -0,0 +1,199 @@ +''' +myfempy Tutorial 03 + +Geração da malha com gmsh + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +# Retangulo estado plano (malha quad 4) 100 x 50 mm + + +points = [[0, 0, 0], + [100, 0, 0], + [100, 50, 0], + [0, 50, 0]] + +lines = [[1, 2], + [2, 3], + [3, 4], + [4, 1]] + +plane = [[1, 2, 3, 4]] + +meshdata = {"GMSH": {'filename': 'tutorial_03', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'tria3', #quad4 + 'elem': 'plane31', #plane41 + 'sizeelement': 5, + 'meshmap': {'on': True, + 'edge': [1, 2], #'all' + "numbernodes": 10, + } + } + }, + "PROPMAT": [mat], + "PROPGEO": [geo], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_03', + 'show': True, 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': {'point': True, + 'edge': True}}, + } + +# preview_plot(previewset, modelinfo) + + +# Placa L estado plano (malha quad 4) 100 x 100 mm + + +points = [[0, 0, 0], + [100, 0, 0], + [100, 50, 0], + [50, 50, 0], + [50, 100, 0], + [0, 100, 0], + ] + +lines = [[1, 2], + [2, 3], + [3, 4], + [4, 5], + [5, 6], + [6, 1], + ] + +plane = [[1, 2, 3, 4, 5, 6]] + +meshdata = {"GMSH": {'filename': 'tutorial_03', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'quad4', #tria3 + 'elem': 'plane41', #plane31 + 'sizeelement': 5, + 'meshmap': {'on': True, + 'edge': 'all', + # "numbernodes": 10, + } + } + }, + "PROPMAT": [mat], + "PROPGEO": [geo], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_03', + 'show': True, + 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': {'point': True, + 'edge': True}}, + } + +# preview_plot(previewset, modelinfo) + + +# Placa H estado plano (malha quad 4) 100 x 100 mm + + +points = [ + [0, 0, 0], + [20, 0, 0], + [20, 30, 0], + [80, 30, 0], + [80, 0, 0], + [100, 0, 0], + [100, 100, 0], + [80, 100, 0], + [80, 70, 0], + [20, 70, 0], + [20, 100, 0], + [0, 100, 0], + ] + +lines = [[1, 2], + [2, 3], + [3, 4], + [4, 5], + [5, 6], + [6, 7], + [7, 8], + [8, 9], + [9, 10], + [10, 11], + [11, 12], + [12, 1], + ] + +plane = [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]] + +meshdata = {"GMSH": {'filename': 'tutorial_03', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'quad4', #tria3 + 'elem': 'plane41', #plane31 + 'sizeelement': 5, + 'meshmap': {'on': True, + 'edge': 'all', + # "numbernodes": 10, + } + } + }, + "PROPMAT": [mat], + "PROPGEO": [geo], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_03', + 'show': True, + 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': { + 'point': True, + # 'edge': True + } + }, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/malha/tutorial_04.py b/docs/tutoriais/malha/tutorial_04.py new file mode 100644 index 0000000..aa1e9b1 --- /dev/null +++ b/docs/tutoriais/malha/tutorial_04.py @@ -0,0 +1,530 @@ +''' +myfempy Tutorial 04 + +Geração da malha com gmsh/ criação de curvas e furos e áreas compostas + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +# #----------------------------------------------------- + +# # 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 5], +# [4, 1], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 5]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04a', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 5, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04a', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': True, +# 'edge': True}}, +# } + +# preview_plot(previewset, modelinfo) + + +# sys.exit() + + +#------------------------------------------ + + +# # Placa completa multiplos furos (dia. 10, 10, 30 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 200, 0], +# [0, 200, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# ] + +# arcs = [[30, [150, 100, 0], ['0', '2*Pi']], # line 5 +# [10, [30, 150, 0], ['0', '2*Pi']], # line 6 +# [10, [30, 50, 0], ['0', '2*Pi']], # line 7 +# ] + +# plane = [[1, 2, 3, 4], +# [-5], +# [-6], +# [-7], +# [5], +# [6], +# [7] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04b', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# # 'meshmap': {'on': True, +# # 'edge': [5], #'all' +# # "numbernodes": 60, +# # } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04b', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True +# }}, +# 'LABELS': {'show': True, 'lines': True, 'scale': 0.2}, +# } + +# preview_plot(previewset, modelinfo) + + + + +# # ------------------------------------------------------ + +# # Placa completa furo quadrado central (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 100, 0], +# [0, 100, 0], +# [75, 25, 0], +# [125, 25, 0], +# [125, 75, 0], +# [75, 75, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [5, 6], # line 5 +# [6, 7], # line 6 +# [7, 8], # line 7 +# [8, 5], # line 8 +# ] + + +# plane = [[1, 2, 3, 4], +# [-5, -6, -7, -8], +# # [5, 6, 7, 8] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04c', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 2, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04c', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# 'point': True, +# # 'edge': True, +# # 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + + +# ------------------------------------------------------ + + +# # Duas Placa composta estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [0, 0, 0], # point 1 +# [100, 0, 0], # point 2 +# [100, 100, 0], # point 3 +# [0, 100, 0], # point 4 +# [200, 0, 0], # point 5 +# [200, 100, 0], # point 6 +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [2, 5], # line 5 +# [5, 6], # line 6 +# [6, 3], # line 7 +# ] + + +# plane = [[1, 2, 3, 4], # plane 1 +# [5, 6, 7, 2], # plane 2 +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04d', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 5, +# 'meshmap': {'on': True, +# 'edge': [2, 6], #'all' +# "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04d', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True, +# # 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + +# ------------------------------------------------------ + +# # Duas Placa composta com furo em 0,0,0 (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [100, 0, 0], # point 1 +# [100, 100, 0], # point 2 +# [0, 100, 0], # point 3 +# [200, 0, 0], # point 4 +# [200, 100, 0], # point 5 +# ] + + +# lines = [ +# [6, 1], # line 1 +# [1, 2], # line 2 +# [2, 3], # line 3 +# [3, 7], # line 4 +# [1, 4], # line 5 +# [4, 5], # line 6 +# [5, 2], # line 7 +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']], # line 8 +# ] + +# plane = [[1, 2, 3, 4, 8], # plane 1 +# [5, 6, 7, 2], # plane 2 +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_04e', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tria3', #quad4 +# 'elem': 'plane31', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': [8], #'all' +# "numbernodes": 20, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04e', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True, +# # 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + +# ----------------------------------- + +# # disco (dia. 200 mm) com furo central (dia. 100 mm) estado plano (malha quad 4) + +# points = [ +# # [100, 0, 0], +# # [100, 100, 0], +# # [0, 100, 0], +# ] + +# lines = [ +# # [1, 2], +# # [2, 3], +# # [3, 5], +# # [4, 1], +# ] + +# arcs = [[200, [0, 0, 0], ['0', '2*Pi']],[100, [0, 0, 0], ['0', '2*Pi']]] + +# plane = [[1],[-2]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04f', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'tria3', #quad4 +# 'elem': 'plane31', #plane41 +# 'sizeelement': 40, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 80, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04f', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# 'edge': True, +# # 'surf': True +# }}, +# # 'LABELS': {'show': True, 'lines': True, 'scale': 10}, +# } + +# preview_plot(previewset, modelinfo) + + +# ----------------------------------- + + +# # 1/4 de placa com bara no furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# [0, 0, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 6], +# [5, 1], +# [4, 5], +# [6, 4], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 7],[5, 6, 7]] + +# meshdata = {"GMSH": {'filename': 'tutorial_04g', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'quad4', #quad4 +# 'elem': 'plane41', #plane41 +# 'sizeelement': 10, +# 'meshmap': {'on': True, +# 'edge': [7], #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_04g', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True, +# }}, +# } + +# preview_plot(previewset, modelinfo) + + +# #----------------------------------------------------- + +# 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm malha mapeada + +points = [ + [100, 0, 0], + [100, 100, 0], + [0, 100, 0], +] + +lines = [[1, 2], # 1 + [2, 3], # 2 + [3, 7], # 3 + [4, 1], # 4 + [2, 5], # 5 + ] + +arcs = [[50, [0, 0, 0], ['0', 'Pi/4']], # 6 + [50, [0, 0, 0], ['Pi/4', 'Pi/2']]] # 7 + +plane = [[1, 5, 6, 4], + [5, 2, 3, 7]] + +meshdata = {"GMSH": {'filename': 'tutorial_04h', + 'pointlist': points, + 'linelist': lines, + 'planelist': plane, + 'arc': arcs, + 'meshconfig': { + 'mesh': 'quad4', #quad4 + 'elem': 'plane41', #plane41 + 'sizeelement': 10, + 'meshmap': {'on': True, + 'edge': 'all', #'all' + "numbernodes": 10, + } + } + }, + "PROPMAT": [mat], + "PROPGEO": [geo], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_04h', + 'show': True, 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': { + 'point': True, + # 'edge': True + }}, + # 'LABELS': {'show': True, 'lines': True, 'scale': 0.5}, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/malha/tutorial_05.py b/docs/tutoriais/malha/tutorial_05.py new file mode 100644 index 0000000..e2ddff5 --- /dev/null +++ b/docs/tutoriais/malha/tutorial_05.py @@ -0,0 +1,361 @@ +''' +myfempy Tutorial 05 + +Geração da malha com gmsh/ solidos + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +# #----------------------------------------------------- + +# 1/4 de placa com furo central (dia. 100 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [100, 0, 0], +# [100, 100, 0], +# [0, 100, 0], +# ] + +# lines = [[1, 2], +# [2, 3], +# [3, 5], +# [4, 1], +# ] + +# arcs = [[50, [0, 0, 0], ['0', 'Pi/2']]] + +# plane = [[1, 2, 3, 4, 5]] + +# meshdata = {"GMSH": {'filename': 'tutorial_05a', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'arc': arcs, +# 'meshconfig': { +# 'mesh': 'tetr4', #tetr4 hexa8 +# 'elem': 'solid41', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05a', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': True, +# 'edge': True}}, +# } + +# preview_plot(previewset, modelinfo) + + +#------------------------------------------ + + +# # Placa completa multiplos furos (dia. 10, 10, 30 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 200, 0], +# [0, 200, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# ] + +# arcs = [[30, [150, 100, 0], ['0', '2*Pi']], # line 5 +# [10, [30, 150, 0], ['0', '2*Pi']], # line 6 +# [10, [30, 50, 0], ['0', '2*Pi']], # line 7 +# ] + +# plane = [[1, 2, 3, 4], +# [-5], +# [-6], +# [-7], +# # [5], +# # [6], +# # [7] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_05b', +# 'pointlist': points, +# 'linelist': lines, +# 'arc': arcs, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tetr4', #tetr4 hexa8 +# 'elem': 'solid41', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05b', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# # 'edge': True, +# 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + + + +# # ------------------------------------------------------ + +# # Placa completa furo quadrado central (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [0, 0, 0], +# [200, 0, 0], +# [200, 100, 0], +# [0, 100, 0], +# [75, 25, 0], +# [125, 25, 0], +# [125, 75, 0], +# [75, 75, 0], +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [5, 6], # line 5 +# [6, 7], # line 6 +# [7, 8], # line 7 +# [8, 5], # line 8 +# ] + + +# plane = [[1, 2, 3, 4], +# [-5, -6, -7, -8], +# # [5, 6, 7, 8] +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_05c', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'hexa8', #tetr4 hexa8 +# 'elem': 'solid81', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': 'all', #'all' +# # "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05c', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# 'point': True, +# # 'edge': True, +# # 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + + +# ------------------------------------------------------ + + +# # Duas Placa composta estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +# points = [ +# [0, 0, 0], # point 1 +# [100, 0, 0], # point 2 +# [100, 100, 0], # point 3 +# [0, 100, 0], # point 4 +# [200, 0, 0], # point 5 +# [200, 100, 0], # point 6 +# ] + + +# lines = [[1, 2], # line 1 +# [2, 3], # line 2 +# [3, 4], # line 3 +# [4, 1], # line 4 +# [2, 5], # line 5 +# [5, 6], # line 6 +# [6, 3], # line 7 +# ] + + +# plane = [[1, 2, 3, 4], # plane 1 +# [5, 6, 7, 2], # plane 2 +# ] + +# meshdata = {"GMSH": {'filename': 'tutorial_05d', +# 'pointlist': points, +# 'linelist': lines, +# 'planelist': plane, +# 'meshconfig': { +# 'mesh': 'tetr4', #tetr4 hexa8 +# 'elem': 'solid41', #solid41 solid81 +# 'sizeelement': 5, +# 'extrude': 20, +# 'meshmap': {'on': True, +# 'edge': [2, 6], #'all' +# "numbernodes": 10, +# } +# } +# }, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_05d', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': { +# # 'point': True, +# 'edge': True, +# # 'surf': True +# }}, +# } + +# preview_plot(previewset, modelinfo) + + +# # ------------------------------------------------------ + + +# Duas Placa composta com furo em 0,0,0 (dia. 50 mm) estado plano (malha quad 4) 200 x 200 mm, espessura da placa de 20 mm + +points = [ + [100, 0, 0], # point 1 + [100, 100, 0], # point 2 + [0, 100, 0], # point 3 + [200, 0, 0], # point 4 + [200, 100, 0], # point 5 + ] + + +lines = [ + [6, 1], # line 1 + [1, 2], # line 2 + [2, 3], # line 3 + [3, 7], # line 4 + [1, 4], # line 5 + [4, 5], # line 6 + [5, 2], # line 7 + ] + +arcs = [[50, [0, 0, 0], ['0', 'Pi/2']], # line 8 + ] + +plane = [[1, 2, 3, 4, 8], # plane 1 + [5, 6, 7, 2], # plane 2 + ] + +meshdata = {"GMSH": {'filename': 'tutorial_05e', + 'pointlist': points, + 'linelist': lines, + 'arc': arcs, + 'planelist': plane, + 'meshconfig': { + 'mesh': 'tetr4', #tetr4 hexa8 + 'elem': 'solid41', #solid41 solid81 + 'sizeelement': 5, + 'extrude': 20, + 'meshmap': {'on': False, + 'edge': 'all', + "numbernodes": 20, + } + } + }, + "PROPMAT": [mat], + "PROPGEO": [geo], + } + + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_05e', + 'show': True, 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': { + # 'point': True, + # 'edge': True, + 'surf': True + }}, + } + +preview_plot(previewset, modelinfo) + diff --git a/docs/tutoriais/malha/tutorial_06.py b/docs/tutoriais/malha/tutorial_06.py new file mode 100644 index 0000000..3d72457 --- /dev/null +++ b/docs/tutoriais/malha/tutorial_06.py @@ -0,0 +1,82 @@ +''' +myfempy Tutorial 06 + +Geração da malha com gmsh/ importação de modelos cad (.stp/ .step) e malha (.vtk) externa + +Necessario instalação prévia do gmsh (não nativo do myfempy) + +''' + +# Imports + +from myfempy import ModelGen +from myfempy import Solver +from myfempy import PostProcess +from myfempy import postproc_plot +from myfempy import preview_plot + +import sys + +# Definição do material, geometria + +mat = { + "NAME": "material", + "VXX": 0.25, + "EXX": 200E6, + "MAT": 'isotropic', + "DEF": 'planestress' + } + +geo = { + "NAME": "geometria", + "THICKN": 1.0 + } + + +#--------------------------------------------- + + +# # import cad .stp + +# meshdata = {"GMSH": {'filename': 'tutorial_06a', +# 'cadimport': {'object': 'tutorial_06_cad.stp'}, +# 'meshconfig': {'mesh': 'tetr4', 'elem': 'solid41', 'sizeelement': 10}}, +# "PROPMAT": [mat], +# "PROPGEO": [geo], +# } + +# modelinfo = ModelGen.get_model(meshdata) + +# previewset = {'RENDER': {'filename': 'tutorial_06a', +# 'show': True, 'scale': 10, +# 'savepng': True, +# 'lines': True, +# 'plottags': {'point': False, +# 'edge': False}}, +# } + +# preview_plot(previewset, modelinfo) + + +# ---------------------------------------------------- + +# import mesh .vtk + +meshdata = {"GMSH": {'filename': 'tutorial_06b', + 'meshimport':{'object':'tutorial_06_mesh'}, + 'meshconfig': {'mesh': 'tetr4', 'elem': 'solid41', 'sizeelement': 10}}, + "PROPMAT": [mat], + "PROPGEO": [geo], + } + +modelinfo = ModelGen.get_model(meshdata) + +previewset = {'RENDER': {'filename': 'tutorial_06b', + 'show': True, 'scale': 10, + 'savepng': True, + 'lines': True, + 'plottags': {'point': False, + 'surf': True}}, + } + +preview_plot(previewset, modelinfo) \ No newline at end of file diff --git a/docs/tutoriais/malha/tutorial_06_cad.stp b/docs/tutoriais/malha/tutorial_06_cad.stp new file mode 100644 index 0000000..7c56334 --- /dev/null +++ b/docs/tutoriais/malha/tutorial_06_cad.stp @@ -0,0 +1,613 @@ +ISO-10303-21; +HEADER; +/* Generated by software containing ST-Developer + * from STEP Tools, Inc. (www.steptools.com) + */ +/* OPTION: strings as raw bytes, not using required /X/ escapes */ + +FILE_DESCRIPTION( +/* description */ ('Unknown'), +/* implementation_level */ '2;1'); + +FILE_NAME( +/* name */ 'chapa', +/* time_stamp */ '2022-05-27T10:16:08-03:00', +/* author */ ('Unknown'), +/* organization */ ('Unknown'), +/* preprocessor_version */ 'ST-DEVELOPER v18.1', +/* originating_system */ 'Solid Edge', +/* authorisation */ 'Unknown'); + +FILE_SCHEMA (('AUTOMOTIVE_DESIGN {1 0 10303 214 3 1 1}')); +ENDSEC; + +DATA; +#10=PROPERTY_DEFINITION_REPRESENTATION(#14,#12); +#11=PROPERTY_DEFINITION_REPRESENTATION(#15,#13); +#12=REPRESENTATION('',(#16),#557); +#13=REPRESENTATION('',(#17),#557); +#14=PROPERTY_DEFINITION('pmi validation property','',#562); +#15=PROPERTY_DEFINITION('pmi validation property','',#562); +#16=VALUE_REPRESENTATION_ITEM('number of annotations',COUNT_MEASURE(0.)); +#17=VALUE_REPRESENTATION_ITEM('number of views',COUNT_MEASURE(0.)); +#18=SHAPE_REPRESENTATION_RELATIONSHIP('','',#345,#19); +#19=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#343),#557); +#20=PLANE('',#350); +#21=PLANE('',#351); +#22=PLANE('',#352); +#23=PLANE('',#356); +#24=PLANE('',#357); +#25=PLANE('',#361); +#26=PLANE('',#362); +#27=PLANE('',#363); +#28=PLANE('',#367); +#29=PLANE('',#371); +#30=PLANE('',#372); +#31=PLANE('',#373); +#32=LINE('',#469,#66); +#33=LINE('',#473,#67); +#34=LINE('',#475,#68); +#35=LINE('',#477,#69); +#36=LINE('',#479,#70); +#37=LINE('',#481,#71); +#38=LINE('',#483,#72); +#39=LINE('',#485,#73); +#40=LINE('',#487,#74); +#41=LINE('',#489,#75); +#42=LINE('',#491,#76); +#43=LINE('',#495,#77); +#44=LINE('',#499,#78); +#45=LINE('',#501,#79); +#46=LINE('',#503,#80); +#47=LINE('',#505,#81); +#48=LINE('',#507,#82); +#49=LINE('',#509,#83); +#50=LINE('',#513,#84); +#51=LINE('',#517,#85); +#52=LINE('',#519,#86); +#53=LINE('',#521,#87); +#54=LINE('',#523,#88); +#55=LINE('',#525,#89); +#56=LINE('',#527,#90); +#57=LINE('',#529,#91); +#58=LINE('',#531,#92); +#59=LINE('',#533,#93); +#60=LINE('',#537,#94); +#61=LINE('',#541,#95); +#62=LINE('',#543,#96); +#63=LINE('',#545,#97); +#64=LINE('',#552,#98); +#65=LINE('',#553,#99); +#66=VECTOR('',#380,1000.); +#67=VECTOR('',#383,1000.); +#68=VECTOR('',#386,1000.); +#69=VECTOR('',#387,1000.); +#70=VECTOR('',#388,1000.); +#71=VECTOR('',#391,1000.); +#72=VECTOR('',#392,1000.); +#73=VECTOR('',#393,1000.); +#74=VECTOR('',#396,1000.); +#75=VECTOR('',#397,1000.); +#76=VECTOR('',#398,1000.); +#77=VECTOR('',#403,1000.); +#78=VECTOR('',#408,1000.); +#79=VECTOR('',#409,1000.); +#80=VECTOR('',#410,1000.); +#81=VECTOR('',#413,1000.); +#82=VECTOR('',#414,1000.); +#83=VECTOR('',#415,1000.); +#84=VECTOR('',#420,1000.); +#85=VECTOR('',#425,1000.); +#86=VECTOR('',#426,1000.); +#87=VECTOR('',#427,1000.); +#88=VECTOR('',#430,1000.); +#89=VECTOR('',#431,1000.); +#90=VECTOR('',#432,1000.); +#91=VECTOR('',#435,1000.); +#92=VECTOR('',#436,1000.); +#93=VECTOR('',#437,1000.); +#94=VECTOR('',#442,1000.); +#95=VECTOR('',#447,1000.); +#96=VECTOR('',#448,1000.); +#97=VECTOR('',#449,1000.); +#98=VECTOR('',#458,1000.); +#99=VECTOR('',#459,1000.); +#100=ORIENTED_EDGE('',*,*,#188,.T.); +#101=ORIENTED_EDGE('',*,*,#189,.F.); +#102=ORIENTED_EDGE('',*,*,#190,.F.); +#103=ORIENTED_EDGE('',*,*,#191,.T.); +#104=ORIENTED_EDGE('',*,*,#192,.T.); +#105=ORIENTED_EDGE('',*,*,#193,.F.); +#106=ORIENTED_EDGE('',*,*,#194,.F.); +#107=ORIENTED_EDGE('',*,*,#189,.T.); +#108=ORIENTED_EDGE('',*,*,#195,.T.); +#109=ORIENTED_EDGE('',*,*,#196,.F.); +#110=ORIENTED_EDGE('',*,*,#197,.F.); +#111=ORIENTED_EDGE('',*,*,#193,.T.); +#112=ORIENTED_EDGE('',*,*,#198,.T.); +#113=ORIENTED_EDGE('',*,*,#199,.F.); +#114=ORIENTED_EDGE('',*,*,#200,.F.); +#115=ORIENTED_EDGE('',*,*,#196,.T.); +#116=ORIENTED_EDGE('',*,*,#201,.T.); +#117=ORIENTED_EDGE('',*,*,#202,.F.); +#118=ORIENTED_EDGE('',*,*,#203,.F.); +#119=ORIENTED_EDGE('',*,*,#199,.T.); +#120=ORIENTED_EDGE('',*,*,#204,.T.); +#121=ORIENTED_EDGE('',*,*,#205,.F.); +#122=ORIENTED_EDGE('',*,*,#206,.F.); +#123=ORIENTED_EDGE('',*,*,#202,.T.); +#124=ORIENTED_EDGE('',*,*,#207,.T.); +#125=ORIENTED_EDGE('',*,*,#208,.F.); +#126=ORIENTED_EDGE('',*,*,#209,.F.); +#127=ORIENTED_EDGE('',*,*,#205,.T.); +#128=ORIENTED_EDGE('',*,*,#210,.T.); +#129=ORIENTED_EDGE('',*,*,#211,.F.); +#130=ORIENTED_EDGE('',*,*,#212,.F.); +#131=ORIENTED_EDGE('',*,*,#208,.T.); +#132=ORIENTED_EDGE('',*,*,#213,.T.); +#133=ORIENTED_EDGE('',*,*,#214,.F.); +#134=ORIENTED_EDGE('',*,*,#215,.F.); +#135=ORIENTED_EDGE('',*,*,#211,.T.); +#136=ORIENTED_EDGE('',*,*,#216,.T.); +#137=ORIENTED_EDGE('',*,*,#217,.F.); +#138=ORIENTED_EDGE('',*,*,#218,.F.); +#139=ORIENTED_EDGE('',*,*,#214,.T.); +#140=ORIENTED_EDGE('',*,*,#219,.T.); +#141=ORIENTED_EDGE('',*,*,#220,.F.); +#142=ORIENTED_EDGE('',*,*,#221,.F.); +#143=ORIENTED_EDGE('',*,*,#217,.T.); +#144=ORIENTED_EDGE('',*,*,#222,.T.); +#145=ORIENTED_EDGE('',*,*,#223,.F.); +#146=ORIENTED_EDGE('',*,*,#224,.F.); +#147=ORIENTED_EDGE('',*,*,#220,.T.); +#148=ORIENTED_EDGE('',*,*,#225,.T.); +#149=ORIENTED_EDGE('',*,*,#226,.F.); +#150=ORIENTED_EDGE('',*,*,#227,.F.); +#151=ORIENTED_EDGE('',*,*,#223,.T.); +#152=ORIENTED_EDGE('',*,*,#228,.F.); +#153=ORIENTED_EDGE('',*,*,#229,.T.); +#154=ORIENTED_EDGE('',*,*,#230,.T.); +#155=ORIENTED_EDGE('',*,*,#191,.F.); +#156=ORIENTED_EDGE('',*,*,#231,.F.); +#157=ORIENTED_EDGE('',*,*,#226,.T.); +#158=ORIENTED_EDGE('',*,*,#228,.T.); +#159=ORIENTED_EDGE('',*,*,#190,.T.); +#160=ORIENTED_EDGE('',*,*,#194,.T.); +#161=ORIENTED_EDGE('',*,*,#197,.T.); +#162=ORIENTED_EDGE('',*,*,#200,.T.); +#163=ORIENTED_EDGE('',*,*,#203,.T.); +#164=ORIENTED_EDGE('',*,*,#206,.T.); +#165=ORIENTED_EDGE('',*,*,#209,.T.); +#166=ORIENTED_EDGE('',*,*,#212,.T.); +#167=ORIENTED_EDGE('',*,*,#215,.T.); +#168=ORIENTED_EDGE('',*,*,#218,.T.); +#169=ORIENTED_EDGE('',*,*,#221,.T.); +#170=ORIENTED_EDGE('',*,*,#224,.T.); +#171=ORIENTED_EDGE('',*,*,#227,.T.); +#172=ORIENTED_EDGE('',*,*,#231,.T.); +#173=ORIENTED_EDGE('',*,*,#229,.F.); +#174=ORIENTED_EDGE('',*,*,#188,.F.); +#175=ORIENTED_EDGE('',*,*,#230,.F.); +#176=ORIENTED_EDGE('',*,*,#225,.F.); +#177=ORIENTED_EDGE('',*,*,#222,.F.); +#178=ORIENTED_EDGE('',*,*,#219,.F.); +#179=ORIENTED_EDGE('',*,*,#216,.F.); +#180=ORIENTED_EDGE('',*,*,#213,.F.); +#181=ORIENTED_EDGE('',*,*,#210,.F.); +#182=ORIENTED_EDGE('',*,*,#207,.F.); +#183=ORIENTED_EDGE('',*,*,#204,.F.); +#184=ORIENTED_EDGE('',*,*,#201,.F.); +#185=ORIENTED_EDGE('',*,*,#198,.F.); +#186=ORIENTED_EDGE('',*,*,#195,.F.); +#187=ORIENTED_EDGE('',*,*,#192,.F.); +#188=EDGE_CURVE('',#232,#233,#262,.T.); +#189=EDGE_CURVE('',#234,#233,#32,.T.); +#190=EDGE_CURVE('',#235,#234,#263,.T.); +#191=EDGE_CURVE('',#235,#232,#33,.T.); +#192=EDGE_CURVE('',#233,#236,#34,.T.); +#193=EDGE_CURVE('',#237,#236,#35,.T.); +#194=EDGE_CURVE('',#234,#237,#36,.T.); +#195=EDGE_CURVE('',#236,#238,#37,.T.); +#196=EDGE_CURVE('',#239,#238,#38,.T.); +#197=EDGE_CURVE('',#237,#239,#39,.T.); +#198=EDGE_CURVE('',#238,#240,#40,.T.); +#199=EDGE_CURVE('',#241,#240,#41,.T.); +#200=EDGE_CURVE('',#239,#241,#42,.T.); +#201=EDGE_CURVE('',#240,#242,#264,.T.); +#202=EDGE_CURVE('',#243,#242,#43,.T.); +#203=EDGE_CURVE('',#241,#243,#265,.T.); +#204=EDGE_CURVE('',#242,#244,#44,.T.); +#205=EDGE_CURVE('',#245,#244,#45,.T.); +#206=EDGE_CURVE('',#243,#245,#46,.T.); +#207=EDGE_CURVE('',#244,#246,#47,.T.); +#208=EDGE_CURVE('',#247,#246,#48,.T.); +#209=EDGE_CURVE('',#245,#247,#49,.T.); +#210=EDGE_CURVE('',#246,#248,#266,.T.); +#211=EDGE_CURVE('',#249,#248,#50,.T.); +#212=EDGE_CURVE('',#247,#249,#267,.T.); +#213=EDGE_CURVE('',#248,#250,#51,.T.); +#214=EDGE_CURVE('',#251,#250,#52,.T.); +#215=EDGE_CURVE('',#249,#251,#53,.T.); +#216=EDGE_CURVE('',#250,#252,#54,.T.); +#217=EDGE_CURVE('',#253,#252,#55,.T.); +#218=EDGE_CURVE('',#251,#253,#56,.T.); +#219=EDGE_CURVE('',#252,#254,#57,.T.); +#220=EDGE_CURVE('',#255,#254,#58,.T.); +#221=EDGE_CURVE('',#253,#255,#59,.T.); +#222=EDGE_CURVE('',#254,#256,#268,.T.); +#223=EDGE_CURVE('',#257,#256,#60,.T.); +#224=EDGE_CURVE('',#255,#257,#269,.T.); +#225=EDGE_CURVE('',#256,#258,#61,.T.); +#226=EDGE_CURVE('',#259,#258,#62,.T.); +#227=EDGE_CURVE('',#257,#259,#63,.T.); +#228=EDGE_CURVE('',#260,#260,#270,.T.); +#229=EDGE_CURVE('',#261,#261,#271,.T.); +#230=EDGE_CURVE('',#258,#232,#64,.T.); +#231=EDGE_CURVE('',#259,#235,#65,.T.); +#232=VERTEX_POINT('',#467); +#233=VERTEX_POINT('',#468); +#234=VERTEX_POINT('',#470); +#235=VERTEX_POINT('',#472); +#236=VERTEX_POINT('',#476); +#237=VERTEX_POINT('',#478); +#238=VERTEX_POINT('',#482); +#239=VERTEX_POINT('',#484); +#240=VERTEX_POINT('',#488); +#241=VERTEX_POINT('',#490); +#242=VERTEX_POINT('',#494); +#243=VERTEX_POINT('',#496); +#244=VERTEX_POINT('',#500); +#245=VERTEX_POINT('',#502); +#246=VERTEX_POINT('',#506); +#247=VERTEX_POINT('',#508); +#248=VERTEX_POINT('',#512); +#249=VERTEX_POINT('',#514); +#250=VERTEX_POINT('',#518); +#251=VERTEX_POINT('',#520); +#252=VERTEX_POINT('',#524); +#253=VERTEX_POINT('',#526); +#254=VERTEX_POINT('',#530); +#255=VERTEX_POINT('',#532); +#256=VERTEX_POINT('',#536); +#257=VERTEX_POINT('',#538); +#258=VERTEX_POINT('',#542); +#259=VERTEX_POINT('',#544); +#260=VERTEX_POINT('',#548); +#261=VERTEX_POINT('',#550); +#262=CIRCLE('',#348,50.); +#263=CIRCLE('',#349,50.); +#264=CIRCLE('',#354,50.); +#265=CIRCLE('',#355,50.); +#266=CIRCLE('',#359,20.); +#267=CIRCLE('',#360,20.); +#268=CIRCLE('',#365,20.); +#269=CIRCLE('',#366,20.); +#270=CIRCLE('',#369,30.); +#271=CIRCLE('',#370,30.); +#272=EDGE_LOOP('',(#100,#101,#102,#103)); +#273=EDGE_LOOP('',(#104,#105,#106,#107)); +#274=EDGE_LOOP('',(#108,#109,#110,#111)); +#275=EDGE_LOOP('',(#112,#113,#114,#115)); +#276=EDGE_LOOP('',(#116,#117,#118,#119)); +#277=EDGE_LOOP('',(#120,#121,#122,#123)); +#278=EDGE_LOOP('',(#124,#125,#126,#127)); +#279=EDGE_LOOP('',(#128,#129,#130,#131)); +#280=EDGE_LOOP('',(#132,#133,#134,#135)); +#281=EDGE_LOOP('',(#136,#137,#138,#139)); +#282=EDGE_LOOP('',(#140,#141,#142,#143)); +#283=EDGE_LOOP('',(#144,#145,#146,#147)); +#284=EDGE_LOOP('',(#148,#149,#150,#151)); +#285=EDGE_LOOP('',(#152)); +#286=EDGE_LOOP('',(#153)); +#287=EDGE_LOOP('',(#154,#155,#156,#157)); +#288=EDGE_LOOP('',(#158)); +#289=EDGE_LOOP('',(#159,#160,#161,#162,#163,#164,#165,#166,#167,#168,#169, +#170,#171,#172)); +#290=EDGE_LOOP('',(#173)); +#291=EDGE_LOOP('',(#174,#175,#176,#177,#178,#179,#180,#181,#182,#183,#184, +#185,#186,#187)); +#292=FACE_BOUND('',#272,.T.); +#293=FACE_BOUND('',#273,.T.); +#294=FACE_BOUND('',#274,.T.); +#295=FACE_BOUND('',#275,.T.); +#296=FACE_BOUND('',#276,.T.); +#297=FACE_BOUND('',#277,.T.); +#298=FACE_BOUND('',#278,.T.); +#299=FACE_BOUND('',#279,.T.); +#300=FACE_BOUND('',#280,.T.); +#301=FACE_BOUND('',#281,.T.); +#302=FACE_BOUND('',#282,.T.); +#303=FACE_BOUND('',#283,.T.); +#304=FACE_BOUND('',#284,.T.); +#305=FACE_BOUND('',#285,.T.); +#306=FACE_BOUND('',#286,.T.); +#307=FACE_BOUND('',#287,.T.); +#308=FACE_BOUND('',#288,.T.); +#309=FACE_BOUND('',#289,.T.); +#310=FACE_BOUND('',#290,.T.); +#311=FACE_BOUND('',#291,.T.); +#312=CYLINDRICAL_SURFACE('',#347,50.); +#313=CYLINDRICAL_SURFACE('',#353,50.); +#314=CYLINDRICAL_SURFACE('',#358,20.); +#315=CYLINDRICAL_SURFACE('',#364,20.); +#316=CYLINDRICAL_SURFACE('',#368,30.); +#317=ADVANCED_FACE('',(#292),#312,.F.); +#318=ADVANCED_FACE('',(#293),#20,.F.); +#319=ADVANCED_FACE('',(#294),#21,.F.); +#320=ADVANCED_FACE('',(#295),#22,.F.); +#321=ADVANCED_FACE('',(#296),#313,.F.); +#322=ADVANCED_FACE('',(#297),#23,.F.); +#323=ADVANCED_FACE('',(#298),#24,.F.); +#324=ADVANCED_FACE('',(#299),#314,.F.); +#325=ADVANCED_FACE('',(#300),#25,.F.); +#326=ADVANCED_FACE('',(#301),#26,.F.); +#327=ADVANCED_FACE('',(#302),#27,.F.); +#328=ADVANCED_FACE('',(#303),#315,.F.); +#329=ADVANCED_FACE('',(#304),#28,.F.); +#330=ADVANCED_FACE('',(#305,#306),#316,.F.); +#331=ADVANCED_FACE('',(#307),#29,.F.); +#332=ADVANCED_FACE('',(#308,#309),#30,.F.); +#333=ADVANCED_FACE('',(#310,#311),#31,.T.); +#334=CLOSED_SHELL('',(#317,#318,#319,#320,#321,#322,#323,#324,#325,#326, +#327,#328,#329,#330,#331,#332,#333)); +#335=STYLED_ITEM('',(#336),#343); +#336=PRESENTATION_STYLE_ASSIGNMENT((#337)); +#337=SURFACE_STYLE_USAGE(.BOTH.,#338); +#338=SURFACE_SIDE_STYLE('',(#339)); +#339=SURFACE_STYLE_FILL_AREA(#340); +#340=FILL_AREA_STYLE('',(#341)); +#341=FILL_AREA_STYLE_COLOUR('',#342); +#342=COLOUR_RGB('',0.506983280181885,0.531564235687256,0.550000011920929); +#343=MANIFOLD_SOLID_BREP('',#334); +#344=SHAPE_DEFINITION_REPRESENTATION(#562,#345); +#345=SHAPE_REPRESENTATION('Part1',(#346),#557); +#346=AXIS2_PLACEMENT_3D('',#464,#374,#375); +#347=AXIS2_PLACEMENT_3D('',#465,#376,#377); +#348=AXIS2_PLACEMENT_3D('',#466,#378,#379); +#349=AXIS2_PLACEMENT_3D('',#471,#381,#382); +#350=AXIS2_PLACEMENT_3D('',#474,#384,#385); +#351=AXIS2_PLACEMENT_3D('',#480,#389,#390); +#352=AXIS2_PLACEMENT_3D('',#486,#394,#395); +#353=AXIS2_PLACEMENT_3D('',#492,#399,#400); +#354=AXIS2_PLACEMENT_3D('',#493,#401,#402); +#355=AXIS2_PLACEMENT_3D('',#497,#404,#405); +#356=AXIS2_PLACEMENT_3D('',#498,#406,#407); +#357=AXIS2_PLACEMENT_3D('',#504,#411,#412); +#358=AXIS2_PLACEMENT_3D('',#510,#416,#417); +#359=AXIS2_PLACEMENT_3D('',#511,#418,#419); +#360=AXIS2_PLACEMENT_3D('',#515,#421,#422); +#361=AXIS2_PLACEMENT_3D('',#516,#423,#424); +#362=AXIS2_PLACEMENT_3D('',#522,#428,#429); +#363=AXIS2_PLACEMENT_3D('',#528,#433,#434); +#364=AXIS2_PLACEMENT_3D('',#534,#438,#439); +#365=AXIS2_PLACEMENT_3D('',#535,#440,#441); +#366=AXIS2_PLACEMENT_3D('',#539,#443,#444); +#367=AXIS2_PLACEMENT_3D('',#540,#445,#446); +#368=AXIS2_PLACEMENT_3D('',#546,#450,#451); +#369=AXIS2_PLACEMENT_3D('',#547,#452,#453); +#370=AXIS2_PLACEMENT_3D('',#549,#454,#455); +#371=AXIS2_PLACEMENT_3D('',#551,#456,#457); +#372=AXIS2_PLACEMENT_3D('',#554,#460,#461); +#373=AXIS2_PLACEMENT_3D('',#555,#462,#463); +#374=DIRECTION('',(0.,0.,1.)); +#375=DIRECTION('',(1.,0.,0.)); +#376=DIRECTION('',(0.,1.,0.)); +#377=DIRECTION('',(0.,0.,1.)); +#378=DIRECTION('',(0.,1.,0.)); +#379=DIRECTION('',(1.,0.,0.)); +#380=DIRECTION('',(0.,1.,0.)); +#381=DIRECTION('',(0.,1.,0.)); +#382=DIRECTION('',(1.,0.,0.)); +#383=DIRECTION('',(0.,1.,0.)); +#384=DIRECTION('',(0.,0.,-1.)); +#385=DIRECTION('',(-1.,0.,0.)); +#386=DIRECTION('',(-1.,0.,0.)); +#387=DIRECTION('',(0.,1.,0.)); +#388=DIRECTION('',(-1.,0.,0.)); +#389=DIRECTION('',(1.,0.,0.)); +#390=DIRECTION('',(0.,0.,-1.)); +#391=DIRECTION('',(0.,0.,-1.)); +#392=DIRECTION('',(0.,1.,0.)); +#393=DIRECTION('',(0.,0.,-1.)); +#394=DIRECTION('',(0.,0.,1.)); +#395=DIRECTION('',(1.,0.,0.)); +#396=DIRECTION('',(1.,0.,0.)); +#397=DIRECTION('',(0.,1.,0.)); +#398=DIRECTION('',(1.,0.,0.)); +#399=DIRECTION('',(0.,1.,0.)); +#400=DIRECTION('',(0.,0.,1.)); +#401=DIRECTION('',(0.,1.,0.)); +#402=DIRECTION('',(-1.,0.,0.)); +#403=DIRECTION('',(0.,1.,0.)); +#404=DIRECTION('',(0.,1.,0.)); +#405=DIRECTION('',(-1.,0.,0.)); +#406=DIRECTION('',(0.,0.,1.)); +#407=DIRECTION('',(1.,0.,0.)); +#408=DIRECTION('',(1.,0.,0.)); +#409=DIRECTION('',(0.,1.,0.)); +#410=DIRECTION('',(1.,0.,0.)); +#411=DIRECTION('',(-1.,0.,0.)); +#412=DIRECTION('',(0.,0.,1.)); +#413=DIRECTION('',(0.,0.,1.)); +#414=DIRECTION('',(0.,1.,0.)); +#415=DIRECTION('',(0.,0.,1.)); +#416=DIRECTION('',(0.,1.,0.)); +#417=DIRECTION('',(0.,0.,1.)); +#418=DIRECTION('',(0.,1.,0.)); +#419=DIRECTION('',(1.,0.,0.)); +#420=DIRECTION('',(0.,1.,0.)); +#421=DIRECTION('',(0.,1.,0.)); +#422=DIRECTION('',(1.,0.,0.)); +#423=DIRECTION('',(1.79068229778251E-16,0.,1.)); +#424=DIRECTION('',(1.,0.,-1.79068229778251E-16)); +#425=DIRECTION('',(1.,0.,-1.79068229778251E-16)); +#426=DIRECTION('',(0.,1.,0.)); +#427=DIRECTION('',(1.,0.,-1.79068229778251E-16)); +#428=DIRECTION('',(-1.,0.,0.)); +#429=DIRECTION('',(0.,0.,1.)); +#430=DIRECTION('',(0.,0.,1.)); +#431=DIRECTION('',(0.,1.,0.)); +#432=DIRECTION('',(0.,0.,1.)); +#433=DIRECTION('',(0.,0.,-1.)); +#434=DIRECTION('',(-1.,0.,0.)); +#435=DIRECTION('',(-1.,0.,0.)); +#436=DIRECTION('',(0.,1.,0.)); +#437=DIRECTION('',(-1.,0.,0.)); +#438=DIRECTION('',(0.,1.,0.)); +#439=DIRECTION('',(0.,0.,1.)); +#440=DIRECTION('',(0.,1.,0.)); +#441=DIRECTION('',(1.,0.,0.)); +#442=DIRECTION('',(0.,1.,0.)); +#443=DIRECTION('',(0.,1.,0.)); +#444=DIRECTION('',(1.,0.,0.)); +#445=DIRECTION('',(-1.,0.,0.)); +#446=DIRECTION('',(0.,0.,1.)); +#447=DIRECTION('',(0.,0.,1.)); +#448=DIRECTION('',(0.,1.,0.)); +#449=DIRECTION('',(0.,0.,1.)); +#450=DIRECTION('',(0.,1.,0.)); +#451=DIRECTION('',(0.,0.,1.)); +#452=DIRECTION('',(0.,1.,0.)); +#453=DIRECTION('',(1.,0.,0.)); +#454=DIRECTION('',(0.,1.,0.)); +#455=DIRECTION('',(1.,0.,0.)); +#456=DIRECTION('',(0.,0.,-1.)); +#457=DIRECTION('',(-1.,0.,0.)); +#458=DIRECTION('',(-1.,0.,0.)); +#459=DIRECTION('',(-1.,0.,0.)); +#460=DIRECTION('',(0.,1.,0.)); +#461=DIRECTION('',(0.,0.,1.)); +#462=DIRECTION('',(0.,1.,0.)); +#463=DIRECTION('',(0.,0.,1.)); +#464=CARTESIAN_POINT('',(0.,0.,0.)); +#465=CARTESIAN_POINT('',(350.,-5.,300.)); +#466=CARTESIAN_POINT('',(350.,0.,300.)); +#467=CARTESIAN_POINT('',(400.,0.,300.)); +#468=CARTESIAN_POINT('',(300.,0.,300.)); +#469=CARTESIAN_POINT('',(300.,-5.,300.)); +#470=CARTESIAN_POINT('',(300.,-5.,300.)); +#471=CARTESIAN_POINT('',(350.,-5.,300.)); +#472=CARTESIAN_POINT('',(400.,-5.,300.)); +#473=CARTESIAN_POINT('',(400.,-5.,300.)); +#474=CARTESIAN_POINT('',(300.,-5.,300.)); +#475=CARTESIAN_POINT('',(300.,0.,300.)); +#476=CARTESIAN_POINT('',(0.,0.,300.)); +#477=CARTESIAN_POINT('',(0.,-5.,300.)); +#478=CARTESIAN_POINT('',(0.,-5.,300.)); +#479=CARTESIAN_POINT('',(300.,-5.,300.)); +#480=CARTESIAN_POINT('',(0.,-5.,300.)); +#481=CARTESIAN_POINT('',(0.,0.,300.)); +#482=CARTESIAN_POINT('',(0.,0.,0.)); +#483=CARTESIAN_POINT('',(0.,-5.,0.)); +#484=CARTESIAN_POINT('',(0.,-5.,0.)); +#485=CARTESIAN_POINT('',(0.,-5.,300.)); +#486=CARTESIAN_POINT('',(0.,-5.,0.)); +#487=CARTESIAN_POINT('',(0.,0.,0.)); +#488=CARTESIAN_POINT('',(300.,0.,0.)); +#489=CARTESIAN_POINT('',(300.,-5.,0.)); +#490=CARTESIAN_POINT('',(300.,-5.,0.)); +#491=CARTESIAN_POINT('',(0.,-5.,0.)); +#492=CARTESIAN_POINT('',(350.,-5.,0.)); +#493=CARTESIAN_POINT('',(350.,0.,0.)); +#494=CARTESIAN_POINT('',(400.,0.,6.12323399573677E-15)); +#495=CARTESIAN_POINT('',(400.,-5.,6.12323399573677E-15)); +#496=CARTESIAN_POINT('',(400.,-5.,6.12323399573677E-15)); +#497=CARTESIAN_POINT('',(350.,-5.,0.)); +#498=CARTESIAN_POINT('',(400.,-5.,0.)); +#499=CARTESIAN_POINT('',(400.,0.,0.)); +#500=CARTESIAN_POINT('',(525.,0.,0.)); +#501=CARTESIAN_POINT('',(525.,-5.,0.)); +#502=CARTESIAN_POINT('',(525.,-5.,0.)); +#503=CARTESIAN_POINT('',(400.,-5.,0.)); +#504=CARTESIAN_POINT('',(525.,-5.,30.)); +#505=CARTESIAN_POINT('',(525.,0.,30.)); +#506=CARTESIAN_POINT('',(525.,0.,30.)); +#507=CARTESIAN_POINT('',(525.,-5.,30.)); +#508=CARTESIAN_POINT('',(525.,-5.,30.)); +#509=CARTESIAN_POINT('',(525.,-5.,30.)); +#510=CARTESIAN_POINT('',(545.,-5.,30.)); +#511=CARTESIAN_POINT('',(545.,0.,30.)); +#512=CARTESIAN_POINT('',(545.,0.,50.)); +#513=CARTESIAN_POINT('',(545.,-5.,50.)); +#514=CARTESIAN_POINT('',(545.,-5.,50.)); +#515=CARTESIAN_POINT('',(545.,-5.,30.)); +#516=CARTESIAN_POINT('',(700.,-5.,50.)); +#517=CARTESIAN_POINT('',(700.,0.,50.)); +#518=CARTESIAN_POINT('',(700.,0.,50.)); +#519=CARTESIAN_POINT('',(700.,-5.,50.)); +#520=CARTESIAN_POINT('',(700.,-5.,50.)); +#521=CARTESIAN_POINT('',(700.,-5.,50.)); +#522=CARTESIAN_POINT('',(700.,-5.,50.)); +#523=CARTESIAN_POINT('',(700.,0.,50.)); +#524=CARTESIAN_POINT('',(700.,0.,250.)); +#525=CARTESIAN_POINT('',(700.,-5.,250.)); +#526=CARTESIAN_POINT('',(700.,-5.,250.)); +#527=CARTESIAN_POINT('',(700.,-5.,50.)); +#528=CARTESIAN_POINT('',(700.,-5.,250.)); +#529=CARTESIAN_POINT('',(700.,0.,250.)); +#530=CARTESIAN_POINT('',(545.,0.,250.)); +#531=CARTESIAN_POINT('',(545.,-5.,250.)); +#532=CARTESIAN_POINT('',(545.,-5.,250.)); +#533=CARTESIAN_POINT('',(700.,-5.,250.)); +#534=CARTESIAN_POINT('',(545.,-5.,270.)); +#535=CARTESIAN_POINT('',(545.,0.,270.)); +#536=CARTESIAN_POINT('',(525.,0.,270.)); +#537=CARTESIAN_POINT('',(525.,-5.,270.)); +#538=CARTESIAN_POINT('',(525.,-5.,270.)); +#539=CARTESIAN_POINT('',(545.,-5.,270.)); +#540=CARTESIAN_POINT('',(525.,-5.,270.)); +#541=CARTESIAN_POINT('',(525.,0.,270.)); +#542=CARTESIAN_POINT('',(525.,0.,300.)); +#543=CARTESIAN_POINT('',(525.,-5.,300.)); +#544=CARTESIAN_POINT('',(525.,-5.,300.)); +#545=CARTESIAN_POINT('',(525.,-5.,270.)); +#546=CARTESIAN_POINT('',(175.,-5.,150.)); +#547=CARTESIAN_POINT('',(175.,-5.,150.)); +#548=CARTESIAN_POINT('',(205.,-5.,150.)); +#549=CARTESIAN_POINT('',(175.,0.,150.)); +#550=CARTESIAN_POINT('',(205.,0.,150.)); +#551=CARTESIAN_POINT('',(525.,-5.,300.)); +#552=CARTESIAN_POINT('',(525.,0.,300.)); +#553=CARTESIAN_POINT('',(525.,-5.,300.)); +#554=CARTESIAN_POINT('',(350.,-5.,300.)); +#555=CARTESIAN_POINT('',(350.,0.,300.)); +#556=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#335), +#557); +#557=( +GEOMETRIC_REPRESENTATION_CONTEXT(3) +GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#558)) +GLOBAL_UNIT_ASSIGNED_CONTEXT((#561,#560,#559)) +REPRESENTATION_CONTEXT('Part1','TOP_LEVEL_ASSEMBLY_PART') +); +#558=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.005),#561, +'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model'); +#559=( +NAMED_UNIT(*) +SI_UNIT($,.STERADIAN.) +SOLID_ANGLE_UNIT() +); +#560=( +NAMED_UNIT(*) +PLANE_ANGLE_UNIT() +SI_UNIT($,.RADIAN.) +); +#561=( +LENGTH_UNIT() +NAMED_UNIT(*) +SI_UNIT(.MILLI.,.METRE.) +); +#562=PRODUCT_DEFINITION_SHAPE('','',#563); +#563=PRODUCT_DEFINITION('','',#565,#564); +#564=PRODUCT_DEFINITION_CONTEXT('',#571,'design'); +#565=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#567, + .NOT_KNOWN.); +#566=PRODUCT_RELATED_PRODUCT_CATEGORY('','',(#567)); +#567=PRODUCT('Part1','Part1','Part1',(#569)); +#568=PRODUCT_CATEGORY('',''); +#569=PRODUCT_CONTEXT('',#571,'mechanical'); +#570=APPLICATION_PROTOCOL_DEFINITION('international standard', +'automotive_design',2010,#571); +#571=APPLICATION_CONTEXT( +'core data for automotive mechanical design processes'); +ENDSEC; +END-ISO-10303-21; diff --git a/docs/tutoriais/malha/tutorial_06_mesh.msh1 b/docs/tutoriais/malha/tutorial_06_mesh.msh1 new file mode 100644 index 0000000..916279c --- /dev/null +++ b/docs/tutoriais/malha/tutorial_06_mesh.msh1 @@ -0,0 +1,748 @@ +$NOD +127 +1 30 160 0 +2 0 160 0 +3 0 160 20 +4 30 160 20 +5 0 0 0 +6 0 0 20 +7 80 0 0 +8 80 0 20 +9 80 30 0 +10 80 30 20 +11 30 30 0 +12 30 30 20 +13 14.99999999999998 160 0 +14 0 160 9.999999999999979 +15 14.99999999999998 160 20 +16 30 160 9.999999999999979 +17 0 142.2222222222222 0 +18 0 124.4444444444444 0 +19 0 106.6666666666665 0 +20 0 88.8888888888887 0 +21 0 71.11111111111096 0 +22 0 53.33333333333321 0 +23 0 35.55555555555547 0 +24 0 17.77777777777774 0 +25 0 0 9.999999999999979 +26 0 142.2222222222222 20 +27 0 124.4444444444444 20 +28 0 106.6666666666665 20 +29 0 88.8888888888887 20 +30 0 71.11111111111096 20 +31 0 53.33333333333321 20 +32 0 35.55555555555547 20 +33 0 17.77777777777774 20 +34 16.00000000000002 0 0 +35 32.00000000000008 0 0 +36 48.00000000000006 0 0 +37 64.00000000000003 0 0 +38 80 0 9.999999999999979 +39 16.00000000000002 0 20 +40 32.00000000000008 0 20 +41 48.00000000000006 0 20 +42 64.00000000000003 0 20 +43 80 15.00000000000002 0 +44 80 30 9.999999999999979 +45 80 15.00000000000002 20 +46 63.33333333333333 30 0 +47 46.66666666666674 30 0 +48 30 30 9.999999999999979 +49 63.33333333333333 30 20 +50 46.66666666666674 30 20 +51 30 46.25 0 +52 30 62.5 0 +53 30 78.75 0 +54 30 95 0 +55 30 111.25 0 +56 30 127.5 0 +57 30 143.75 0 +58 30 46.25 20 +59 30 62.5 20 +60 30 78.75 20 +61 30 95 20 +62 30 111.25 20 +63 30 127.5 20 +64 30 143.75 20 +65 19.82142857142856 160 13.43749999999999 +66 8.27806122448979 160 14.19642857142856 +67 20.95663265306122 160 5.892857142857135 +68 9.05467216040935 160 6.417443252811328 +69 0 44.44444444444434 10 +70 0 26.6666666666666 10 +71 0 10.37037037037035 9.999999999999996 +72 0 97.77777777777762 9.999999999999996 +73 0 79.99999999999984 9.999999999999996 +74 0 62.2222222222221 9.999999999999996 +75 0 115.5555555555555 10 +76 0 133.3333333333333 9.999999999999998 +77 0 149.6296296296296 9.999999999999996 +78 24.00000000000005 0 10 +79 56.00000000000003 0 10.00000000000001 +80 40.00000000000007 0 10 +81 70.15476190476191 0 10 +82 9.845238095238107 0 10 +83 80 10.17857142857143 13.43749999999999 +84 80 21.72193877551021 14.19642857142857 +85 80 9.04336734693878 5.892857142857135 +86 80 20.94532783959065 6.417443252811328 +87 55.00000000000003 30 10 +88 40.18253968253971 29.99999999999999 9.999999999999996 +89 69.81746031746032 30 9.999999999999996 +90 30 54.375 10 +91 30 70.625 10 +92 30 86.875 10 +93 30 103.125 10 +94 30 119.375 10 +95 30 135.625 10 +96 30 150.0286172161172 9.999999999999996 +97 30 39.97138278388278 9.999999999999996 +98 57.40272683284644 14.2259026948816 20 +99 24.00000000000005 13.85640646055102 20 +100 15.68988356709913 134.2014517594329 20 +101 39.67823224991889 14.68038485923877 20 +102 15.75591057912938 118.9818288764466 20 +103 15.76335558609614 102.6439671157852 20 +104 13.77014755780211 24.91864388097214 20 +105 16.0326646090535 86.875 20 +106 15.94602176373604 55.15490391770039 20 +107 18.39573727455791 70.87820300576227 20 +108 14.95269488692303 40.86873944792686 20 +109 68.5292409440729 18.5165273909578 20 +110 18.21221421409193 147.917043889931 20 +111 11.36245078452995 11.91509459496583 20 +112 70.56170968241705 8.963204297977061 20 +113 57.40272683284644 14.2259026948816 0 +114 24.00000000000005 13.85640646055102 0 +115 15.68988356709913 134.2014517594329 0 +116 39.67823224991889 14.68038485923877 0 +117 15.75591057912938 118.9818288764466 0 +118 15.76335558609614 102.6439671157852 0 +119 13.77014755780211 24.91864388097215 0 +120 16.0326646090535 86.875 0 +121 15.94602176373604 55.15490391770039 0 +122 18.39573727455791 70.87820300576227 0 +123 14.95269488692303 40.86873944792686 0 +124 68.5292409440729 18.5165273909578 0 +125 18.21221421409193 147.917043889931 0 +126 11.36245078452995 11.91509459496582 0 +127 70.56170968241705 8.963204297977061 0 +$ENDNOD +$ELM +615 +1 15 0 1 1 1 +2 15 0 2 1 2 +3 15 0 3 1 3 +4 15 0 4 1 4 +5 15 0 5 1 5 +6 15 0 6 1 6 +7 15 0 7 1 7 +8 15 0 8 1 8 +9 15 0 9 1 9 +10 15 0 10 1 10 +11 15 0 11 1 11 +12 15 0 12 1 12 +13 1 0 1 2 1 13 +14 1 0 1 2 13 2 +15 1 0 2 2 3 14 +16 1 0 2 2 14 2 +17 1 0 3 2 4 15 +18 1 0 3 2 15 3 +19 1 0 4 2 4 16 +20 1 0 4 2 16 1 +21 1 0 5 2 2 17 +22 1 0 5 2 17 18 +23 1 0 5 2 18 19 +24 1 0 5 2 19 20 +25 1 0 5 2 20 21 +26 1 0 5 2 21 22 +27 1 0 5 2 22 23 +28 1 0 5 2 23 24 +29 1 0 5 2 24 5 +30 1 0 6 2 6 25 +31 1 0 6 2 25 5 +32 1 0 7 2 3 26 +33 1 0 7 2 26 27 +34 1 0 7 2 27 28 +35 1 0 7 2 28 29 +36 1 0 7 2 29 30 +37 1 0 7 2 30 31 +38 1 0 7 2 31 32 +39 1 0 7 2 32 33 +40 1 0 7 2 33 6 +41 1 0 8 2 5 34 +42 1 0 8 2 34 35 +43 1 0 8 2 35 36 +44 1 0 8 2 36 37 +45 1 0 8 2 37 7 +46 1 0 9 2 8 38 +47 1 0 9 2 38 7 +48 1 0 10 2 6 39 +49 1 0 10 2 39 40 +50 1 0 10 2 40 41 +51 1 0 10 2 41 42 +52 1 0 10 2 42 8 +53 1 0 11 2 7 43 +54 1 0 11 2 43 9 +55 1 0 12 2 10 44 +56 1 0 12 2 44 9 +57 1 0 13 2 8 45 +58 1 0 13 2 45 10 +59 1 0 14 2 9 46 +60 1 0 14 2 46 47 +61 1 0 14 2 47 11 +62 1 0 15 2 12 48 +63 1 0 15 2 48 11 +64 1 0 16 2 10 49 +65 1 0 16 2 49 50 +66 1 0 16 2 50 12 +67 1 0 17 2 11 51 +68 1 0 17 2 51 52 +69 1 0 17 2 52 53 +70 1 0 17 2 53 54 +71 1 0 17 2 54 55 +72 1 0 17 2 55 56 +73 1 0 17 2 56 57 +74 1 0 17 2 57 1 +75 1 0 18 2 12 58 +76 1 0 18 2 58 59 +77 1 0 18 2 59 60 +78 1 0 18 2 60 61 +79 1 0 18 2 61 62 +80 1 0 18 2 62 63 +81 1 0 18 2 63 64 +82 1 0 18 2 64 4 +83 2 0 1 3 1 13 67 +84 2 0 1 3 16 1 67 +85 2 0 1 3 13 2 68 +86 2 0 1 3 2 14 68 +87 2 0 1 3 14 3 66 +88 2 0 1 3 3 15 66 +89 2 0 1 3 15 4 65 +90 2 0 1 3 4 16 65 +91 2 0 1 3 67 13 68 +92 2 0 1 3 14 66 68 +93 2 0 1 3 15 65 66 +94 2 0 1 3 65 16 67 +95 2 0 1 3 66 65 68 +96 2 0 1 3 65 67 68 +97 2 0 2 3 14 2 77 +98 2 0 2 3 2 17 77 +99 2 0 2 3 3 14 77 +100 2 0 2 3 26 3 77 +101 2 0 2 3 24 5 71 +102 2 0 2 3 5 25 71 +103 2 0 2 3 25 6 71 +104 2 0 2 3 6 33 71 +105 2 0 2 3 17 18 76 +106 2 0 2 3 17 76 77 +107 2 0 2 3 18 19 75 +108 2 0 2 3 18 75 76 +109 2 0 2 3 19 20 72 +110 2 0 2 3 19 72 75 +111 2 0 2 3 20 21 73 +112 2 0 2 3 72 20 73 +113 2 0 2 3 21 22 74 +114 2 0 2 3 73 21 74 +115 2 0 2 3 22 23 69 +116 2 0 2 3 22 69 74 +117 2 0 2 3 23 24 70 +118 2 0 2 3 69 23 70 +119 2 0 2 3 70 24 71 +120 2 0 2 3 27 26 76 +121 2 0 2 3 76 26 77 +122 2 0 2 3 28 27 75 +123 2 0 2 3 75 27 76 +124 2 0 2 3 29 28 72 +125 2 0 2 3 72 28 75 +126 2 0 2 3 30 29 73 +127 2 0 2 3 29 72 73 +128 2 0 2 3 31 30 74 +129 2 0 2 3 30 73 74 +130 2 0 2 3 32 31 69 +131 2 0 2 3 69 31 74 +132 2 0 2 3 33 32 70 +133 2 0 2 3 32 69 70 +134 2 0 2 3 33 70 71 +135 2 0 3 3 25 5 82 +136 2 0 3 3 5 34 82 +137 2 0 3 3 6 25 82 +138 2 0 3 3 39 6 82 +139 2 0 3 3 37 7 81 +140 2 0 3 3 7 38 81 +141 2 0 3 3 38 8 81 +142 2 0 3 3 8 42 81 +143 2 0 3 3 34 35 78 +144 2 0 3 3 34 78 82 +145 2 0 3 3 35 36 80 +146 2 0 3 3 78 35 80 +147 2 0 3 3 36 37 79 +148 2 0 3 3 36 79 80 +149 2 0 3 3 79 37 81 +150 2 0 3 3 40 39 78 +151 2 0 3 3 78 39 82 +152 2 0 3 3 41 40 80 +153 2 0 3 3 40 78 80 +154 2 0 3 3 42 41 79 +155 2 0 3 3 79 41 80 +156 2 0 3 3 42 79 81 +157 2 0 4 3 38 7 85 +158 2 0 4 3 7 43 85 +159 2 0 4 3 8 38 83 +160 2 0 4 3 45 8 83 +161 2 0 4 3 43 9 86 +162 2 0 4 3 9 44 86 +163 2 0 4 3 44 10 84 +164 2 0 4 3 10 45 84 +165 2 0 4 3 83 38 85 +166 2 0 4 3 85 43 86 +167 2 0 4 3 44 84 86 +168 2 0 4 3 45 83 84 +169 2 0 4 3 84 83 86 +170 2 0 4 3 83 85 86 +171 2 0 5 3 44 9 89 +172 2 0 5 3 9 46 89 +173 2 0 5 3 10 44 89 +174 2 0 5 3 49 10 89 +175 2 0 5 3 47 11 88 +176 2 0 5 3 11 48 88 +177 2 0 5 3 48 12 88 +178 2 0 5 3 12 50 88 +179 2 0 5 3 46 47 87 +180 2 0 5 3 46 87 89 +181 2 0 5 3 87 47 88 +182 2 0 5 3 50 49 87 +183 2 0 5 3 87 49 89 +184 2 0 5 3 50 87 88 +185 2 0 6 3 1 16 96 +186 2 0 6 3 57 1 96 +187 2 0 6 3 16 4 96 +188 2 0 6 3 4 64 96 +189 2 0 6 3 48 11 97 +190 2 0 6 3 11 51 97 +191 2 0 6 3 12 48 97 +192 2 0 6 3 58 12 97 +193 2 0 6 3 51 52 90 +194 2 0 6 3 51 90 97 +195 2 0 6 3 52 53 91 +196 2 0 6 3 90 52 91 +197 2 0 6 3 53 54 92 +198 2 0 6 3 91 53 92 +199 2 0 6 3 54 55 93 +200 2 0 6 3 92 54 93 +201 2 0 6 3 55 56 94 +202 2 0 6 3 93 55 94 +203 2 0 6 3 56 57 95 +204 2 0 6 3 94 56 95 +205 2 0 6 3 95 57 96 +206 2 0 6 3 59 58 90 +207 2 0 6 3 90 58 97 +208 2 0 6 3 60 59 91 +209 2 0 6 3 59 90 91 +210 2 0 6 3 61 60 92 +211 2 0 6 3 60 91 92 +212 2 0 6 3 62 61 93 +213 2 0 6 3 61 92 93 +214 2 0 6 3 63 62 94 +215 2 0 6 3 62 93 94 +216 2 0 6 3 64 63 95 +217 2 0 6 3 63 94 95 +218 2 0 6 3 64 95 96 +219 2 0 7 3 3 110 15 +220 2 0 7 3 26 110 3 +221 2 0 7 3 15 110 4 +222 2 0 7 3 4 110 64 +223 2 0 7 3 6 111 33 +224 2 0 7 3 39 111 6 +225 2 0 7 3 8 112 42 +226 2 0 7 3 45 112 8 +227 2 0 7 3 10 109 45 +228 2 0 7 3 49 109 10 +229 2 0 7 3 12 101 50 +230 2 0 7 3 58 108 12 +231 2 0 7 3 99 101 12 +232 2 0 7 3 12 104 99 +233 2 0 7 3 12 108 104 +234 2 0 7 3 27 100 26 +235 2 0 7 3 100 110 26 +236 2 0 7 3 28 102 27 +237 2 0 7 3 27 102 100 +238 2 0 7 3 29 103 28 +239 2 0 7 3 28 103 102 +240 2 0 7 3 30 105 29 +241 2 0 7 3 29 105 103 +242 2 0 7 3 31 106 30 +243 2 0 7 3 30 107 105 +244 2 0 7 3 106 107 30 +245 2 0 7 3 32 108 31 +246 2 0 7 3 31 108 106 +247 2 0 7 3 33 104 32 +248 2 0 7 3 104 108 32 +249 2 0 7 3 33 111 104 +250 2 0 7 3 40 99 39 +251 2 0 7 3 99 111 39 +252 2 0 7 3 41 101 40 +253 2 0 7 3 40 101 99 +254 2 0 7 3 42 98 41 +255 2 0 7 3 98 101 41 +256 2 0 7 3 42 112 98 +257 2 0 7 3 109 112 45 +258 2 0 7 3 50 98 49 +259 2 0 7 3 98 109 49 +260 2 0 7 3 50 101 98 +261 2 0 7 3 59 106 58 +262 2 0 7 3 106 108 58 +263 2 0 7 3 60 107 59 +264 2 0 7 3 59 107 106 +265 2 0 7 3 61 105 60 +266 2 0 7 3 105 107 60 +267 2 0 7 3 62 103 61 +268 2 0 7 3 103 105 61 +269 2 0 7 3 63 102 62 +270 2 0 7 3 102 103 62 +271 2 0 7 3 64 100 63 +272 2 0 7 3 100 102 63 +273 2 0 7 3 64 110 100 +274 2 0 7 3 98 112 109 +275 2 0 7 3 104 111 99 +276 2 0 8 3 13 1 125 +277 2 0 8 3 1 57 125 +278 2 0 8 3 2 13 125 +279 2 0 8 3 17 2 125 +280 2 0 8 3 5 24 126 +281 2 0 8 3 34 5 126 +282 2 0 8 3 7 37 127 +283 2 0 8 3 43 7 127 +284 2 0 8 3 9 43 124 +285 2 0 8 3 46 9 124 +286 2 0 8 3 11 47 116 +287 2 0 8 3 51 11 123 +288 2 0 8 3 114 11 116 +289 2 0 8 3 11 114 119 +290 2 0 8 3 11 119 123 +291 2 0 8 3 18 17 115 +292 2 0 8 3 115 17 125 +293 2 0 8 3 19 18 117 +294 2 0 8 3 18 115 117 +295 2 0 8 3 20 19 118 +296 2 0 8 3 19 117 118 +297 2 0 8 3 21 20 120 +298 2 0 8 3 20 118 120 +299 2 0 8 3 22 21 121 +300 2 0 8 3 21 120 122 +301 2 0 8 3 121 21 122 +302 2 0 8 3 23 22 123 +303 2 0 8 3 22 121 123 +304 2 0 8 3 24 23 119 +305 2 0 8 3 119 23 123 +306 2 0 8 3 24 119 126 +307 2 0 8 3 35 34 114 +308 2 0 8 3 114 34 126 +309 2 0 8 3 36 35 116 +310 2 0 8 3 35 114 116 +311 2 0 8 3 37 36 113 +312 2 0 8 3 113 36 116 +313 2 0 8 3 37 113 127 +314 2 0 8 3 124 43 127 +315 2 0 8 3 47 46 113 +316 2 0 8 3 113 46 124 +317 2 0 8 3 47 113 116 +318 2 0 8 3 52 51 121 +319 2 0 8 3 121 51 123 +320 2 0 8 3 53 52 122 +321 2 0 8 3 52 121 122 +322 2 0 8 3 54 53 120 +323 2 0 8 3 120 53 122 +324 2 0 8 3 55 54 118 +325 2 0 8 3 118 54 120 +326 2 0 8 3 56 55 117 +327 2 0 8 3 117 55 118 +328 2 0 8 3 57 56 115 +329 2 0 8 3 115 56 117 +330 2 0 8 3 57 115 125 +331 2 0 8 3 113 124 127 +332 2 0 8 3 119 114 126 +333 4 0 1 4 114 116 48 99 +334 4 0 1 4 114 48 119 99 +335 4 0 1 4 104 119 48 99 +336 4 0 1 4 101 48 116 99 +337 4 0 1 4 87 116 101 88 +338 4 0 1 4 108 119 48 104 +339 4 0 1 4 81 98 112 127 +340 4 0 1 4 99 78 114 80 +341 4 0 1 4 101 116 79 80 +342 4 0 1 4 119 108 48 123 +343 4 0 1 4 87 101 116 113 +344 4 0 1 4 101 116 48 88 +345 4 0 1 4 83 112 124 127 +346 4 0 1 4 87 98 101 113 +347 4 0 1 4 124 112 98 127 +348 4 0 1 4 114 116 99 80 +349 4 0 1 4 48 123 108 97 +350 4 0 1 4 116 101 79 113 +351 4 0 1 4 89 109 87 124 +352 4 0 1 4 116 101 99 80 +353 4 0 1 4 83 86 85 124 +354 4 0 1 4 109 84 83 86 +355 4 0 1 4 79 101 98 113 +356 4 0 1 4 114 111 119 126 +357 4 0 1 4 36 79 116 80 +358 4 0 1 4 79 41 101 80 +359 4 0 1 4 124 85 83 127 +360 4 0 1 4 77 76 115 100 +361 4 0 1 4 78 35 114 80 +362 4 0 1 4 99 40 78 80 +363 4 0 1 4 112 124 98 109 +364 4 0 1 4 83 112 109 124 +365 4 0 1 4 111 114 119 99 +366 4 0 1 4 111 119 104 99 +367 4 0 1 4 111 82 126 78 +368 4 0 1 4 101 50 87 88 +369 4 0 1 4 116 87 47 88 +370 4 0 1 4 66 77 68 110 +371 4 0 1 4 86 83 109 124 +372 4 0 1 4 122 92 107 91 +373 4 0 1 4 94 95 115 100 +374 4 0 1 4 124 98 109 87 +375 4 0 1 4 126 114 111 78 +376 4 0 1 4 85 81 83 127 +377 4 0 1 4 74 122 73 107 +378 4 0 1 4 108 123 90 97 +379 4 0 1 4 104 108 119 70 +380 4 0 1 4 93 94 117 102 +381 4 0 1 4 111 126 71 70 +382 4 0 1 4 66 68 65 110 +383 4 0 1 4 35 116 114 80 +384 4 0 1 4 101 40 99 80 +385 4 0 1 4 112 83 81 127 +386 4 0 1 4 119 126 111 70 +387 4 0 1 4 114 111 78 99 +388 4 0 1 4 41 101 98 79 +389 4 0 1 4 113 79 116 36 +390 4 0 1 4 89 84 109 86 +391 4 0 1 4 77 115 125 100 +392 4 0 1 4 127 98 124 113 +393 4 0 1 4 94 117 55 93 +394 4 0 1 4 94 93 62 102 +395 4 0 1 4 111 104 119 70 +396 4 0 1 4 100 94 95 63 +397 4 0 1 4 95 115 56 94 +398 4 0 1 4 94 115 117 100 +399 4 0 1 4 76 117 115 100 +400 4 0 1 4 92 54 118 93 +401 4 0 1 4 61 93 92 103 +402 4 0 1 4 108 123 119 70 +403 4 0 1 4 93 118 92 103 +404 4 0 1 4 37 79 81 127 +405 4 0 1 4 92 122 53 91 +406 4 0 1 4 91 92 107 60 +407 4 0 1 4 100 77 76 26 +408 4 0 1 4 76 115 17 77 +409 4 0 1 4 124 98 87 113 +410 4 0 1 4 105 73 122 107 +411 4 0 1 4 97 90 108 58 +412 4 0 1 4 51 90 123 97 +413 4 0 1 4 101 50 98 87 +414 4 0 1 4 87 116 47 113 +415 4 0 1 4 100 117 94 102 +416 4 0 1 4 100 76 117 102 +417 4 0 1 4 107 74 122 106 +418 4 0 1 4 117 118 93 102 +419 4 0 1 4 122 92 105 107 +420 4 0 1 4 67 68 125 65 +421 4 0 1 4 12 48 101 99 +422 4 0 1 4 116 48 11 114 +423 4 0 1 4 122 107 106 91 +424 4 0 1 4 100 125 77 110 +425 4 0 1 4 75 117 76 102 +426 4 0 1 4 70 108 123 69 +427 4 0 1 4 102 118 93 103 +428 4 0 1 4 86 109 89 124 +429 4 0 1 4 46 89 87 124 +430 4 0 1 4 49 109 87 89 +431 4 0 1 4 108 48 12 104 +432 4 0 1 4 48 11 119 123 +433 4 0 1 4 48 12 104 99 +434 4 0 1 4 48 119 11 114 +435 4 0 1 4 76 18 117 75 +436 4 0 1 4 27 75 76 102 +437 4 0 1 4 102 118 75 117 +438 4 0 1 4 70 32 108 69 +439 4 0 1 4 123 23 70 69 +440 4 0 1 4 108 12 48 97 +441 4 0 1 4 48 11 123 97 +442 4 0 1 4 101 48 12 88 +443 4 0 1 4 11 48 116 88 +444 4 0 1 4 74 122 21 73 +445 4 0 1 4 30 74 73 107 +446 4 0 1 4 106 90 121 91 +447 4 0 1 4 117 118 55 93 +448 4 0 1 4 102 93 62 103 +449 4 0 1 4 118 102 75 103 +450 4 0 1 4 117 56 115 94 +451 4 0 1 4 63 100 94 102 +452 4 0 1 4 82 34 126 78 +453 4 0 1 4 111 39 82 78 +454 4 0 1 4 125 17 115 77 +455 4 0 1 4 26 100 77 110 +456 4 0 1 4 96 67 125 65 +457 4 0 1 4 73 122 120 105 +458 4 0 1 4 106 123 90 108 +459 4 0 1 4 126 24 71 70 +460 4 0 1 4 33 111 71 70 +461 4 0 1 4 74 121 122 106 +462 4 0 1 4 95 125 115 100 +463 4 0 1 4 37 113 79 127 +464 4 0 1 4 105 92 118 103 +465 4 0 1 4 118 75 72 103 +466 4 0 1 4 92 120 122 105 +467 4 0 1 4 121 122 106 91 +468 4 0 1 4 125 68 77 110 +469 4 0 1 4 66 15 3 110 +470 4 0 1 4 105 61 92 103 +471 4 0 1 4 118 120 54 92 +472 4 0 1 4 123 23 119 70 +473 4 0 1 4 104 32 108 70 +474 4 0 1 4 76 100 27 102 +475 4 0 1 4 115 18 117 76 +476 4 0 1 4 107 92 105 60 +477 4 0 1 4 120 122 53 92 +478 4 0 1 4 71 82 126 111 +479 4 0 1 4 118 120 92 105 +480 4 0 1 4 123 106 69 108 +481 4 0 1 4 75 72 103 28 +482 4 0 1 4 19 118 75 72 +483 4 0 1 4 104 111 33 70 +484 4 0 1 4 24 126 119 70 +485 4 0 1 4 68 125 65 110 +486 4 0 1 4 105 118 72 103 +487 4 0 1 4 26 77 66 110 +488 4 0 1 4 125 13 2 68 +489 4 0 1 4 121 123 90 106 +490 4 0 1 4 109 87 98 49 +491 4 0 1 4 46 87 113 124 +492 4 0 1 4 68 17 125 77 +493 4 0 1 4 100 95 125 110 +494 4 0 1 4 120 118 72 105 +495 4 0 1 4 114 126 34 78 +496 4 0 1 4 78 111 39 99 +497 4 0 1 4 121 74 22 69 +498 4 0 1 4 31 74 106 69 +499 4 0 1 4 95 96 125 110 +500 4 0 1 4 72 73 120 105 +501 4 0 1 4 26 66 3 110 +502 4 0 1 4 106 123 69 121 +503 4 0 1 4 90 106 108 58 +504 4 0 1 4 123 90 51 121 +505 4 0 1 4 86 85 124 43 +506 4 0 1 4 74 121 106 69 +507 4 0 1 4 68 2 17 77 +508 4 0 1 4 73 120 20 72 +509 4 0 1 4 72 73 105 29 +510 4 0 1 4 3 77 66 26 +511 4 0 1 4 17 125 2 68 +512 4 0 1 4 38 81 8 83 +513 4 0 1 4 67 96 16 65 +514 4 0 1 4 83 38 81 85 +515 4 0 1 4 84 83 45 109 +516 4 0 1 4 10 84 109 89 +517 4 0 1 4 5 82 71 25 +518 4 0 1 4 71 82 6 25 +519 4 0 1 4 43 85 124 127 +520 4 0 1 4 96 125 57 95 +521 4 0 1 4 110 95 96 64 +522 4 0 1 4 16 96 4 65 +523 4 0 1 4 113 47 87 46 +524 4 0 1 4 50 98 87 49 +525 4 0 1 4 84 89 44 86 +526 4 0 1 4 118 117 19 75 +527 4 0 1 4 103 102 75 28 +528 4 0 1 4 86 89 9 124 +529 4 0 1 4 45 10 84 109 +530 4 0 1 4 125 96 65 110 +531 4 0 1 4 7 81 38 85 +532 4 0 1 4 73 105 30 107 +533 4 0 1 4 120 21 122 73 +534 4 0 1 4 123 11 51 97 +535 4 0 1 4 97 108 12 58 +536 4 0 1 4 66 65 15 110 +537 4 0 1 4 122 121 74 21 +538 4 0 1 4 107 30 74 106 +539 4 0 1 4 77 68 14 66 +540 4 0 1 4 44 89 9 86 +541 4 0 1 4 1 67 96 16 +542 4 0 1 4 50 101 12 88 +543 4 0 1 4 47 11 116 88 +544 4 0 1 4 10 84 89 44 +545 4 0 1 4 41 40 101 80 +546 4 0 1 4 116 35 36 80 +547 4 0 1 4 114 34 35 78 +548 4 0 1 4 40 78 39 99 +549 4 0 1 4 82 126 5 71 +550 4 0 1 4 71 6 82 111 +551 4 0 1 4 68 125 13 67 +552 4 0 1 4 83 81 8 112 +553 4 0 1 4 27 100 76 26 +554 4 0 1 4 17 18 115 76 +555 4 0 1 4 7 81 85 127 +556 4 0 1 4 115 56 57 95 +557 4 0 1 4 63 95 100 64 +558 4 0 1 4 124 9 86 43 +559 4 0 1 4 39 82 6 111 +560 4 0 1 4 34 126 5 82 +561 4 0 1 4 36 113 79 37 +562 4 0 1 4 98 41 79 42 +563 4 0 1 4 46 9 89 124 +564 4 0 1 4 49 10 109 89 +565 4 0 1 4 102 27 75 28 +566 4 0 1 4 19 117 18 75 +567 4 0 1 4 32 31 108 69 +568 4 0 1 4 123 22 23 69 +569 4 0 1 4 24 119 23 70 +570 4 0 1 4 32 104 33 70 +571 4 0 1 4 67 125 1 96 +572 4 0 1 4 115 57 125 95 +573 4 0 1 4 110 100 95 64 +574 4 0 1 4 106 30 74 31 +575 4 0 1 4 121 22 74 21 +576 4 0 1 4 43 7 85 127 +577 4 0 1 4 117 55 56 94 +578 4 0 1 4 62 63 94 102 +579 4 0 1 4 22 123 121 69 +580 4 0 1 4 106 108 31 69 +581 4 0 1 4 65 96 4 110 +582 4 0 1 4 112 81 8 42 +583 4 0 1 4 81 7 37 127 +584 4 0 1 4 45 83 112 109 +585 4 0 1 4 120 118 20 72 +586 4 0 1 4 72 105 103 29 +587 4 0 1 4 118 54 55 93 +588 4 0 1 4 61 62 93 103 +589 4 0 1 4 71 6 111 33 +590 4 0 1 4 126 24 5 71 +591 4 0 1 4 28 72 103 29 +592 4 0 1 4 118 19 20 72 +593 4 0 1 4 120 20 21 73 +594 4 0 1 4 29 73 105 30 +595 4 0 1 4 125 1 13 67 +596 4 0 1 4 112 8 83 45 +597 4 0 1 4 54 120 53 92 +598 4 0 1 4 92 61 105 60 +599 4 0 1 4 90 52 51 121 +600 4 0 1 4 90 106 58 59 +601 4 0 1 4 4 15 65 110 +602 4 0 1 4 122 52 53 91 +603 4 0 1 4 60 107 91 59 +604 4 0 1 4 125 57 1 96 +605 4 0 1 4 110 96 4 64 +606 4 0 1 4 14 2 68 77 +607 4 0 1 4 77 14 3 66 +608 4 0 1 4 98 81 42 79 +609 4 0 1 4 98 42 81 112 +610 4 0 1 4 127 79 98 113 +611 4 0 1 4 127 98 79 81 +612 4 0 1 4 91 106 59 107 +613 4 0 1 4 91 59 106 90 +614 4 0 1 4 121 91 52 122 +615 4 0 1 4 52 91 121 90 +$ENDELM diff --git a/myfempy/core/elements/plane.py b/myfempy/core/elements/plane.py index 06457c3..0097e75 100644 --- a/myfempy/core/elements/plane.py +++ b/myfempy/core/elements/plane.py @@ -10,6 +10,11 @@ from myfempy.core.elements.element import Element from myfempy.core.utilities import gauss_points +def HDIFFNINVJ(H, diffN, invJ): + invJdiffN = dot(invJ, diffN) + B = dot(H, invJdiffN) + return B + def BTCB(diffN, H, invJ, C): B = HDIFFNINVJ(H, diffN, invJ) BT = B.transpose() @@ -23,11 +28,6 @@ def NTRN(N, R): NRN = dot(NTR, N) return NRN -def HDIFFNINVJ(H, diffN, invJ): - invJdiffN = dot(invJ, diffN) - B = dot(H, invJdiffN) - return B - class Plane(Element): '''Plane Structural Element Class ''' @@ -73,7 +73,7 @@ def getStifLinearMat(Model, inci, coord, tabmat, tabgeo, intgauss, element_numbe E = tabmat[int(inci[element_number, 2]) - 1, 0] # material elasticity v = tabmat[int(inci[element_number, 2]) - 1, 1] # material poisson ratio C = Model.material.getElasticTensor(E, v) - L = tabgeo[int(inci[element_number, 3] - 1), 4] + t = tabgeo[int(inci[element_number, 3] - 1), 4] H = Plane.getH() pt, wt = gauss_points(type_shape, intgauss) K_elem_mat = zeros((edof, edof), dtype=FLT64) @@ -82,7 +82,7 @@ def getStifLinearMat(Model, inci, coord, tabmat, tabgeo, intgauss, element_numbe diffN = Model.shape.getDiffShapeFuntion(pt[pp], nodedof) invJ = Model.shape.getinvJacobi(pt[pp], elementcoord, nodedof) BCB = BTCB(diffN, H, invJ, C) - K_elem_mat += BCB*L*abs(detJ)*wt[pp]*wt[pp] + K_elem_mat += BCB*t*abs(detJ)*wt[pp]*wt[pp] return K_elem_mat def getMassConsistentMat(Model, inci, coord, tabmat, tabgeo, intgauss, element_number): @@ -95,14 +95,14 @@ def getMassConsistentMat(Model, inci, coord, tabmat, tabgeo, intgauss, element_n nodelist = Model.shape.getNodeList(inci, element_number) elementcoord = Model.shape.getNodeCoord(coord, nodelist) R = tabmat[int(inci[element_number, 2]) - 1, 6] # material density - L = tabgeo[int(inci[element_number, 3] - 1), 4] + t = tabgeo[int(inci[element_number, 3] - 1), 4] pt, wt = gauss_points(type_shape, intgauss) M_elem_mat = zeros((edof, edof),dtype=FLT64) for pp in range(intgauss): detJ = Model.shape.getdetJacobi(pt[pp], elementcoord) N = Model.shape.getShapeFunctions(pt[pp], nodedof) NRN = NTRN(N, R) - M_elem_mat += NRN*L*abs(detJ)*wt[pp]*wt[pp] + M_elem_mat += NRN*t*abs(detJ)*wt[pp]*wt[pp] return M_elem_mat def getElementDeformation(U, modelinfo): @@ -120,7 +120,7 @@ def setTitleDeformation(): return ["DISPL_X", "DISPL_Y", "DISPL_Z"] def getElementVolume(Model, inci, coord, tabgeo, intgauss, element_number): - L = tabgeo[int(inci[element_number, 3] - 1), 4] + t = tabgeo[int(inci[element_number, 3] - 1), 4] shape_set = Model.shape.getShapeSet() type_shape = shape_set["key"] nodelist = Model.shape.getNodeList(inci, element_number) @@ -128,5 +128,5 @@ def getElementVolume(Model, inci, coord, tabgeo, intgauss, element_number): pt, wt = gauss_points(type_shape, intgauss) detJ = 0.0 for pp in range(intgauss): - detJ += Model.shape.getdetJacobi(pt[pp], elementcoord) - return detJ*L \ No newline at end of file + detJ += abs(Model.shape.getdetJacobi(pt[pp], elementcoord)) + return detJ*t \ No newline at end of file diff --git a/myfempy/core/shapes/quad4.py b/myfempy/core/shapes/quad4.py index 6885af5..3cd7fcb 100644 --- a/myfempy/core/shapes/quad4.py +++ b/myfempy/core/shapes/quad4.py @@ -1,6 +1,6 @@ +from __future__ import annotations from myfempy.core.shapes.shape import Shape - from myfempy.core.shapes.quad4_tasks import ShapeFunctions, DiffShapeFuntion, Jacobian, invJacobi, detJacobi, NodeList, NodeCoord, LocKey class Quad4(Shape): @@ -14,6 +14,7 @@ def getShapeSet(): "nodes": ["i", "j", "k", "l"], } return shapeset + def getShapeFunctions(r_coord, nodedof): return ShapeFunctions(r_coord, nodedof) @@ -30,7 +31,7 @@ def getJacobian(r_coord, element_coord): def getinvJacobi(r_coord, element_coord, nodedof): return invJacobi(r_coord, element_coord, nodedof) - # @profile + def getdetJacobi(r_coord, element_coord): return detJacobi(r_coord, element_coord) diff --git a/myfempy/core/shapes/quad4_tasks.pyx b/myfempy/core/shapes/quad4_tasks.pyx index 4f1a926..8660081 100644 --- a/myfempy/core/shapes/quad4_tasks.pyx +++ b/myfempy/core/shapes/quad4_tasks.pyx @@ -118,7 +118,7 @@ def invJacobi(double [:] r_coord, double [:, :] element_coord, int nodedof): mat_invJ[3, 2] = invJ[1, 0] mat_invJ[3, 3] = invJ[1, 1] - return np.array(mat_invJ) + return mat_invJ @cython.cdivision(True) @cython.exceptval(check=False) @@ -129,7 +129,7 @@ def detJacobi(double [:] r_coord, double [:, :] element_coord): cdef double [:, :] J = Jacobian(r_coord, element_coord) cdef double detJ = 0.0 detJ = DET(np.array(J).flatten()) - return np.array(detJ) + return detJ @cython.cdivision(True) @cython.exceptval(check=False) @@ -142,7 +142,7 @@ def NodeList(int [:, :] inci, int element_number): cdef int nok = int(inci[element_number, 6]) cdef int nol = int(inci[element_number, 7]) cdef int [:] node_list = np.array([noi, noj, nok, nol]) - return np.array(node_list) + return node_list @cython.cdivision(True) @cython.exceptval(check=False) @@ -163,7 +163,7 @@ def NodeCoord(double [:, :] coord, int [:] node_list): cdef double xl = coord[nol - 1, 1] cdef double yl = coord[nol - 1, 2] cdef double [:,:] element_coord = np.array([[xi, yi], [xj, yj], [xk, yk], [xl, yl]], dtype=FLT64) - return np.array(element_coord) + return element_coord @cython.cdivision(True) @cython.exceptval(check=False) @@ -176,4 +176,4 @@ def LocKey(int [:] node_list, int nodedof): for node in range(len(node_list)): for dof in range(nodedof): shape_key[nodedof*node+dof] = nodedof * node_list[node] - (nodedof-dof) - return np.array(shape_key) \ No newline at end of file + return shape_key \ No newline at end of file diff --git a/myfempy/core/shapes/tria3.py b/myfempy/core/shapes/tria3.py index eab2c2c..dd64c5b 100644 --- a/myfempy/core/shapes/tria3.py +++ b/myfempy/core/shapes/tria3.py @@ -1,10 +1,7 @@ from __future__ import annotations -import numdifftools as nd -import numpy as np - from myfempy.core.shapes.shape import Shape - +from myfempy.core.shapes.tria3_tasks import ShapeFunctions, DiffShapeFuntion, Jacobian, invJacobi, detJacobi, NodeList, NodeCoord, LocKey class Tria3(Shape): '''Triangular 3-Node Shape Class ''' @@ -18,111 +15,33 @@ def getShapeSet(): } return shapeset - def N(r_coord): - N = np.zeros((1,3)) - N[0, 0] = 1 - r_coord[0] - r_coord[1] - N[0, 1] = r_coord[0] - N[0, 2] = r_coord[1] - return N - - def diffN(shape_function, r_coord): - dN = nd.Gradient(shape_function, n = 1) - return dN(r_coord) - def getShapeFunctions(r_coord, nodedof): - - shape_function = Tria3.N(r_coord) - - mat_N = np.zeros((nodedof, 3*nodedof)) - for block in range(3): - for dof in range(nodedof): - mat_N[dof, block*nodedof+dof] = shape_function[0, block] - - return mat_N + return ShapeFunctions(r_coord, nodedof) - def getDiffShapeFuntion(shape_function, r_coord, nodedof): - - diff_shape_function = Tria3.diffN(shape_function, r_coord) - - mat_diff_N = np.zeros((2*nodedof, 3*nodedof)) + + def getDiffShapeFuntion(r_coord, nodedof): + return DiffShapeFuntion(r_coord, nodedof) - for block in range(3): - for dof in range(nodedof): - mat_diff_N[nodedof*dof-dof*(nodedof-2), block*nodedof+dof] = diff_shape_function[0, block] - mat_diff_N[nodedof*dof-dof*(nodedof-2)+1, block*nodedof+dof] = diff_shape_function[1, block] - return mat_diff_N - - - def getJacobian(shape_function, r_coord, element_coord): - # try: - return np.dot(Tria3.diffN(shape_function, r_coord), element_coord) - - # except: - # print('Error Line Jacobian Function') - - - def invJacobi(shape_function, r_coord, element_coord, nodedof): - - J = Tria3.getJacobian(shape_function, r_coord, element_coord) - - invJ = np.linalg.inv(J) + def getJacobian(r_coord, element_coord): + return Jacobian(r_coord, element_coord) - mat_invJ = np.kron(np.eye(nodedof, dtype=int), invJ) - - # mat_invJ = np.zeros((4, 4)) - - # mat_invJ[0, 0] = invJ[0, 0] - # mat_invJ[0, 1] = invJ[0, 1] - # mat_invJ[1, 0] = invJ[1, 0] - # mat_invJ[1, 1] = invJ[1, 1] - - # mat_invJ[2, 2] = invJ[0, 0] - # mat_invJ[2, 3] = invJ[0, 1] - # mat_invJ[3, 2] = invJ[1, 0] - # mat_invJ[3, 3] = invJ[1, 1] - - return mat_invJ + + def getinvJacobi(r_coord, element_coord, nodedof): + return invJacobi(r_coord, element_coord, nodedof) - def detJacobi(shape_function, r_coord, element_coord): - J = Tria3.getJacobian(shape_function, r_coord, element_coord) - return np.abs(0.5*np.linalg.det(J)) - def getNodeList(inci, element_number): - - noi = int(inci[element_number, 4]) - noj = int(inci[element_number, 5]) - nok = int(inci[element_number, 6]) - - node_list = [noi, noj, nok] - - return node_list - - def getNodeCoord(coord, node_list): - - noi = node_list[0] - noj = node_list[1] - nok = node_list[2] - - xi = coord[noi - 1, 1] - yi = coord[noi - 1, 2] - xj = coord[noj - 1, 1] - yj = coord[noj - 1, 2] - xk = coord[nok - 1, 1] - yk = coord[nok - 1, 2] - - element_coord = np.array([[xi, yi], - [xj, yj], - [xk, yk]]) - return element_coord + def getdetJacobi(r_coord, element_coord): + return detJacobi(r_coord, element_coord) + + def getNodeList(inci, element_number): + return NodeList(inci, element_number) + + def getNodeCoord(coord, node_list): + return NodeCoord(coord, node_list) - def getShapeKey(node_list, nodedof): - """element lockey(dof)""" - shape_key = np.zeros(3*nodedof, dtype=int) - - for node in range(len(node_list)): - for dof in range(nodedof): - shape_key[nodedof*node+dof] = nodedof * node_list[node] - (nodedof-dof) - return shape_key + + def getLocKey(node_list, nodedof): + return LocKey(node_list, nodedof) \ No newline at end of file diff --git a/myfempy/core/shapes/tria3_tasks.pyx b/myfempy/core/shapes/tria3_tasks.pyx new file mode 100644 index 0000000..23588bf --- /dev/null +++ b/myfempy/core/shapes/tria3_tasks.pyx @@ -0,0 +1,170 @@ +cimport cython +cimport openmp + +import numpy as np +cimport numpy as np + +INT32 = np.int32 +FLT64 = np.float64 + +ctypedef np.int32_t INT32_t +ctypedef np.float64_t FLT64_t + + +cdef double [:, :] MATN(double [:] r_coord): + cdef double [:, :] N = np.zeros((1,3), dtype=FLT64) + N[0, 0] = 1 - r_coord[0] - r_coord[1] + N[0, 1] = r_coord[0] + N[0, 2] = r_coord[1] + return N + +cdef double [:, :] MATDIFFN(double [:] r): + cdef double r1 = r[1] + cdef double r0 = r[0] + cdef double [:, :] dN = np.zeros((2,3), dtype=FLT64) + dN[0, 0] = -1.0 + dN[0, 1] = 1.0 + dN[1, 0] = -1.0 + dN[1, 2] = 1.0 + return dN + +cdef double DET(double [:] A): + cdef double det = A[0]*A[3]-A[1]*A[2] + return det + +cdef double [:,:] INV(double [:] A): + cdef double [:,:] invA = (1/A[0]*A[3]-A[1]*A[2])*np.array([[A[3], -A[1]], [-A[2], A[0]]]) + return invA + + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def ShapeFunctions(double [:] r_coord, int nodedof): + + N = MATN(r_coord) + cdef double [:, :] shape_function = N + + matN = np.zeros((nodedof, 3*nodedof), dtype=FLT64) + cdef double [:, :] mat_N = matN + + cdef Py_ssize_t block, dof + + for block in range(3): + for dof in range(nodedof): + mat_N[dof, block*nodedof+dof] = shape_function[0, block] + return matN + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def DiffShapeFuntion(double [:] r_coord, int nodedof): + + diffN = MATDIFFN(r_coord) + cdef double [:, :] diff_shape_function = diffN + + matdiffN = np.zeros((2*nodedof, 3*nodedof), dtype=FLT64) + cdef double [:, :] mat_diff_N = matdiffN + + cdef Py_ssize_t block, dof + + for block in range(3): + for dof in range(nodedof): + mat_diff_N[nodedof*dof-dof*(nodedof-2), block*nodedof+dof] = diff_shape_function[0, block] + mat_diff_N[nodedof*dof-dof*(nodedof-2)+1, block*nodedof+dof] = diff_shape_function[1, block] + + return matdiffN + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def Jacobian(double [:] r_coord, double [:, :] element_coord): + cdef double [:, :] diffN = MATDIFFN(r_coord) + cdef double [:, :] jac = np.zeros((2, 2), dtype=FLT64) + + jac[0,0] = diffN[0,0]*element_coord[0,0]+diffN[0,1]*element_coord[1,0]+diffN[0,2]*element_coord[2,0] + jac[0,1] = diffN[0,0]*element_coord[0,1]+diffN[0,1]*element_coord[1,1]+diffN[0,2]*element_coord[2,1] + jac[1,0] = diffN[1,0]*element_coord[0,0]+diffN[1,1]*element_coord[1,0]+diffN[1,2]*element_coord[2,0] + jac[1,1] = diffN[1,0]*element_coord[0,1]+diffN[1,1]*element_coord[1,1]+diffN[1,2]*element_coord[2,1] + return jac + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def invJacobi(double [:] r_coord, double [:, :] element_coord, int nodedof): + cdef double [:, :] J = Jacobian(r_coord, element_coord) + cdef double [:, :] invJ = INV(np.array(J).flatten()) + cdef double [:, :] mat_invJ = np.zeros((2*nodedof, 2*nodedof), dtype=FLT64) + + mat_invJ[0, 0] = invJ[0, 0] + mat_invJ[0, 1] = invJ[0, 1] + mat_invJ[1, 0] = invJ[1, 0] + mat_invJ[1, 1] = invJ[1, 1] + mat_invJ[2, 2] = invJ[0, 0] + mat_invJ[2, 3] = invJ[0, 1] + mat_invJ[3, 2] = invJ[1, 0] + mat_invJ[3, 3] = invJ[1, 1] + + return mat_invJ + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def detJacobi(double [:] r_coord, double [:, :] element_coord): + cdef double [:, :] J = Jacobian(r_coord, element_coord) + cdef double detJ = 0.0 + detJ = DET(np.array(J).flatten()) + return 0.5*detJ + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def NodeList(int [:, :] inci, int element_number): + cdef int noi = int(inci[element_number, 4]) + cdef int noj = int(inci[element_number, 5]) + cdef int nok = int(inci[element_number, 6]) + cdef int [:] node_list = np.array([noi, noj, nok]) + return node_list + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def NodeCoord(double [:, :] coord, int [:] node_list): + cdef int noi = node_list[0] + cdef int noj = node_list[1] + cdef int nok = node_list[2] + cdef double xi = coord[noi - 1, 1] + cdef double yi = coord[noi - 1, 2] + cdef double xj = coord[noj - 1, 1] + cdef double yj = coord[noj - 1, 2] + cdef double xk = coord[nok - 1, 1] + cdef double yk = coord[nok - 1, 2] + cdef double [:,:] element_coord = np.array([[xi, yi], [xj, yj], [xk, yk]], dtype=FLT64) + return element_coord + +@cython.cdivision(True) +@cython.exceptval(check=False) +@cython.boundscheck(False) # turn off bounds-checking for entire function +@cython.wraparound(False) # turn off negative index wrapping for entire function +@cython.nonecheck(False) +def LocKey(int [:] node_list, int nodedof): + cdef int [::1] shape_key = np.zeros(3*nodedof, dtype=INT32) + cdef Py_ssize_t node, dof + for node in range(len(node_list)): + for dof in range(nodedof): + shape_key[nodedof*node+dof] = nodedof * node_list[node] - (nodedof-dof) + return shape_key \ No newline at end of file diff --git a/myfempy/core/solver/staticlinear.py b/myfempy/core/solver/staticlinear.py index 33bc8fb..4bfd63a 100644 --- a/myfempy/core/solver/staticlinear.py +++ b/myfempy/core/solver/staticlinear.py @@ -23,7 +23,7 @@ def getMatrixAssembler(Model, inci, coord, tabmat, tabgeo, intgauss, SYMM=None, if SYMM: matrix['stiffness'] = AssemblerSYMM.getMatrixAssembler(Model, inci, coord, tabmat, tabgeo, intgauss, type_assembler = 'linear_stiffness', MP=MP) else: - matrix['stiffness'] = AssemblerFULL.getMatrixAssembler(Model, inci, coord, tabmat, tabgeo, intgauss, type_assembler = 'linear_stiffness') + matrix['stiffness'] = AssemblerFULL.getMatrixAssembler(Model, inci, coord, tabmat, tabgeo, intgauss, type_assembler = 'linear_stiffness', MP=MP) return matrix def getLoadAssembler(loadaply, nodetot, nodedof): diff --git a/myfempy/setup/fea.py b/myfempy/setup/fea.py index e911aed..a3b2abe 100644 --- a/myfempy/setup/fea.py +++ b/myfempy/setup/fea.py @@ -247,8 +247,7 @@ def PreviewAnalysis(self, previewdata): # modelinfo["forces"] = FEANewAnalysis.getLoadApply(self) # modelinfo["constrains"] = FEANewAnalysis.getBCApply(self) try: - path=str(self.path) - preview_plot(previewdata, self.modelinfo, path) + preview_plot(previewdata, self.modelinfo, str(self.path)) logging.info('TRY RUN PREVIEW PLOT -- SUCCESS') except: logging.warning('TRY RUN PREVIEW PLOT -- FAULT') diff --git a/pyproject.toml b/pyproject.toml index 2154f25..ff8cbb3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,7 +68,7 @@ classifiers = [ Documentation = "myfempy.readthedocs.io/en/latest/" Repository = "https://github.com/avgcampos/myfempy/releases" -# Cython Compiler +### Cython Compiler [build-system] requires = ["setuptools", "numpy", "cython"] build-backend = "setuptools.build_meta" diff --git a/setup_wrap_cy_pyx.py b/setup_wrap_cy_pyx.py index 9405c93..66bf1c9 100644 --- a/setup_wrap_cy_pyx.py +++ b/setup_wrap_cy_pyx.py @@ -32,5 +32,6 @@ def initialize_options(self): Extension("*", sources=["./myfempy/core/solver/assemblersymm_cython_v4.pyx"], **extension_kwargs), Extension("*", sources=["./myfempy/core/solver/assemblerfull_cython_v4.pyx"], **extension_kwargs), Extension("*", sources=["./myfempy/core/shapes/quad4_tasks.pyx"], **extension_kwargs), + Extension("*", sources=["./myfempy/core/shapes/tria3_tasks.pyx"], **extension_kwargs), ] self.distribution.ext_modules.extend(cythonize(extensions)) \ No newline at end of file