How to specify material constants for regions of type facet

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)

Hi Geoff,
could you check, if the problem was caused by the commit [1]?
The problem is, that the material definition uses the ConstantFunctionByRegion class, that seems to require cell regions now. Defining the material by a function should work without problems, but I guess this is more convenient :).
Then could you try [2]?
r.
[1] a5c1ca55c8fc4b063d44299974f025f905047488 [2] https://github.com/rc/sfepy/commit/8ac7a7924277ef660df92f5f221dc678e4a14d9c
On 11/10/2015 12:42 AM, Geoff Wright wrote:
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)

Hi Robert,
It was a little hard to test these commits specifically because there were errors about igs not existing for many of the commits on this branch. But I did narrow it down to the 'no-ig' branch which was merged on 2015-04-07 in a792ae4db5867f5db669c17157e9ba7f24d5b766
Prior to the 'no-ig' branch, revision 2e9eb78341f9072ad07424221a64306c95c5ebd1 is working fine.
Is this a capability you can restore or should I start defining materials with functions?
Thanks, Geoff
On Tue, Nov 10, 2015 at 6:21 AM Robert Cimrman <cimr...@ntc.zcu.cz> wrote:
Hi Geoff,
could you check, if the problem was caused by the commit [1]?
The problem is, that the material definition uses the ConstantFunctionByRegion class, that seems to require cell regions now. Defining the material by a function should work without problems, but I guess this is more convenient :).
Then could you try [2]?
r.
[1] a5c1ca55c8fc4b063d44299974f025f905047488 [2] https://github.com/rc/sfepy/commit/8ac7a7924277ef660df92f5f221dc678e4a14d9c
On 11/10/2015 12:42 AM, Geoff Wright wrote:
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)
-- You received this message because you are subscribed to a topic in the Google Groups "sfepy-devel" group. To unsubscribe from this topic, visit https://groups.google.com/d/topic/sfepy-devel/BjAN0HrJkWU/unsubscribe. To unsubscribe from this group and all its topics, send an email to sfepy-devel...@googlegroups.com. To post to this group, send email to sfepy...@googlegroups.com. Visit this group at http://groups.google.com/group/sfepy-devel.
participants (2)
-
Geoff Wright
-
Robert Cimrman