I just updated sfepy to the latest master (previous version was about 1 year old) and I'm having trouble evaluating an FEM model that was working with the old version.  The full script is pretty long so I will try to summarize here.  It seems that a region of facet type is no longer able to evaluate it's material properties where the material properties were defined on other related regions of cell type.

Robert, do you know off hand of any changes to Region or Material that may have broken this?  Otherwise, I can try to reproduce it in a simpler use case, for debugging.. anyway here is a description of whats happening:

A material is defined as follows:

self.matP = Material('elecProps', kind='stationary', values={'sigma' : {
        'BloodPool' : sigma_blood,
        'Tissue' : sigma_tissue}})

One of the terms is as follows:

probeFlux = Term.new('dw_surface_integrate(elecProps.sigma, s)', self.integral, self.probeSurf, elecProps=self.matP, s=self.s)

where self.probeSurf is defined as follows (it contains no cells, only facets):

self.probeSurf = self.domain.create_region('ProbeSurf', 'r.Probe *f r.Tissue', kind='facet', parent='Tissue')


When I run the full script I get the following backtrace:



/usr/local/lib/python2.7/dist-packages/sfepy/discrete/problem.pyc in solve(self, state0, nls_status, ls_conf, nls_conf, force_values, var_data)
   1012         self.equations.set_data(var_data, ignore_unknown=True)
   1013 
-> 1014         self.update_materials()
   1015         state0.apply_ebc(force_values=force_values)
   1016 

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/problem.pyc in update_materials(self, ts, mode, verbose)
    528             self.update_time_stepper(ts)
    529             self.equations.time_update_materials(self.ts, mode=mode,
--> 530                                                  problem=self, verbose=verbose)
    531 
    532 

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/equations.pyc in time_update_materials(self, ts, mode, problem, verbose)
    318         """
    319         self.materials.time_update(ts, self, mode=mode, problem=problem,
--> 320                                    verbose=verbose)
    321 
    322     def setup_initial_conditions(self, ics, functions=None):

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/materials.pyc in time_update(self, ts, equations, mode, problem, verbose)
     55         for mat in self:
     56             if verbose: output(' ', mat.name)
---> 57             mat.time_update(ts, equations, mode=mode, problem=problem)
     58         if verbose: output('...done in %.2f s' % (time.clock() - tt))
     59 

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/materials.pyc in time_update(self, ts, equations, mode, problem)
    304 
    305         for key, term in self.iter_terms(equations):
--> 306             self.update_data(key, ts, equations, term, problem=problem)
    307 
    308         self.update_special_data(ts, equations, problem=problem)

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/materials.pyc in update_data(self, key, ts, equations, term, problem)
    220         data = self.function(ts, coors, mode='qp',
    221                              equations=equations, term=term, problem=problem,
--> 222                              **self.extra_args)
    223 
    224         self.set_data(key, qps, data)

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/functions.pyc in __call__(self, *args, **kwargs)
     32         _kwargs = dict(kwargs)
     33         _kwargs.update(self.extra_args)
---> 34         return self.function(*args, **_kwargs)
     35 
     36     def set_function(self, function, is_constant=False):

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/functions.pyc in get_constants(ts, coors, mode, term, problem, **kwargs)
    112                         region = problem.domain.regions[rkey]
    113                         rval = nm.array(rval, dtype=nm.float64, ndmin=3)
--> 114                         ii = term.region.get_cell_indices(region.cells)
    115                         matdata[ii] = rval
    116 

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/common/region.pyc in get_cell_indices(self, cells, true_cells_only)
    600         to facets are returned if the region itself contains no cells.
    601         """
--> 602         fcells = self.get_cells(true_cells_only=true_cells_only)
    603 
    604         ii = nm.searchsorted(fcells, cells)

/usr/local/lib/python2.7/dist-packages/sfepy/discrete/common/region.pyc in get_cells(self, true_cells_only)
    579                 msg = 'region %s has not true cells! (has kind: %s)' \
    580                       % (self.name, self.kind)
--> 581                 raise ValueError(msg)
    582 
    583             else:

ValueError: region ProbeSurf has not true cells! (has kind: facet)