import numpy as npy

def damagefrominversion(md):
	'''
	compute ice shelf damage from inversion results

	This routine computes damage based on the analytical formalism of Borstad et
	al. (2013, The Cryosphere).  The model must contain inversion results for
	ice rigidity.  Ice rigidity B is assumed to be parameterized by the ice
	temperature in md.materials.rheology_B. 
	
	Usage:
		damage=damagefrominversion(md)
	
	Example:
		damage=damagefrominversion(md)
	'''

	# check inputs
	if not hasattr(md.results,'strainrate'):
		raise StandardError('md.results.strainrate is not present.  Calculate using md=mechanicalproperties(md,vx,vy)')
	if not '2d' in md.mesh.__doc__:
		raise StandardError('only 2d (planview) model supported currently')
	if any(md.flowequation.element_equation!=2):
		raise StandardError('Warning: the model has some non-SSA elements.  These will be treated like SSA elements')
	if npy.ndim(md.results.StressbalanceSolution.MaterialsRheologyBbar)==2:
		Bi=md.results.StressbalanceSolution.MaterialsRheologyBbar.reshape(-1,)
	else:
		Bi=md.results.StressbalanceSolution.MaterialsRheologyBbar
	if npy.ndim(md.materials.rheology_B)==2:
		BT=md.materials.rheology_B.reshape(-1,)
	else:
		BT=md.materials.rheology_B

	damage=npy.zeros_like(Bi)

	# Damage where Bi softer than B(T)
	pos=npy.nonzero(Bi<BT)[0]
	damage[pos]=1.-Bi[pos]/BT[pos]
	
	pos=npy.nonzero(damage<0)
	damage[pos]=0

	return damage
