Esempio n. 1
0
def compute_stress_strain_u(pb, integral, region, material, vu, data):
    var = pb.create_variables([vu])[vu]
    var.set_data(data)

    stress = pb.evaluate('ev_cauchy_stress.%s.%s(%s, %s)'
                         % (integral, region, material, vu), verbose=False,
                         mode='el_avg', **{vu: var})
    strain = pb.evaluate('ev_cauchy_strain.%s.%s(%s)'
                         % (integral, region, vu), verbose=False,
                         mode='el_avg', **{vu: var})

    return extend_cell_data(stress, pb.domain, region), \
           extend_cell_data(strain, pb.domain, region)
Esempio n. 2
0
def compute_stress_strain_u(pb, integral, region, material, vu, data):
    var = pb.create_variables([vu])[vu]
    var.set_data(data)

    stress = pb.evaluate('ev_cauchy_stress.%s.%s(%s, %s)'
                         % (integral, region, material, vu), verbose=False,
                         mode='el_avg', **{vu: var})
    strain = pb.evaluate('ev_cauchy_strain.%s.%s(%s)'
                         % (integral, region, vu), verbose=False,
                         mode='el_avg', **{vu: var})

    return extend_cell_data(stress, pb.domain, region), \
           extend_cell_data(strain, pb.domain, region)
Esempio n. 3
0
def post_process(out, pb, state, extend=False):
    """
    Calculate and output the strain and stresses for the given state.
    """
    from sfepy.base.base import Struct
    from sfepy.discrete.fem import extend_cell_data

    ev = pb.evaluate
    strain = ev('ev_cauchy_strain.i.Y(u)', mode='el_avg')
    stress = ev('ev_cauchy_stress.i.Y(inclusion.D, u)', mode='el_avg')

    piezo = -ev('ev_piezo_stress.i.Y2(inclusion.coupling, phi)', mode='el_avg')
    piezo = extend_cell_data(piezo, pb.domain, 'Y2', val=0.0)

    out['cauchy_strain'] = Struct(name='output_data',
                                  mode='cell',
                                  data=strain,
                                  dofs=None)
    out['elastic_stress'] = Struct(name='output_data',
                                   mode='cell',
                                   data=stress,
                                   dofs=None)
    out['piezo_stress'] = Struct(name='output_data',
                                 mode='cell',
                                 data=piezo,
                                 dofs=None)
    out['total_stress'] = Struct(name='output_data',
                                 mode='cell',
                                 data=stress + piezo,
                                 dofs=None)

    return out
Esempio n. 4
0
def compute_mac_stress_part(pb, integral, region, material, vu, mac_strain):

    avgmat = pb.evaluate('ev_integrate_mat.%s.%s( %s, %s )' \
                         % (integral, region, material, vu), verbose=False,
                         mode='el_avg')

    return extend_cell_data(nm.dot(avgmat, mac_strain), pb.domain, region)
Esempio n. 5
0
def compute_mac_stress_part( pb, integral, region, material, vu, mac_strain ):

    avgmat = pb.evaluate('ev_integrate_mat.%s.%s( %s, %s )' \
                         % (integral, region, material, vu), verbose=False,
                         mode='el_avg')

    return extend_cell_data( nm.dot( avgmat, mac_strain ), pb.domain, region )
Esempio n. 6
0
def post_process(out, pb, state, extend=False):
    """
    Calculate and output the strain and stresses for the given state.
    """
    from sfepy.base.base import Struct
    from sfepy.discrete.fem import extend_cell_data

    ev = pb.evaluate
    strain = ev('ev_cauchy_strain.i.Y(u)', mode='el_avg')
    stress = ev('ev_cauchy_stress.i.Y(inclusion.D, u)', mode='el_avg')

    piezo = -ev('ev_piezo_stress.i.Y2(inclusion.coupling, phi)',
                mode='el_avg')
    piezo = extend_cell_data(piezo, pb.domain, 'Y2', val=0.0)

    piezo_strain = ev('ev_piezo_strain.i.Y(inclusion.coupling, u)',
                      mode='el_avg')

    out['cauchy_strain'] = Struct(name='output_data', mode='cell',
                                  data=strain, dofs=None)
    out['elastic_stress'] = Struct(name='output_data', mode='cell',
                                   data=stress, dofs=None)
    out['piezo_stress'] = Struct(name='output_data', mode='cell',
                                 data=piezo, dofs=None)
    out['piezo_strain'] = Struct(name='output_data', mode='cell',
                                 data=piezo_strain, dofs=None)
    out['total_stress'] = Struct(name='output_data', mode='cell',
                                 data=stress + piezo, dofs=None)

    return out
def post_process(out, pb, state, extend=False):
    from sfepy.base.base import Struct
    from sfepy.discrete.fem import extend_cell_data

    ev = pb.evaluate
    gap = ev('dw_contact.i.Contact(contact.epss, v, u)',
             mode='el_avg', term_mode='gap')
    gap = extend_cell_data(gap, pb.domain, 'Contact', val=0.0, is_surface=True)
    out['gap'] = Struct(name='output_data',
                        mode='cell', data=gap, dofs=None)

    return out
Esempio n. 8
0
def add_stress_p(out, pb, integral, region, vp, data):
    var = pb.create_variables([vp])[vp]
    var.set_data(data)

    press0 = pb.evaluate('ev_volume_integrate.%s.%s(%s)'
                         % (integral, region, vp), verbose=False,
                         mode='el_avg', **{vp: var})
    press = extend_cell_data(press0, pb.domain, region)

    dim = pb.domain.mesh.dim
    nn = out.shape[0]
    for ii in range(nn):
        for j in range(dim):
            out[ii, 0, j, 0] += press[ii, 0, 0, 0]
Esempio n. 9
0
def add_stress_p(out, pb, integral, region, vp, data):
    var = pb.create_variables([vp])[vp]
    var.set_data(data)

    press0 = pb.evaluate('ev_volume_integrate.%s.%s(%s)'
                         % (integral, region, vp), verbose=False,
                         mode='el_avg', **{vp: var})
    press = extend_cell_data(press0, pb.domain, region)

    dim = pb.domain.mesh.dim
    nn = out.shape[0]
    for ii in range(nn):
        for j in range(dim):
            out[ii, 0, j, 0] += press[ii, 0, 0, 0]
Esempio n. 10
0
def post_process(out, problem, mtx_phi):
    var = problem.get_variables()['u']

    for key in out.keys():
        ii = int(key[1:])
        vec = mtx_phi[:,ii].copy()
        var.set_data(vec)

        strain = problem.evaluate('ev_cauchy_strain.i.Y_c(u)', u=var,
                                  verbose=False, mode='el_avg')
        strain = extend_cell_data(strain, problem.domain, 'Y_c')
        out['strain%03d' % ii] = Struct(name='output_data',
                                        mode='cell', data=strain,
                                        dofs=None)
    return out
Esempio n. 11
0
def post_process(out, problem, mtx_phi):
    var = problem.get_variables()['u']

    for key in out.keys():
        ii = int(key[1:])
        vec = mtx_phi[:,ii].copy()
        var.set_data(vec)

        strain = problem.evaluate('ev_cauchy_strain.i.Y_c(u)', u=var,
                                  verbose=False, mode='el_avg')
        strain = extend_cell_data(strain, problem.domain, 'Y_c')
        out['strain%03d' % ii] = Struct(name='output_data',
                                        mode='cell', data=strain,
                                        dofs=None)
    return out
Esempio n. 12
0
def recover_bones(problem, micro_problem, region, eps0,
                  ts, strain, dstrains, p_grad, pressures,
                  corrs_permeability, corrs_rs, corrs_time_rs,
                  corrs_pressure, corrs_time_pressure,
                  var_names, naming_scheme='step_iel'):
    r"""
    Notes
    -----
    - note that

      .. math::
        \widetilde{\pi}^P

      is in corrs_pressure -> from time correctors only 'u', 'dp' are needed.
    """

    dim = problem.domain.mesh.dim

    vu, vp, vn, vpp1, vppp1 = var_names
    vdp = 'd' + vp

    variables = micro_problem.create_variables()
    to_output = variables.state_to_output

    micro_u, micro_p = variables[vu], variables[vp]

    micro_coor = micro_u.field.get_coor()

    nodes_yc = micro_problem.domain.regions['Yc'].vertices

    join = os.path.join
    format = get_print_info(problem.domain.mesh.n_el, fill='0')[1]

    for ii, iel in enumerate(region.cells):
        print('ii: %d, iel: %d' % (ii, iel))

        pressure = pressures[-1][ii, 0, 0, 0]

        us = corrs_pressure[vu].data * pressure
        add_strain_rs(corrs_rs, strain, vu, dim, ii, out=us)

        ut = convolve_field_scalar(corrs_time_pressure[vu], pressures, ii, ts)
        ut += convolve_field_sym_tensor(corrs_time_rs, dstrains, vu,
                                        dim, ii, ts)
        u1 = us + ut

        u_mic = compute_u_from_macro(strain, micro_coor, ii) + u1

        ps = corrs_pressure[vp].data * pressure

        pt = convolve_field_scalar(corrs_time_pressure[vdp], pressures, ii, ts)
        pt += convolve_field_sym_tensor(corrs_time_rs, dstrains, vdp,
                                        dim, ii, ts)
        p_hat = ps + pt

        # \eta_k \partial_k^x p
        p1 = combine_scalar_grad(corrs_permeability, p_grad, vn, ii)

        p_hat_e = micro_p.field.extend_dofs(p_hat[:, None], fill_value=0.0)
        p_mic = compute_p_from_macro(p_grad, micro_coor, ii)[:, None] \
                + p_hat_e / eps0
        p_mic[nodes_yc] = p1[:, None]

        # (y_k + \eta_k) \partial_k^x p
        p_aux = combine_scalar_grad(corrs_permeability, p_grad, vn, ii,
                                    shift_coors=micro_coor[nodes_yc])

        meval = micro_problem.evaluate

        var_p = variables[vppp1]
        var_p.set_data(p_aux)
        dvel_m1 = meval('ev_diffusion_velocity.i1.Yc(m.K, %s)' % vppp1,
                        verbose=False, mode='el_avg', **{vppp1: var_p})

        var_p = variables[vpp1]
        var_p.set_data(p_hat)
        dvel_m2 = meval('ev_diffusion_velocity.i1.Ym(m.K, %s)' % vpp1,
                        verbose=False, mode='el_avg',
                        **{vpp1: var_p}) * eps0

        out = {}
        out.update(to_output(u_mic, var_info={vu: (True, vu)},
                             extend=True))
        out[vp] = Struct(name='output_data',
                         mode='vertex', data=p_mic,
                         var_name=vp, dofs=micro_p.dofs)

        aux = extend_cell_data(dvel_m1, micro_problem.domain, 'Yc')
        out['dvel_m1'] = Struct(name='output_data',
                                mode='cell', data=aux,
                                dofs=None)

        aux = extend_cell_data(dvel_m2, micro_problem.domain, 'Ym')
        out['dvel_m2'] = Struct(name='output_data',
                                mode='cell', data=aux,
                                dofs=None)

        suffix = get_output_suffix(iel, ts, naming_scheme, format,
                                   micro_problem.output_format)
        micro_name = micro_problem.get_output_name(extra=suffix)
        filename = join(problem.output_dir,
                        'recovered_' + os.path.basename(micro_name))

        micro_problem.save_state(filename, out=out, ts=ts)
Esempio n. 13
0
def recover_bones( problem, micro_problem, region, eps0,
                   ts, strain, dstrains, p_grad, pressures,
                   corrs_permeability, corrs_rs, corrs_time_rs,
                   corrs_pressure, corrs_time_pressure,
                   var_names, naming_scheme = 'step_iel' ):
    r"""
    Notes
    -----
    - note that

      .. math::
        \widetilde{\pi}^P

      is in corrs_pressure -> from time correctors only 'u', 'dp' are needed.
    """

    dim = problem.domain.mesh.dim

    vu, vp, vn, vpp1, vppp1 = var_names
    vdp = 'd' + vp

    variables = micro_problem.create_variables()
    to_output = variables.state_to_output

    micro_u, micro_p = variables[vu], variables[vp]

    micro_coor = micro_u.field.get_coor()

    nodes_yc = micro_problem.domain.regions['Yc'].vertices

    join = os.path.join
    aux = max(problem.domain.shape.n_gr, 2)
    format = get_print_info( aux, fill = '0' )[1] \
             + '_' + get_print_info( problem.domain.mesh.n_el, fill = '0' )[1]

    for ig, ii, iel in region.iter_cells():
        print 'ig: %d, ii: %d, iel: %d' % (ig, ii, iel)

        pressure = pressures[-1][ii,0,0,0]

        us = corrs_pressure[vu].data * pressure
        add_strain_rs(corrs_rs, strain, vu, dim, ii, out=us)

        ut = convolve_field_scalar(corrs_time_pressure[vu], pressures, ii, ts)
        ut += convolve_field_sym_tensor(corrs_time_rs, dstrains, vu,
                                        dim, ii, ts)
        u1 = us  + ut

        u_mic = compute_u_from_macro(strain, micro_coor, ii ) + u1

        ps = corrs_pressure[vp].data * pressure

        pt = convolve_field_scalar(corrs_time_pressure[vdp], pressures, ii, ts)
        pt += convolve_field_sym_tensor(corrs_time_rs, dstrains, vdp,
                                        dim, ii, ts)
##     print us
##     print ut
##     print ps
##     print pt

        p_hat = ps  + pt

        # \eta_k \partial_k^x p
        p1 = combine_scalar_grad(corrs_permeability, p_grad, vn, ii)

        p_hat_e = micro_p.field.extend_dofs(p_hat[:,None], fill_value=0.0)
        p_mic = compute_p_from_macro(p_grad, micro_coor, ii)[:,None] \
                + p_hat_e / eps0
        p_mic[nodes_yc] = p1[:,None]
        
##         print u_mic
##         print p_mic

        # (y_k + \eta_k) \partial_k^x p
        p_aux = combine_scalar_grad(corrs_permeability, p_grad, vn, ii,
                                    shift_coors=micro_coor[nodes_yc])

        meval = micro_problem.evaluate

        var_p = variables[vppp1]
        var_p.set_data(p_aux)
        dvel_m1 = meval('ev_diffusion_velocity.i1.Yc( m.K, %s )' % vppp1,
                        verbose=False, mode='el_avg', **{vppp1 : var_p})

        var_p = variables[vpp1]
        var_p.set_data(p_hat)
        dvel_m2 = meval('ev_diffusion_velocity.i1.Ym( m.K, %s )' % vpp1,
                        verbose=False, mode='el_avg',
                        **{vpp1 : var_p}) * eps0
        
        out = {}
        out.update( to_output( u_mic, var_info = {vu : (True, vu)},
                               extend = True ) )
        out[vp] = Struct(name = 'output_data',
                         mode = 'vertex', data = p_mic,
                         var_name = vp, dofs = micro_p.dofs)

        aux = extend_cell_data(dvel_m1, micro_problem.domain, 'Yc')
        out['dvel_m1'] = Struct(name = 'output_data',
                                mode = 'cell', data = aux,
                                dofs = None)

        aux = extend_cell_data(dvel_m2, micro_problem.domain, 'Ym')
        out['dvel_m2'] = Struct(name = 'output_data',
                                mode = 'cell', data = aux,
                                dofs = None)

        suffix = get_output_suffix(ig, iel, ts, naming_scheme, format,
                                   micro_problem.output_format)
        micro_name = micro_problem.get_output_name(extra=suffix)
        filename = join(problem.output_dir,
                        'recovered_' + os.path.basename(micro_name))

        micro_problem.save_state(filename, out=out, ts=ts)