在 2016年8月31日星期三 UTC+2下午10:40:22,Robert Cimrman写道:
On 08/31/2016 04:45 PM, Ronghai Wu wrote:
>
>
> 在 2016年8月30日星期二 UTC+2下午9:05:43,Robert Cimrman写道:
>>
>> On 08/30/2016 03:21 PM, Ronghai Wu wrote:
>>> (2) In the interactive linear elasticity example [1], we can have access
>> to
>>> the displacement, stress and strain arrays by
>>>
>>>
>>> vec = pb.solve()
>>> strain = pb.evaluate('ev_cauchy_strain.2.Omega(u)', mode='el_avg')
>>> stress = pb.evaluate('ev_cauchy_stress.2.Omega(u)', mode='el_avg')
>>>
>>> Can I get access to the whole (global) displacement, stress and strain
>> arrays in parallel example?
>>
>> Yes, after the call to pl.create_gather_to_zero() you have the whole
>> solution
>> vector in the task 0 (sol = psol_full[...].copy()....). Then you can
>> evaluate
>> global strain and stress as usual.
>>
>>
> As I do the following things with 2D mesh 50*50 in [2]
>
>         sol = psol_full[...].copy()
>         print 'sol is:',sol
>         print 'sol shape is:',sol.shape
>         u = FieldVariable('u', 'parameter', field1,
>               primary_var_name='(set-to-None)')
>         remap = gfds[0].id_map
>         ug = sol[remap]
>         print 'ug is:', ug
>         print 'ug shape is:', ug.shape
>         strain = pb.evaluate('ev_cauchy_strain.2.Omega(u)', mode='el_avg')
>         print 'strain is:', strain
>         print 'strain shape is:', strain
>
> I got {sol shape is: (7500,)} and {ug shape is: (5000,)}. Is {ug} the
> displacement at element center? and {ug[0]} is the displacement in x-axis?

sol contains both the displacements (2 components) and the pressure (it is the
Biot problem example, right?), that is why it is bigger by 3/2. ug are the
usual displacements in nodes in the correct sfepy ordering.

> But {strain = pb.evaluate('ev_cauchy_strain.2.Omega(u)', mode='el_avg')}
> does not work, with ValueError: argument u not found!
> This way works for interactive linear elasticity example, why it does not
> work here?

It does not work, because pb is a task-local Problem, with variables named u_i,
p_i, instead of u, p.

In order to evaluate a term globally, do something like this:

         # Set the actual global solution vector to u.
         u.set_data(ug)

         integral = Integral('i', order=2*(max(order_u, order_p)))
         term = Term.new('ev_cauchy_strain(u)', integral, u.field.region, u=u)
         term.setup()

         strain = term.evaluate(mode='el_avg')

         print 'strain is:', strain
         print 'strain shape is:', strain.shape

Does that work for you?



Yes, it works. I will try to fit parallel running into my codes based on [2]. If I have further problem, I may need more help. Thank you as always.

r.

 
r.

>>>
>>> [1]
>> http://sfepy.org/doc/tutorial.html#interactive-example-linear-elasticity
>>> [2]
>>>
>> http://sfepy.org/doc-devel/examples/multi_physics/biot_parallel_interactive.html#multi-physics-biot-parallel-interactive
>>>
>>>
>>> Thanks
>>> Ronghai
>>>
>>
>>
>