def setup_dof_conns(conn_info, dof_conns=None, make_virtual=False, verbose=True): """ Dof connectivity key: (field.name, var.n_components, region.name, type, ig) """ if verbose: output('setting up dof connectivities...') tt = time.clock() dof_conns = get_default(dof_conns, {}) for key, ii, info in iter_dict_of_lists(conn_info, return_keys=True): if info.primary is not None: var = info.primary field = var.get_field() field.setup_extra_data(info.ps_tg, info, info.is_trace) field.setup_dof_conns(dof_conns, var.n_components, info.dc_type, info.get_region(), info.is_trace) if info.has_virtual and not info.is_trace: # This is needed regardless make_virtual. var = info.virtual field = var.get_field() field.setup_extra_data(info.v_tg, info, False) field.setup_dof_conns(dof_conns, var.n_components, info.dc_type, info.get_region(can_trace=False)) if verbose: output('...done in %.2f s' % (time.clock() - tt)) return dof_conns
def setup_extra_data(conn_info): """ Setup extra data required for non-volume integration. """ for key, ii, info in iter_dict_of_lists(conn_info, return_keys=True): for var in info.all_vars: field = var.get_field() field.setup_extra_data(info.ps_tg, info, info.is_trace)
def get_graph_conns(self, any_dof_conn=False, rdcs=None, cdcs=None, active_only=True): """ Get DOF connectivities needed for creating tangent matrix graph. Parameters ---------- any_dof_conn : bool By default, only volume DOF connectivities are used, with the exception of trace surface DOF connectivities. If True, any kind of DOF connectivities is allowed. rdcs, cdcs : arrays, optional Additional row and column DOF connectivities, corresponding to the variables used in the equations. active_only : bool If True, the active DOF connectivities have reduced size and are created with the reduced (active DOFs only) numbering. Returns ------- rdcs, cdcs : arrays The row and column DOF connectivities defining the matrix graph blocks. """ if rdcs is None: rdcs = [] cdcs = [] elif cdcs is None: cdcs = copy(rdcs) else: assert_(len(rdcs) == len(cdcs)) if rdcs is cdcs: # Make sure the lists are not the same object. rdcs = copy(rdcs) adcs = self.variables.adof_conns # Only volume dof connectivities are used, with the exception of trace # surface dof connectivities. shared = set() for key, ii, info in iter_dict_of_lists(self.conn_info, return_keys=True): rvar, cvar = info.virtual, info.state if (rvar is None) or (cvar is None): continue is_surface = rvar.is_surface or cvar.is_surface dct = info.dc_type.type if not (dct in ('volume', 'scalar', 'plate') or is_surface or info.is_trace or any_dof_conn): continue rreg_name = info.get_region_name(can_trace=False) creg_name = info.get_region_name() rname = rvar.get_primary_name() rkey = (rname, rreg_name, dct, False) ckey = (cvar.name, creg_name, dct, info.is_trace) dc_key = (rkey, ckey) if not dc_key in shared: rdc = adcs[rkey] cdc = adcs[ckey] if not active_only: ii = nm.where(rdc < 0) rdc = rdc.copy() rdc[ii] = -1 - rdc[ii] ii = nm.where(cdc < 0) cdc = cdc.copy() cdc[ii] = -1 - cdc[ii] rdcs.append(rdc) cdcs.append(cdc) shared.add(dc_key) return rdcs, cdcs
def get_graph_conns(self, any_dof_conn=False, rdcs=None, cdcs=None): """ Get DOF connectivities needed for creating tangent matrix graph. Parameters ---------- any_dof_conn : bool By default, only volume DOF connectivities are used, with the exception of trace surface DOF connectivities. If True, any kind of DOF connectivities is allowed. rdcs, cdcs : arrays, optional Additional row and column DOF connectivities, corresponding to the variables used in the equations. Returns ------- rdcs, cdcs : arrays The row and column DOF connectivities defining the matrix graph blocks. """ if rdcs is None: rdcs = [] cdcs = [] elif cdcs is None: cdcs = copy(rdcs) else: assert_(len(rdcs) == len(cdcs)) if rdcs is cdcs: # Make sure the lists are not the same object. rdcs = copy(rdcs) adcs = self.variables.adof_conns # Only volume dof connectivities are used, with the exception of trace # surface dof connectivities. shared = set() for key, ii, info in iter_dict_of_lists(self.conn_info, return_keys=True): rvar, cvar = info.virtual, info.state if (rvar is None) or (cvar is None): continue is_surface = rvar.is_surface or cvar.is_surface dct = info.dc_type.type if not (dct in ('volume', 'scalar') or is_surface or info.is_trace or any_dof_conn): continue rreg_name = info.get_region_name(can_trace=False) creg_name = info.get_region_name() for rig, cig in info.iter_igs(): rname = rvar.get_primary_name() rkey = (rname, rreg_name, dct, rig, False) ckey = (cvar.name, creg_name, dct, cig, info.is_trace) dc_key = (rkey, ckey) ## print dc_key if not dc_key in shared: try: rdcs.append(adcs[rkey]) cdcs.append(adcs[ckey]) except: debug() shared.add(dc_key) return rdcs, cdcs
def get_graph_conns(self, any_dof_conn=False, rdcs=None, cdcs=None, active_only=True): """ Get DOF connectivities needed for creating tangent matrix graph. Parameters ---------- any_dof_conn : bool By default, only volume DOF connectivities are used, with the exception of trace surface DOF connectivities. If True, any kind of DOF connectivities is allowed. rdcs, cdcs : arrays, optional Additional row and column DOF connectivities, corresponding to the variables used in the equations. active_only : bool If True, the active DOF connectivities have reduced size and are created with the reduced (active DOFs only) numbering. Returns ------- rdcs, cdcs : arrays The row and column DOF connectivities defining the matrix graph blocks. """ if rdcs is None: rdcs = [] cdcs = [] elif cdcs is None: cdcs = copy(rdcs) else: assert_(len(rdcs) == len(cdcs)) if rdcs is cdcs: # Make sure the lists are not the same object. rdcs = copy(rdcs) adcs = self.variables.adof_conns # Only volume dof connectivities are used, with the exception of trace # surface dof connectivities. shared = set() for key, ii, info in iter_dict_of_lists(self.conn_info, return_keys=True): rvar, cvar = info.virtual, info.state if (rvar is None) or (cvar is None): continue is_surface = rvar.is_surface or cvar.is_surface dct = info.dc_type.type if not (dct in ('volume', 'scalar', 'custom') or is_surface or info.is_trace or any_dof_conn): continue rreg_name = info.get_region_name(can_trace=False) creg_name = info.get_region_name() rname = rvar.get_primary_name() rkey = (rname, rreg_name, dct, False) ckey = (cvar.name, creg_name, dct, info.is_trace) dc_key = (rkey, ckey) if not dc_key in shared: rdc = adcs[rkey] cdc = adcs[ckey] if not active_only: ii = nm.where(rdc < 0) rdc = rdc.copy() rdc[ii] = -1 - rdc[ii] ii = nm.where(cdc < 0) cdc = cdc.copy() cdc[ii] = -1 - cdc[ii] rdcs.append(rdc) cdcs.append(cdc) shared.add(dc_key) return rdcs, cdcs