import os
import numpy as np
from ContourToMesh import ContourToMesh
[docs]def SetIceSheetBC(md):
"""
SETICESHEETBC - Create the boundary conditions for stressbalance and thermal models for an IceSheet with no Ice Front
Usage:
md=SetIceSheetBC(md)
See also: SETICESHELFBC, SETMARINEICESHEETBC
"""
#node on Dirichlet
pos=np.nonzero(md.mesh.vertexonboundary)
md.stressbalance.spcvx=float('nan')*np.ones(md.mesh.numberofvertices)
md.stressbalance.spcvy=float('nan')*np.ones(md.mesh.numberofvertices)
md.stressbalance.spcvz=float('nan')*np.ones(md.mesh.numberofvertices)
md.stressbalance.spcvx[pos]=0
md.stressbalance.spcvy[pos]=0
md.stressbalance.spcvz[pos]=0
md.stressbalance.referential=float('nan')*np.ones((md.mesh.numberofvertices,6))
md.stressbalance.loadingforce=0*np.ones((md.mesh.numberofvertices,3))
#Dirichlet Values
if isinstance(md.inversion.vx_obs,np.ndarray) and np.size(md.inversion.vx_obs,axis=0)==md.mesh.numberofvertices and isinstance(md.inversion.vy_obs,np.ndarray) and np.size(md.inversion.vy_obs,axis=0)==md.mesh.numberofvertices:
print " boundary conditions for stressbalance model: spc set as observed velocities"
md.stressbalance.spcvx[pos]=md.inversion.vx_obs[pos]
md.stressbalance.spcvy[pos]=md.inversion.vy_obs[pos]
else:
print " boundary conditions for stressbalance model: spc set as zero"
#No ice front -> do nothing
#Create zeros basalforcings and smb
md.smb.initialize(md)
md.basalforcings.initialize(md)
#Deal with other boundary conditions
if np.all(np.isnan(md.balancethickness.thickening_rate)):
md.balancethickness.thickening_rate=np.zeros((md.mesh.numberofvertices))
print " no balancethickness.thickening_rate specified: values set as zero"
md.masstransport.spcthickness=float('nan')*np.ones((md.mesh.numberofvertices))
md.balancethickness.spcthickness=float('nan')*np.ones((md.mesh.numberofvertices))
md.damage.spcdamage=float('nan')*np.ones((md.mesh.numberofvertices))
if isinstance(md.initialization.temperature,np.ndarray) and np.size(md.initialization.temperature,axis=0)==md.mesh.numberofvertices:
md.thermal.spctemperature=float('nan')*np.ones((md.mesh.numberofvertices))
if hasattr(md.mesh,'vertexonsurface'):
pos=np.nonzero(md.mesh.vertexonsurface)[0]
md.thermal.spctemperature[pos]=md.initialization.temperature[pos] #impose observed temperature on surface
if not isinstance(md.basalforcings.geothermalflux,np.ndarray) or not np.size(md.basalforcings.geothermalflux)==md.mesh.numberofvertices:
md.basalforcings.geothermalflux=50.*10**-3*np.ones((md.mesh.numberofvertices)) #50 mW/m^2
else:
print " no thermal boundary conditions created: no observed temperature found"
return md