def do_add_matrix_expr(self, v, suffix, ind_vars, name, f_name): from petram.helper.variables import add_expression, add_constant from petram.helper.variables import NativeCoefficientGenBase kywds = {} if isinstance(self, Domain): kywds['domains'] = self._sel_index kywds['gdomain'] = self._global_ns elif isinstance(self, Bdry): kywds['bdrs'] = self._sel_index kywds['gbdr'] = self._global_ns if isinstance(f_name, NativeCoefficientGenBase): pass elif len(f_name) == 1: if not isinstance(f_name[0], str): expr = f_name[0].__repr__() else: expr = f_name[0] add_expression(v, name, suffix, ind_vars, expr, [], **kywds) else: # elemental format expr_txt = [ x.__repr__() if not isinstance(x, str) else x for x in f_name ] a = '[' + ','.join(expr_txt[:3]) + ']' b = '[' + ','.join(expr_txt[3:6]) + ']' c = '[' + ','.join(expr_txt[6:]) + ']' expr = '[' + ','.join((a, b, c)) + ']' add_expression(v, name, suffix, ind_vars, expr, [], **kywds)
def add_sigma_epsilonr_mur(name, f_name): if isinstance(f_name[0], NativeCoefficientGenBase): pass elif len(f_name) == 1: if not isinstance(f_name[0], str): expr = f_name[0].__repr__() else: expr = f_name[0] add_expression(v, name, suffix, ind_vars, expr, [], domains=self._sel_index, gdomain=self._global_ns) else: # elemental format expr_txt = [ x.__repr__() if not isinstance(x, str) else x for x in f_name ] a = '[' + ','.join(expr_txt[:3]) + ']' b = '[' + ','.join(expr_txt[3:6]) + ']' c = '[' + ','.join(expr_txt[6:]) + ']' expr = '[' + ','.join((a, b, c)) + ']' add_expression(v, name, suffix, ind_vars, expr, [], domains=self._sel_index, gdomain=self._global_ns)
def add_variables(self, v, name, solr, soli = None): from petram.helper.variables import add_coordinates from petram.helper.variables import add_scalar from petram.helper.variables import add_components from petram.helper.variables import add_elements from petram.helper.variables import add_expression from petram.helper.variables import add_surf_normals from petram.helper.variables import add_constant from petram.phys.em3d.eval_deriv import eval_curl def evalB(gfr, gfi = None): gfr, gfi, extra = eval_curl(gfr, gfi) gfi /= (2*self.freq*np.pi) # real B gfr /= -(2*self.freq*np.pi) # imag B return gfi, gfr, extra ind_vars = [x.strip() for x in self.ind_vars.split(',')] suffix = self.dep_vars_suffix from petram.helper.variables import TestVariable #v['debug_test'] = TestVariable() add_coordinates(v, ind_vars) add_surf_normals(v, ind_vars) if name.startswith('Et'): add_elements(v, 'E', suffix, ind_vars, solr, soli, elements=[0,1]) elif name.startswith('rEf'): add_scalar(v, 'rEf', suffix, ind_vars, solr, soli) add_expression(v, 'Ephi', suffix, ind_vars, 'rEf/r', ['rEf',]) elif name.startswith('psi'): add_scalar(v, 'psi', suffix, ind_vars, solr, soli) add_expression(v, 'E', suffix, ind_vars, 'array([Er, Ephi, Ez])', ['Er', 'Ephi', 'Ez']) # collect all definition from children #for mm in self.walk(): # if not mm.enabled: continue # if mm is self: continue # mm.add_domain_variables(v, name, suffix, ind_vars, # solr, soli) # mm.add_bdr_variables(v, name, suffix, ind_vars, # solr, soli) return v
def add_sigma_epsilonr_mur(name, f_name): if isinstance(f_name, NativeCoefficientGenBase): pass elif isinstance(f_name, str): add_expression(v, name, suffix, ind_vars, f_name, [], domains=self._sel_index, gdomain=self._global_ns) else: add_constant(v, name, suffix, f_name, domains=self._sel_index, gdomain=self._global_ns)
def do_add_scalar_expr(self, v, suffix, ind_vars, name, f_name, add_diag=False): from petram.helper.variables import add_expression, add_constant from petram.helper.variables import NativeCoefficientGenBase kywds = {} if isinstance(self, Domain): kywds['domains'] = self._sel_index kywds['gdomain'] = self._global_ns elif isinstance(self, Bdry): kywds['bdrs'] = self._sel_index kywds['gbdr'] = self._global_ns if isinstance(f_name, NativeCoefficientGenBase): pass elif isinstance(f_name, str): add_expression(v, name, suffix, ind_vars, f_name, [], **kywds) else: add_constant(v, name, suffix, f_name, **kywds) if add_diag: ''' convension: scalar parameters should be s+name ex) in RF epsilonr is (3,3) sepsilonr : scarlar version epsilonr : matrix ''' size = int(add_diag) add_expression(v, name[1:], suffix, ind_vars, 'diag([1]*' + str(size) + ')*' + name, [name], **kywds)
def add_domain_variables(self, v, n, suffix, ind_vars, solr, soli=None): from petram.helper.variables import add_expression, add_constant if len(self._sel_index) == 0: return var, f_name = self.eval_phys_expr(self.epsilonr, 'epsilonr') if callable(var): add_expression(v, 'epsilonr', suffix, ind_vars, f_name, [], domains=self._sel_index, gdomain=self._global_ns) else: add_constant(v, 'epsilonr', suffix, var, domains=self._sel_index, gdomain=self._global_ns) var, f_name = self.eval_phys_expr(self.mur, 'mur') if callable(var): add_expression(v, 'mur', suffix, ind_vars, f_name, [], domains=self._sel_index, gdomain=self._global_ns) else: add_constant(v, 'mur', suffix, var, domains=self._sel_index, gdomain=self._global_ns) var, f_name = self.eval_phys_expr(self.sigma, 'sigma') if callable(var): add_expression(v, 'sigma', suffix, ind_vars, f_name, [], domains=self._sel_index, gdomain=self._global_ns) else: add_constant(v, 'sigma', suffix, var, domains=self._sel_index, gdomain=self._global_ns)
def add_variables(self, v, name, solr, soli = None): from petram.helper.variables import add_coordinates from petram.helper.variables import add_scalar from petram.helper.variables import add_components from petram.helper.variables import add_expression from petram.helper.variables import add_surf_normals from petram.helper.variables import add_constant ind_vars = [x.strip() for x in self.ind_vars.split(',')] suffix = self.dep_vars_suffix from petram.helper.variables import TestVariable #v['debug_test'] = TestVariable() add_coordinates(v, ind_vars) add_surf_normals(v, ind_vars) if name.startswith('E'): #add_constant(v, 'freq', suffix, self._global_ns['freq']) #add_constant(v, 'mu0', suffix, self._global_ns['mu0']) #add_constant(v, 'e0', suffix, self._global_ns['e0']) add_components(v, 'E', suffix, ind_vars, solr, soli) add_components(v, 'B', suffix, ind_vars, solr, soli, deriv=evalB) add_expression(v, 'normE', suffix, ind_vars, '(conj(Ex)*Ex + conj(Ey)*Ey +conj(Ez)*Ez)**(0.5)', ['E']) add_expression(v, 'normB', suffix, ind_vars, '(conj(Bx)*Bx + conj(By)*By + conj(Bz)*Bz)**(0.5)', ['B']) # Poynting Flux add_expression(v, 'Poyx', suffix, ind_vars, '(conj(Ey)*Bz - conj(Ez)*By)/mu0', ['B', 'E']) add_expression(v, 'Poyy', suffix, ind_vars, '(conj(Ez)*Bx - conj(Ex)*Bz)/mu0', ['B', 'E']) add_expression(v, 'Poyz', suffix, ind_vars, '(conj(Ex)*By - conj(Ey)*Bx)/mu0', ['B', 'E']) #e = - epsion * w^2 - i * sigma * w # Jd : displacement current = -i omega* e0 er E add_expression(v, 'Jdx', suffix, ind_vars, '(-1j*(dot(epsilonr, E))*freq*2*pi*e0)[0]', ['epsilonr', 'E']) add_expression(v, 'Jdy', suffix, ind_vars, '(-1j*(dot(epsilonr, E))*freq*2*pi*e0)[1]', ['epsilonr', 'E']) add_expression(v, 'Jdz', suffix, ind_vars, '(-1j*(dot(epsilonr, E))*freq*2*pi*e0)[2]', ['epsilonr', 'E']) # Ji : induced current = sigma *E add_expression(v, 'Jix', suffix, ind_vars, '(dot(sigma, E))[0]', ['sigma', 'E']) add_expression(v, 'Jiy', suffix, ind_vars, '(dot(sigma, E))[1]', ['sigma', 'E']) add_expression(v, 'J*z', suffix, ind_vars, '(dot(sigma, E))[2]', ['sigma', 'E']) # Jp : polarization current (Jp = -i omega* e0 (er - 1) E add_expression(v, 'Jpx', suffix, ind_vars, '(-1j*(dot(epsilonr, E) - E)*freq*2*pi*e0)[0]', ['epsilonr', 'E']) add_expression(v, 'Jpy', suffix, ind_vars, '(-1j*(dot(epsilonr, E) - E)*freq*2*pi*e0)[1]', ['epsilonr', 'E']) add_expression(v, 'Jpz', suffix, ind_vars, '(-1j*(dot(epsilonr, E) - E)*freq*2*pi*e0)[2]', ['epsilonr', 'E']) elif name.startswith('psi'): add_scalar(v, 'psi', suffix, ind_vars, solr, soli) # collect all definition from children #for mm in self.walk(): # if not mm.enabled: continue # if mm is self: continue # mm.add_domain_variables(v, name, suffix, ind_vars, # solr, soli) # mm.add_bdr_variables(v, name, suffix, ind_vars, # solr, soli) return v