Beispiel #1
0
    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)
Beispiel #2
0
 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)
Beispiel #3
0
    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
Beispiel #4
0
 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)
Beispiel #5
0
    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)
Beispiel #6
0
    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)
Beispiel #7
0
    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