def __call__(self, problem=None, data=None): from sfepy.base.base import select_by_names from sfepy.discrete.variables import Variables from sfepy.discrete.state import State from sfepy.discrete.conditions import Conditions problem = get_default(problem, self.problem) conf_ebc = select_by_names(problem.conf.ebcs, self.ebcs) conf_epbc = select_by_names(problem.conf.epbcs, self.epbcs) ebcs = Conditions.from_conf(conf_ebc, problem.domain.regions) epbcs = Conditions.from_conf(conf_epbc, problem.domain.regions) conf_variables = select_by_names(problem.conf.variables, self.variable) problem.set_variables(conf_variables) variables = Variables.from_conf(conf_variables, problem.fields) variables.equation_mapping(ebcs, epbcs, problem.ts, problem.functions) state = State(variables) state.fill(0.0) state.apply_ebc() corr_sol = CorrSolution(name=self.name, state=state.get_parts()) self.save(corr_sol, problem, variables) return corr_sol
def save_ebc(self, filename, force=True, default=0.0): """ Save essential boundary conditions as state variables. """ output("saving ebc...") variables = self.get_variables(auto_create=True) ebcs = Conditions.from_conf(self.conf.ebcs, self.domain.regions) epbcs = Conditions.from_conf(self.conf.epbcs, self.domain.regions) try: variables.equation_mapping(ebcs, epbcs, self.ts, self.functions, problem=self) except: output("cannot make equation mapping!") raise state = State(variables) state.fill(default) if force: vals = dict_from_keys_init(variables.state) for ii, key in enumerate(vals.iterkeys()): vals[key] = ii + 1 state.apply_ebc(force_values=vals) else: state.apply_ebc() out = state.create_output_dict(extend=True) self.save_state(filename, out=out, fill_value=default) output("...done")
def save_ebc(self, filename, force=True, default=0.0): """ Save essential boundary conditions as state variables. """ output('saving ebc...') variables = self.get_variables(auto_create=True) ebcs = Conditions.from_conf(self.conf.ebcs, self.domain.regions) epbcs = Conditions.from_conf(self.conf.epbcs, self.domain.regions) try: variables.equation_mapping(ebcs, epbcs, self.ts, self.functions, problem=self) except: output('cannot make equation mapping!') raise state = State(variables) state.fill(default) if force: vals = dict_from_keys_init(variables.state) for ii, key in enumerate(vals.iterkeys()): vals[key] = ii + 1 state.apply_ebc(force_values=vals) else: state.apply_ebc() out = state.create_output_dict(extend=True) self.save_state(filename, out=out, fill_value=default) output('...done')
def save_ebc(self, filename, ebcs=None, epbcs=None, force=True, default=0.0): """ Save essential boundary conditions as state variables. Parameters ---------- filename : str The output file name. ebcs : Conditions instance, optional The essential (Dirichlet) boundary conditions. If not given, `self.conf.ebcs` are used. epbcs : Conditions instance, optional The periodic boundary conditions. If not given, `self.conf.epbcs` are used. force : bool If True, sequential nonzero values are forced to individual `ebcs` so that the conditions are visible even when zero. default : float The default constant value of state vector. """ output('saving ebc...') variables = self.get_variables(auto_create=True) if ebcs is None: ebcs = Conditions.from_conf(self.conf.ebcs, self.domain.regions) if epbcs is None: epbcs = Conditions.from_conf(self.conf.epbcs, self.domain.regions) try: variables.equation_mapping(ebcs, epbcs, self.ts, self.functions, problem=self) except: output('cannot make equation mapping!') raise state = State(variables) state.fill(default) if force: vals = dict_from_keys_init(variables.state) for ii, key in enumerate(vals.iterkeys()): vals[key] = ii + 1 state.apply_ebc(force_values=vals) else: state.apply_ebc() out = state.create_output_dict(extend=True) self.save_state(filename, out=out, fill_value=default) output('...done')
def __init__(self, conf, problem, **kwargs): from sfepy.discrete.state import State ScipyDirect.__init__(self, conf, **kwargs) equations = problem.equations aux_state = State(equations.variables) conf.idxs = {} for bk, bv in conf.blocks.iteritems(): aux_state.fill(0.0) for jj in bv: idx = equations.variables.di.indx[jj] aux_state.vec[idx] = nm.nan aux_state.apply_ebc() vec0 = aux_state.get_reduced() conf.idxs[bk] = nm.where(nm.isnan(vec0))[0]
def __init__(self, conf, **kwargs): from sfepy.discrete.state import State ScipyDirect.__init__(self, conf, **kwargs) equations = self.problem.equations aux_state = State(equations.variables) conf.idxs = {} for bk, bv in conf.blocks.iteritems(): aux_state.fill(0.0) for jj in bv: idx = equations.variables.di.indx[jj] aux_state.vec[idx] = nm.nan aux_state.apply_ebc() vec0 = aux_state.get_reduced() conf.idxs[bk] = nm.where(nm.isnan(vec0))[0]
def __call__(self, rhs, x0=None, conf=None, eps_a=None, eps_r=None, i_max=None, mtx=None, status=None, **kwargs): from sfepy.discrete.state import State equations = self.context.equations aux_state = State(equations.variables) mtxi = {} for bk, bv in six.iteritems(conf.blocks): aux_state.fill(0.0) for jj in bv: idx = equations.variables.di.indx[jj] aux_state.vec[idx] = nm.nan aux_state.apply_ebc() vec0 = aux_state.get_reduced() mtxi[bk] = nm.where(nm.isnan(vec0))[0] mtxslc_s = {} mtxslc_f = {} nn = {} for ik, iv in six.iteritems(mtxi): ptr = 0 nn[ik] = len(iv) mtxslc_s[ik] = [] mtxslc_f[ik] = [] while ptr < nn[ik]: idx0 = iv[ptr:] idxrange = nm.arange(idx0[0], idx0[0] + len(idx0)) aux = nm.where(idx0 == idxrange)[0] mtxslc_s[ik].append(slice(ptr + aux[0], ptr + aux[-1] + 1)) mtxslc_f[ik].append(slice(idx0[aux][0], idx0[aux][-1] + 1)) ptr += aux[-1] + 1 mtxs = {} rhss = {} ress = {} get_sub = mtx._get_submatrix for ir in six.iterkeys(mtxi): rhss[ir] = nm.zeros((nn[ir], ), dtype=nm.float64) ress[ir] = nm.zeros((nn[ir], ), dtype=nm.float64) for jr, idxr in enumerate(mtxslc_f[ir]): rhss[ir][mtxslc_s[ir][jr]] = rhs[idxr] for ic in six.iterkeys(mtxi): mtxid = '%s%s' % (ir, ic) mtxs[mtxid] = nm.zeros((nn[ir], nn[ic]), dtype=nm.float64) for jr, idxr in enumerate(mtxslc_f[ir]): for jc, idxc in enumerate(mtxslc_f[ic]): iir = mtxslc_s[ir][jr] iic = mtxslc_s[ic][jc] mtxs[mtxid][iir, iic] = get_sub(idxr, idxc).todense() self.orig_conf.function(ress, mtxs, rhss, nn) res = nm.zeros_like(rhs) for ir in six.iterkeys(mtxi): for jr, idxr in enumerate(mtxslc_f[ir]): res[idxr] = ress[ir][mtxslc_s[ir][jr]] return res
def __call__(self, rhs, x0=None, conf=None, eps_a=None, eps_r=None, i_max=None, mtx=None, status=None, **kwargs): from sfepy.discrete.state import State equations = self.context.equations aux_state = State(equations.variables) mtxi = {} for bk, bv in six.iteritems(conf.blocks): aux_state.fill(0.0) for jj in bv: idx = equations.variables.di.indx[jj] aux_state.vec[idx] = nm.nan aux_state.apply_ebc() vec0 = aux_state.get_reduced() mtxi[bk] = nm.where(nm.isnan(vec0))[0] mtxslc_s = {} mtxslc_f = {} nn = {} for ik, iv in six.iteritems(mtxi): ptr = 0 nn[ik] = len(iv) mtxslc_s[ik] = [] mtxslc_f[ik] = [] while ptr < nn[ik]: idx0 = iv[ptr:] idxrange = nm.arange(idx0[0], idx0[0] + len(idx0)) aux = nm.where(idx0 == idxrange)[0] mtxslc_s[ik].append(slice(ptr + aux[0], ptr + aux[-1] + 1)) mtxslc_f[ik].append(slice(idx0[aux][0], idx0[aux][-1] + 1)) ptr += aux[-1] + 1 mtxs = {} rhss = {} ress = {} get_sub = mtx._get_submatrix for ir in six.iterkeys(mtxi): rhss[ir] = nm.zeros((nn[ir],), dtype=nm.float64) ress[ir] = nm.zeros((nn[ir],), dtype=nm.float64) for jr, idxr in enumerate(mtxslc_f[ir]): rhss[ir][mtxslc_s[ir][jr]] = rhs[idxr] for ic in six.iterkeys(mtxi): mtxid = '%s%s' % (ir, ic) mtxs[mtxid] = nm.zeros((nn[ir], nn[ic]), dtype=nm.float64) for jr, idxr in enumerate(mtxslc_f[ir]): for jc, idxc in enumerate(mtxslc_f[ic]): iir = mtxslc_s[ir][jr] iic = mtxslc_s[ic][jc] mtxs[mtxid][iir, iic] = get_sub(idxr, idxc).todense() self.orig_conf.function(ress, mtxs, rhss, nn) res = nm.zeros_like(rhs) for ir in six.iterkeys(mtxi): for jr, idxr in enumerate(mtxslc_f[ir]): res[idxr] = ress[ir][mtxslc_s[ir][jr]] return res