Hi,
I am running the following FE simulation example (linear_elastic_tractions)
as a python program.
The first question is how to change the definition of the pressure traction
at the surface. In my problem I have different force values for each node
in the top/bottom region?
The second question is about how to calculate the stress results. I
extendes the traction example with a post_process_hook. My program is as
follows:
# coding: utf-8
from __future__ import print_function
from __future__ import absolute_import
from argparse import ArgumentParser
import numpy as nm
import time
import sys
sys.path.append('.')
from sfepy.base.base import IndexedStruct
from sfepy.discrete import (FieldVariable, Material, Integral,
Equation, Equations, Problem, Function)
from sfepy.discrete.fem import Mesh, FEDomain, Field
from sfepy.terms import Term
from sfepy.discrete.conditions import Conditions, EssentialBC
from sfepy.solvers.ls import ScipyDirect
from sfepy.solvers.nls import Newton
from sfepy.postprocess.viewer import Viewer
from sfepy.mechanics.matcoefs import stiffness_from_lame
def linear_tension(ts, coor, mode=None, **kwargs):
if mode == 'qp':
val = nm.tile(1.0, (coor.shape[0], 1, 1))
return {'val' : val}
def post_process(out, problem, state, extend=False):
from sfepy.base.base import Struct
# Cauchy strain averaged in elements.
strain = problem.evaluate('ev_cauchy_strain.2.Omega(u)',
mode='el_avg')
out['cauchy_strain'] = Struct(name='output_data',
mode='cell', data=strain,
dofs=None)
# Cauchy stress averaged in elements.
stress = problem.evaluate('ev_cauchy_stress.2.Omega(solid.D, u)',
mode='el_avg')
out['cauchy_stress'] = Struct(name='output_data',
mode='cell', data=stress,
dofs=None)
return out
def cube_displacement_medium():
from sfepy import data_dir
parser = ArgumentParser()
parser.add_argument('--version', action='version', version='%(prog)s')
parser.add_argument('-s', '--show',
action="store_true", dest='show',
default=True, help=help['show'])
options = parser.parse_args()
mesh = Mesh.from_file(data_dir + '/meshes/3d/cube_medium_tetra.mesh')
print("Mesh number of nodes: {}, number of tetrahedrons:
{}".format(mesh.n_nod, mesh.n_el))
domain = FEDomain('domain', mesh)
domain.refine()
omega = domain.create_region('Omega', 'all')
left = domain.create_region('Left',
'vertices in (x < -0.1)',
'facet')
right = domain.create_region('Right',
'vertices in (x > 0.3)',
'facet')
field = Field.from_args('displacement', nm.float64, 3, omega,
approx_order=1)
u = FieldVariable('u', 'unknown', field, order=0)
v = FieldVariable('v', 'test', field, primary_var_name='u')
solid = Material('solid', values={'D': stiffness_from_lame(dim=3,
lam=5.769, mu=3.846)})
load = Material('load', function=linear_tension)
integral = Integral('i', order=2)
t1 = Term.new('dw_lin_elastic(solid.D, v, u)', integral, omega,
solid=solid, v=v, u=u)
t2 = Term.new('dw_surface_ltr(load.val, v)', integral, right,
load=load, v=v)
eq = Equation('elasticity', t1 - t2)
eqs = Equations([eq])
fixb = EssentialBC('fixb', left, {'u.all' : 0.0})
fixt = EssentialBC('fixt', right, {'u.[1,2]' : 0.0})
ls = ScipyDirect({})
nls_status = IndexedStruct()
nls = Newton({ 'i_max' : 1,
'eps_a' : 1e-10,
'eps_r' : 1.0,
'macheps' : 1e-16,
# Linear system error < (eps_a * lin_red).
'lin_red' : 1e-2,
'ls_red' : 0.1,
'ls_red_warp' : 0.001,
'ls_on' : 1.1,
'ls_min' : 1e-5,
'check' : 0,
'delta' : 1e-6, }, lin_solver=ls, status=nls_status)
pb = Problem('linear_elastic_traction', equations=eqs, nls=nls, ls=ls)
pb.save_regions_as_groups('regions')
pb.time_update(ebcs=Conditions([fixb, fixt]))
vec = pb.solve()
print(nls_status)
# calculate stress
pb.save_state('linear_elastic_traction_cylinder.vtk', vec,
post_process_hook=post_process)
if options.show:
view = Viewer('linear_elastic_traction_cylinder.vtk')
view(vector_mode='warp_norm', rel_scaling=2,
is_scalar_bar=True, is_wireframe=True)
if __name__ == '__main__':
cube_displacement_medium()
When I am running the program I get the following error from the post
process function:
sfepy: ev_cauchy_stress.2.Omega(solid.D, u)
Traceback (most recent call last):
File "/home/experimental/fem/linear_elastic_traction_tetraeder.py", line
440, in <module>
runtime_small_cube, nodes_small_cube = cube_displacement_medium()
File "/home/experimental/fem/linear_elastic_traction_tetraeder.py", line
345, in cube_displacement_medium
pb.save_state('linear_elastic_traction_cylinder.vtk', vec,
post_process_hook=post_process)
File
"/bin/python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/discrete/problem.py",
line 773, in save_state
out = post_process_hook(out, self, state, extend=extend)
File "/home/experimental/fem/linear_elastic_traction_tetraeder.py", line
85, in post_process
mode='el_avg')
File
"/bin/python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/discrete/problem.py",
line 1262, in evaluate
verbose=verbose, **kwargs)
File
"/bin/python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/discrete/problem.py",
line 1203, in create_evaluable
kwargs=kwargs)
File
"/bin/python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/discrete/evaluate.py",
line 213, in create_evaluable
user=extra_args, verbose=verbose)
File
"/bin//python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/discrete/equations.py",
line 66, in from_conf
materials, integrals, user=user)
File
"/bin/python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/discrete/equations.py",
line 751, in from_desc
terms.assign_args(variables, materials, user)
File
"/bin/python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/terms/terms.py",
line 295, in assign_args
term.assign_args(variables, materials, user)
File
"/bin/python27/lib/python2.7/site-packages/sfepy-2016.3_git_f99ff34eeb05ea11e61aa3639c47537daba7cc64-py2.7-linux-x86_64.egg/sfepy/terms/terms.py",
line 506, in assign_args
% arg_name)
ValueError: material argument solid not found!
It seems that the defined material is not known in the function. Can anyone
help me? Thank you.