def compute_stress_strain_u( pb, integral, region, material, vu, data ): var = pb.create_variables([vu])[vu] var.data_from_any(data) stress = pb.evaluate('de_cauchy_stress.%s.%s( %s, %s )' % (integral, region, material, vu), verbose=False, mode='el_avg', **{vu : var}) strain = pb.evaluate('de_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 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('di_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_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 add_stress_p( out, pb, integral, region, vp, data ): var = pb.create_variables([vp])[vp] var.data_from_any(data) press0 = pb.evaluate('de_average_variable.%s.%s( %s )' \ % (integral, region, vp), verbose=False, **{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 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 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.data_from_any(vec) strain = problem.evaluate('ev_cauchy_strain.i1.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'].all_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)
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'].all_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.data_from_any(p_aux) dvel_m1 = meval('de_diffusion_velocity.i1.Yc( m.K, %s )' % vppp1, verbose=False, mode='el_avg', **{vppp1 : var_p}) var_p = variables[vpp1] var_p.data_from_any(p_hat) dvel_m2 = meval('de_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)