def recovery_perf(pb, corrs, macro): from sfepy.homogenization.recovery import compute_p_from_macro from sfepy.base.base import Struct slev = '' micro_coors = pb.domain.mesh.coors micro_nnod = pb.domain.mesh.n_nod centre_Y = nm.sum(pb.domain.mesh.coors, axis=0) / micro_nnod nodes_Y = {} channels = {} for k in macro.iterkeys(): if 'press' in k: channels[k[-1]] = 1 channels = channels.keys() varnames = ['pM'] for ch in channels: nodes_Y[ch] = pb.domain.regions['Y' + ch].all_vertices varnames.append('p' + ch) pvars = pb.create_variables(varnames) press = {} # matrix press['M'] = \ corrs['corrs_%s_gamma_p' % pb_def['name']]['pM'] * macro['g_p'] + \ corrs['corrs_%s_gamma_m' % pb_def['name']]['pM'] * macro['g_m'] out = {} # channels for ch in channels: press_mac = macro['press' + ch][0,0] press_mac_grad = macro['pressg' + ch] nnod = corrs['corrs_%s_pi%s' % (pb_def['name'], ch)]\ ['p%s_0' % ch].shape[0] press_mic = nm.zeros( (nnod,1) ) for key, val in \ corrs['corrs_%s_pi%s' % (pb_def['name'], ch)].iteritems(): kk = int( key[-1] ) press_mic += val * press_mac_grad[kk,0] for key in corrs.iterkeys(): if ('_gamma_' + ch in key): kk = int(key[-1]) - 1 press_mic += corrs[key]['p' + ch] * macro['g' + ch][kk] press_mic += \ compute_p_from_macro(press_mac_grad[nm.newaxis,nm.newaxis,:,:], micro_coors[nodes_Y[ch]], 0, centre=centre_Y, extdim=-1).reshape((nnod,1)) press[ch] = press_mac + eps0 * press_mic out[slev + 'p' + ch] = Struct(name='output_data', mode='vertex', data=press[ch], var_name='p' + ch, dofs=None) pvars['p' + ch].set_data(press_mic) dvel = pb.evaluate('ev_diffusion_velocity.iV.Y%s(mat1%s.k, p%s)'\ % (ch, ch, ch), var_dict = {'p' + ch: pvars['p' + ch]}, mode='el_avg') out[slev + 'w' + ch] = Struct(name='output_data', mode='cell', data=dvel, var_name='w' + ch, dofs=None) press['M'] += corrs['corrs_%s_eta%s' % (pb_def['name'], ch)]['pM']\ * press_mac pvars['pM'].set_data(press['M']) dvel = pb.evaluate('%e * ev_diffusion_velocity.iV.YM(mat1M.k, pM)' % eps0, var_dict = {'pM': pvars['pM']}, mode='el_avg') out[slev + 'pM'] = Struct(name='output_data', mode='vertex', dat =press['M'], var_name='pM', dofs=None) out[slev + 'wM'] = Struct(name='output_data', mode='cell', data=dvel, var_name='wM', dofs=None ) return out
def recovery_perf(pb, corrs, macro): from sfepy.homogenization.recovery import compute_p_from_macro from sfepy.base.base import Struct slev = '' micro_coors = pb.domain.mesh.coors micro_nnod = pb.domain.mesh.n_nod centre_Y = nm.sum(pb.domain.mesh.coors, axis=0) / micro_nnod nodes_Y = {} channels = {} for k in macro.iterkeys(): if 'press' in k: channels[k[-1]] = 1 channels = channels.keys() varnames = ['pM'] for ch in channels: nodes_Y[ch] = pb.domain.regions['Y' + ch].vertices varnames.append('p' + ch) pvars = pb.create_variables(varnames) press = {} # matrix press['M'] = \ corrs['corrs_%s_gamma_p' % pb_def['name']]['pM'] * macro['g_p'] + \ corrs['corrs_%s_gamma_m' % pb_def['name']]['pM'] * macro['g_m'] out = {} # channels for ch in channels: press_mac = macro['press' + ch][0, 0] press_mac_grad = macro['pressg' + ch] nnod = corrs['corrs_%s_pi%s' % (pb_def['name'], ch)]\ ['p%s_0' % ch].shape[0] press_mic = nm.zeros((nnod, 1)) for key, val in \ corrs['corrs_%s_pi%s' % (pb_def['name'], ch)].iteritems(): kk = int(key[-1]) press_mic += val * press_mac_grad[kk, 0] for key in corrs.iterkeys(): if ('_gamma_' + ch in key): kk = int(key[-1]) - 1 press_mic += corrs[key]['p' + ch] * macro['g' + ch][kk] press_mic += \ compute_p_from_macro(press_mac_grad[nm.newaxis,nm.newaxis,:,:], micro_coors[nodes_Y[ch]], 0, centre=centre_Y, extdim=-1).reshape((nnod,1)) press[ch] = press_mac + eps0 * press_mic out[slev + 'p' + ch] = Struct(name='output_data', mode='vertex', data=press[ch], var_name='p' + ch, dofs=None) pvars['p' + ch].set_data(press_mic) dvel = pb.evaluate('ev_diffusion_velocity.iV.Y%s(mat1%s.k, p%s)'\ % (ch, ch, ch), var_dict = {'p' + ch: pvars['p' + ch]}, mode='el_avg') out[slev + 'w' + ch] = Struct(name='output_data', mode='cell', data=dvel, var_name='w' + ch, dofs=None) press['M'] += corrs['corrs_%s_eta%s' % (pb_def['name'], ch)]['pM']\ * press_mac pvars['pM'].set_data(press['M']) dvel = pb.evaluate('%e * ev_diffusion_velocity.iV.YM(mat1M.k, pM)' % eps0, var_dict={'pM': pvars['pM']}, mode='el_avg') out[slev + 'pM'] = Struct(name='output_data', mode='vertex', dat=press['M'], var_name='pM', dofs=None) out[slev + 'wM'] = Struct(name='output_data', mode='cell', data=dvel, var_name='wM', dofs=None) return out