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)
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
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)
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 )
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
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]
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
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)
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)