[12854] | 1 | import os
|
---|
| 2 | import numpy
|
---|
| 3 |
|
---|
[12191] | 4 | def SetIceShelfBC(md,icefrontfile=''):
|
---|
[12854] | 5 | """
|
---|
| 6 | SETICESHELFBC - Create the boundary conditions for diagnostic and thermal models for a Ice Shelf with Ice Front
|
---|
[12944] | 7 |
|
---|
| 8 | Neumann BC are used on the ice front (an ANRGUS contour around the ice front
|
---|
| 9 | must be given in input)
|
---|
| 10 | Dirichlet BC are used elsewhere for diagnostic
|
---|
| 11 |
|
---|
| 12 | Usage:
|
---|
| 13 | md=SetIceShelfBC(md,varargin)
|
---|
| 14 |
|
---|
| 15 | Example:
|
---|
| 16 | md=SetIceShelfBC(md);
|
---|
| 17 | md=SetIceShelfBC(md,'Front.exp');
|
---|
| 18 |
|
---|
| 19 | See also: SETICESHEETBC, SETMARINEICESHEETBC
|
---|
[12854] | 20 | """
|
---|
[12127] | 21 |
|
---|
| 22 | #node on Dirichlet (boundary and ~icefront)
|
---|
[12854] | 23 | if icefrontfile:
|
---|
| 24 | if not os.path.exists(icefrontfile):
|
---|
| 25 | raise IOError("SetIceShelfBC error message: ice front file '%s' not found." % icefrontfile)
|
---|
| 26 | nodeinsideicefront=ContourToMesh(md.mesh.elements,md.mesh.x,md.mesh.y,icefrontfile,'node',2)
|
---|
| 27 | nodeonicefront=double(md.mesh.vertexonboundary and nodeinsideicefront)
|
---|
[12127] | 28 | else:
|
---|
[12854] | 29 | nodeonicefront=numpy.zeros(md.mesh.numberofvertices)
|
---|
[12127] | 30 |
|
---|
[12854] | 31 | # pos=find(md.mesh.vertexonboundary & ~nodeonicefront);
|
---|
| 32 | pos=[i for i,(vob,noif) in enumerate(zip(md.mesh.vertexonboundary,nodeonicefront)) if vob and not noif]
|
---|
| 33 | md.diagnostic.spcvx=float('NaN')*numpy.ones(md.mesh.numberofvertices)
|
---|
| 34 | md.diagnostic.spcvy=float('NaN')*numpy.ones(md.mesh.numberofvertices)
|
---|
| 35 | md.diagnostic.spcvz=float('NaN')*numpy.ones(md.mesh.numberofvertices)
|
---|
| 36 | md.diagnostic.spcvx[pos]=0
|
---|
| 37 | md.diagnostic.spcvy[pos]=0
|
---|
| 38 | md.diagnostic.spcvz[pos]=0
|
---|
| 39 | md.diagnostic.referential=float('NaN')*numpy.ones((md.mesh.numberofvertices,6))
|
---|
| 40 |
|
---|
[12127] | 41 | #Dirichlet Values
|
---|
[12854] | 42 | if numpy.size(md.inversion.vx_obs)==md.mesh.numberofvertices and numpy.size(md.inversion.vy_obs)==md.mesh.numberofvertices:
|
---|
| 43 | print ' boundary conditions for diagnostic model: spc set as observed velocities'
|
---|
| 44 | md.diagnostic.spcvx[pos]=md.inversion.vx_obs[pos]
|
---|
| 45 | md.diagnostic.spcvy[pos]=md.inversion.vy_obs[pos]
|
---|
[12191] | 46 | else:
|
---|
| 47 | print ' boundary conditions for diagnostic model: spc set as zero'
|
---|
[12127] | 48 |
|
---|
| 49 | #segment on Ice Front
|
---|
| 50 | #segment on Neumann (Ice Front)
|
---|
[12854] | 51 | # pos=find(nodeonicefront(md.mesh.segments(:,1)) | nodeonicefront(md.mesh.segments(:,2)));
|
---|
| 52 | pos=[i for i,(noif1,noif2) in enumerate(zip(nodeonicefront[md.mesh.segments[:,0].astype('int')-1],nodeonicefront[md.mesh.segments[:,1].astype('int')-1])) if noif1 or noif2]
|
---|
| 53 | if md.mesh.dimension==2:
|
---|
| 54 | pressureload=md.mesh.segments[pos,:]
|
---|
[12191] | 55 | elif md.mesh.dimension==3:
|
---|
[12854] | 56 | # pressureload_layer1=[md.mesh.segments(pos,1:2) md.mesh.segments(pos,2)+md.mesh.numberofvertices2d md.mesh.segments(pos,1)+md.mesh.numberofvertices2d md.mesh.segments(pos,3)];
|
---|
| 57 | pressureload_layer1=numpy.concatenate((md.mesh.segments[pos,0:2],md.mesh.segments[pos,1]+md.mesh.numberofvertices2d,md.mesh.segments[pos,0]+md.mesh.numberofvertices2d,md.mesh.segments[pos,2]),axis=1)
|
---|
| 58 | pressureload=numpy.zeros((0,5))
|
---|
| 59 | for i in xrange(1,md.mesh.numberoflayers):
|
---|
| 60 | # pressureload=[pressureload ;pressureload_layer1(:,1:4)+(i-1)*md.mesh.numberofvertices2d pressureload_layer1(:,5)+(i-1)*md.mesh.numberofelements2d ];
|
---|
| 61 | pressureload=numpy.concatenate((pressureload,numpy.concatenate((pressureload_layer1[:,0:3]+(i-1)*md.mesh.numberofvertices2d,pressureload_layer1[:,4]+(i-1)*md.mesh.numberofelements2d),axis=1)),axis=0)
|
---|
[12127] | 62 |
|
---|
| 63 | #Add water or air enum depending on the element
|
---|
[12854] | 64 | # pressureload=[pressureload 1*md.mask.elementonfloatingice(pressureload(:,end))];
|
---|
| 65 | pressureload=numpy.concatenate((pressureload,1*md.mask.elementonfloatingice[pressureload[:,-1].astype('int')-1].reshape((-1,1))),axis=1)
|
---|
[12127] | 66 |
|
---|
| 67 | #plug onto model
|
---|
[12854] | 68 | md.diagnostic.icefront=pressureload
|
---|
[12127] | 69 |
|
---|
| 70 | #Create zeros basalforcings and surfaceforcings
|
---|
[12854] | 71 | if numpy.isnan(md.surfaceforcings.precipitation).all():
|
---|
| 72 | md.surfaceforcings.precipitation=numpy.zeros(md.mesh.numberofvertices)
|
---|
[12191] | 73 | print ' no surfaceforcings.precipitation specified: values set as zero'
|
---|
[12854] | 74 | if numpy.isnan(md.surfaceforcings.mass_balance).all():
|
---|
| 75 | md.surfaceforcings.mass_balance=numpy.zeros(md.mesh.numberofvertices)
|
---|
[12191] | 76 | print ' no surfaceforcings.mass_balance specified: values set as zero'
|
---|
[12854] | 77 | if numpy.isnan(md.basalforcings.melting_rate).all():
|
---|
| 78 | md.basalforcings.melting_rate=numpy.zeros(md.mesh.numberofvertices)
|
---|
[12191] | 79 | print ' no basalforcings.melting_rate specified: values set as zero'
|
---|
[12854] | 80 | if numpy.isnan(md.balancethickness.thickening_rate).all():
|
---|
| 81 | md.balancethickness.thickening_rate=numpy.zeros(md.mesh.numberofvertices)
|
---|
[12191] | 82 | print ' no balancethickness.thickening_rate specified: values set as zero'
|
---|
[12127] | 83 |
|
---|
[12854] | 84 | md.prognostic.spcthickness=float('NaN')*numpy.ones(md.mesh.numberofvertices)
|
---|
| 85 | md.balancethickness.spcthickness=float('NaN')*numpy.ones(md.mesh.numberofvertices)
|
---|
[12127] | 86 |
|
---|
[12854] | 87 | if numpy.size(md.initialization.temperature)==md.mesh.numberofvertices:
|
---|
| 88 | md.thermal.spctemperature=float('NaN')*numpy.ones(md.mesh.numberofvertices)
|
---|
| 89 | # pos=find(md.mesh.vertexonsurface); md.thermal.spctemperature(pos)=md.initialization.temperature(pos); %impose observed temperature on surface
|
---|
| 90 | pos=[i for i,vos in enumerate(md.mesh.vertexonsurface) if vos]
|
---|
| 91 | md.thermal.spctemperature[pos]=md.initialization.temperature[pos] # impose observed temperature on surface
|
---|
| 92 | if not numpy.size(md.basalforcings.geothermalflux)==md.mesh.numberofvertices:
|
---|
| 93 | md.basalforcings.geothermalflux=numpy.zeros(md.mesh.numberofvertices)
|
---|
[12191] | 94 | else:
|
---|
| 95 | print ' no thermal boundary conditions created: no observed temperature found'
|
---|
| 96 |
|
---|
| 97 | return md
|
---|
[12854] | 98 |
|
---|