예제 #1
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
        from petram.helper.variables import GFScalarVariable

        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)

        dep_vars = self.dep_vars
        sdim = self.geom_dim

        if name == dep_vars[0]:
            add_scalar(v, name, "", ind_vars, solr, soli)

        elif name == dep_vars[1]:
            for k, suffix in enumerate(ind_vars):
                nn = name + suffix
                v[nn] = GFScalarVariable(solr, soli, comp=k + 1)
        else:
            pass
        return v
예제 #2
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

        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)
        add_scalar(v, name, "", ind_vars, solr, soli)

        return v
        '''
예제 #3
0
    def make_solvars(self, solsets, g=None):
        from petram.mesh.mesh_utils import (get_extended_connectivity,
                                            get_reverse_connectivity)
        from petram.helper.variables import Variable
        from petram.helper.variables import add_scalar

        solvars = [None] * len(solsets)
        if g is None:
            g = {}
        for k, v in enumerate(solsets):
            mesh, soldict = v

            get_extended_connectivity(mesh[0])
            get_reverse_connectivity(mesh[0])

            solvar = g.copy()
            for phys in self.iter_enabled():
                phys.soldict_to_solvars(soldict, solvar)

            for var in solvar.values():
                if isinstance(var, Variable):
                    var.add_topological_info(mesh[0])

            solvars[k] = solvar

            if 'minSJac_' + str(k) in soldict:
                add_scalar(solvar, "minSJac", "", ['x', 'y', 'z'],
                           soldict['minSJac_' + str(k)][0], None)
        # print "solvars", solvars
        return solvars
예제 #4
0
def add_variable_scalar(obj, v, names, gfr, gfi):
    from petram.helper.variables import add_scalar

    for phys_name in obj.root()['Phys']:
        if not obj.root()['Phys'][phys_name].enabled:
            continue
        if obj.root()['Phys'][phys_name].emesh_idx == gfr._emesh_idx:
            ind_vars = obj.root()['Phys'][phys_name].ind_vars
            break

    ind_vars = [x.strip() for x in ind_vars.split(',') if x.strip() != '']

    add_scalar(v, names[0], "", ind_vars, gfr, gfi)
예제 #5
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
        from petram.helper.variables import GFScalarVariable

        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)

        dep_vars = self.dep_vars
        sdim = self.geom_dim
        
        isVector = False
        isNormal=False
        if self.element.startswith('RT'):
            if self.dim != sdim:
                if self.element.endswith(')'):
                    isVector = True                    
                else:
                    isNormal = True
            else:
                isVector = True                

        elif self.element.startswith('ND'):
            isVector = True

        for dep_var in dep_vars:
            if name != dep_var: continue
            if isVector:
                    add_components(v, dep_var, "", ind_vars, solr, soli)
            elif isNormal:
                add_scalar(v, dep_var+"n", "", ind_vars, solr, soli)                
            else:
                if self.vdim == 1:
                    add_scalar(v, dep_var, "", ind_vars, solr, soli)
                else:
                    names = self.dep_vars_base_txt.split(',')
                    for k, n in enumerate(names):
                        name = n + suffix
                        v[name] = GFScalarVariable(solr, soli, comp=k+1)
        return v
예제 #6
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
예제 #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)

        dep_vars = self.dep_vars
        for dep_var in dep_vars:
            if name.startswith(dep_var):
                add_scalar(v, dep_var, suffix, ind_vars, solr, soli)

        return v
예제 #8
0
    def add_variables(self, v, names, gfr, gfi):
        for phys_name in self.root()['Phys']:
            if not self.root()['Phys'][phys_name].enabled: continue
            ind_vars = self.root()['Phys'][phys_name].ind_vars

        ind_vars = [x.strip() for x in ind_vars.split(',') if x.strip() != '']

        if gfr is not None:
            fes = gfr.FESpace()
        else:
            fes = gfi.FESpace()
        mesh = fes.GetMesh()

        isVector = False
        isNormal = False
        if (self.element.startswith('RT') and mesh.Dimension() == 3):
            isVector = True
        if (self.element.startswith('RT') and mesh.Dimension() < 3):
            isNormal = True
        if self.element.startswith('ND'):
            isVector = True

        from petram.helper.variables import add_scalar
        from petram.helper.variables import add_components
        from petram.helper.variables import GFScalarVariable

        if isVector:
            add_components(v, names[0], "", ind_vars, gfr, gfi)
        elif isNormal:
            add_scalar(v, names[0] + "n", "", ind_vars, gfr, gfi)
        else:
            if self.vdim == 1:
                add_scalar(v, names[0], "", ind_vars, gfr, gfi)
            else:
                for k, n in enumerate(names):
                    v[n] = GFScalarVariable(gfr, gfi, comp=k + 1)
예제 #9
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