def _test_single_term(self, term_cls, domain, rname): from sfepy.terms import Term from sfepy.terms.terms import get_arg_kinds ok = True term_call = term_cls.name + '(%s)' arg_shapes_list = term_cls.arg_shapes if not isinstance(arg_shapes_list, list): arg_shapes_list = [arg_shapes_list] prev_shapes = {} for _arg_shapes in arg_shapes_list: # Unset shapes are taken from the previous iteration. arg_shapes = copy(prev_shapes) arg_shapes.update(_arg_shapes) prev_shapes = arg_shapes self.report('arg_shapes:', arg_shapes) arg_types = term_cls.arg_types if not isinstance(arg_types[0], tuple): arg_types = (arg_types, ) for iat, ats in enumerate(arg_types): self.report('arg_types:', ats) arg_kinds = get_arg_kinds(ats) modes = getattr(term_cls, 'modes', None) mode = modes[iat] if modes is not None else None aux = make_term_args(arg_shapes, arg_kinds, ats, mode, domain) args, str_args, materials, variables = aux self.report('args:', str_args) name = term_call % (', '.join(str_args)) term = Term.new(name, self.integral, domain.regions[rname], **args) term.setup() call_mode = 'weak' if term.names.virtual else 'eval' self.report('call mode:', call_mode) out = term.evaluate(mode=call_mode, ret_status=True) if call_mode == 'eval': vals, status = out vals = nm.array(vals) else: vals, iels, status = out vals = vals[0] _ok = nm.isfinite(vals).all() ok = ok and _ok self.report('values shape: %s' % (vals.shape, )) if not _ok: self.report('values are not finite!') self.report(vals) _ok = status == 0 if not _ok: self.report('status is %d!' % status) ok = ok and _ok if term.names.virtual: # Test differentiation w.r.t. state variables in the weak # mode. svars = term.get_state_variables(unknown_only=True) for svar in svars: vals, iels, status = term.evaluate(mode=call_mode, diff_var=svar.name, ret_status=True) vals = vals[0] _ok = status == 0 ok = ok and _ok self.report('diff: %s' % svar.name) if not _ok: self.report('status is %d!' % status) _ok = nm.isfinite(vals).all() ok = ok and _ok self.report('values shape: %s' % (vals.shape, )) if not _ok: self.report('values are not finite!') self.report(vals) return ok
def _test_single_term(self, term_cls, domain, rname): from sfepy.terms import Term from sfepy.terms.terms import get_arg_kinds ok = True term_call = term_cls.name + '(%s)' arg_shapes_list = term_cls.arg_shapes if not isinstance(arg_shapes_list, list): arg_shapes_list = [arg_shapes_list] if term_cls.integration != 'custom': integral = self.integral else: integral = self.custom_integral poly_space_base = getattr(term_cls, 'poly_space_base', 'lagrange') prev_shapes = {} for _arg_shapes in arg_shapes_list: # Unset shapes are taken from the previous iteration. arg_shapes = copy(prev_shapes) arg_shapes.update(_arg_shapes) prev_shapes = arg_shapes self.report('arg_shapes:', arg_shapes) arg_types = term_cls.arg_types if not isinstance(arg_types[0], tuple): arg_types = (arg_types,) for iat, ats in enumerate(arg_types): self.report('arg_types:', ats) arg_kinds = get_arg_kinds(ats) modes = getattr(term_cls, 'modes', None) mode = modes[iat] if modes is not None else None if 'dw_s_dot_grad_i_s' in term_cls.name: material_value = 0.0 else: material_value = 1.0 aux = make_term_args(arg_shapes, arg_kinds, ats, mode, domain, material_value=material_value, poly_space_base=poly_space_base) args, str_args, materials, variables = aux self.report('args:', str_args) name = term_call % (', '.join(str_args)) term = Term.new(name, integral, domain.regions[rname], **args) term.setup() call_mode = 'weak' if term.names.virtual else 'eval' self.report('call mode:', call_mode) out = term.evaluate(mode=call_mode, ret_status=True) if call_mode == 'eval': vals, status = out vals = nm.array(vals) else: vals, iels, status = out if isinstance(vals, tuple): # Dynamic connectivity terms. vals = vals[0] _ok = nm.isfinite(vals).all() ok = ok and _ok self.report('values shape: %s' % (vals.shape,)) if not _ok: self.report('values are not finite!') self.report(vals) _ok = status == 0 if not _ok: self.report('status is %d!' % status) ok = ok and _ok if term.names.virtual: # Test differentiation w.r.t. state variables in the weak # mode. svars = term.get_state_variables(unknown_only=True) for svar in svars: vals, iels, status = term.evaluate(mode=call_mode, diff_var=svar.name, ret_status=True) if isinstance(vals, tuple): # Dynamic connectivity terms. vals = vals[0] _ok = status == 0 ok = ok and _ok self.report('diff: %s' % svar.name) if not _ok: self.report('status is %d!' % status) _ok = nm.isfinite(vals).all() ok = ok and _ok self.report('values shape: %s' % (vals.shape,)) if not _ok: self.report('values are not finite!') self.report(vals) return ok