Changeset 13150


Ignore:
Timestamp:
08/23/12 15:49:08 (13 years ago)
Author:
jschierm
Message:

NEW: Python versions of model.extrude and project3d (and corresponding Matlab changes).

Location:
issm/trunk-jpl/src/m
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/model/model.m

    r13131 r13150  
    543543                         %Extrude the mesh
    544544                         if nargin==2, %list of coefficients
    545                                  list=varargin{1};
    546                                  if any(list<0) | any(list>1),
     545                                 clist=varargin{1};
     546                                 if any(clist<0) | any(clist>1),
    547547                                         error('extrusioncoefficients must be between 0 and 1');
    548548                                 end
    549                                  extrusionlist=sort(unique([list(:);0;1]));
     549                                 extrusionlist=sort(unique([clist(:);0;1]));
    550550                                 numlayers=length(extrusionlist);
    551551                         elseif nargin==3, %one polynomial law
  • issm/trunk-jpl/src/m/classes/model/model.py

    r13139 r13150  
    11#module imports {{{
     2import numpy
    23from mesh import mesh
    34from mask import mask
     
    3738from mumpsoptions import *
    3839from iluasmoptions import *
     40from project3d import *
    3941#}}}
    4042
     
    167169        # }}}
    168170
     171        def extrude(md,*args):    # {{{
     172                """
     173                EXTRUDE - vertically extrude a 2d mesh
     174
     175                   vertically extrude a 2d mesh and create corresponding 3d mesh.
     176                   The vertical distribution can:
     177                    - follow a polynomial law
     178                    - follow two polynomial laws, one for the lower part and one for the upper part of the mesh
     179                    - be discribed by a list of coefficients (between 0 and 1)
     180 
     181
     182                   Usage:
     183                      md=extrude(md,numlayers,extrusionexponent);
     184                      md=extrude(md,numlayers,lowerexponent,upperexponent);
     185                      md=extrude(md,listofcoefficients);
     186
     187                   Example:
     188                      md=extrude(md,8,3);
     189                      md=extrude(md,8,3,2);
     190                      md=extrude(md,[0 0.2 0.5 0.7 0.9 0.95 1]);
     191
     192                   See also: MODELEXTRACT, COLLAPSE
     193                """
     194
     195                #some checks on list of arguments
     196                if len(args)>3 or len(args)<1:
     197                        raise RuntimeError("extrude error message")
     198
     199                #Extrude the mesh
     200                if   len(args)==1:    #list of coefficients
     201                        clist=args[0]
     202                        if any(clist<0) or any(clist>1):
     203                                raise TypeError("extrusioncoefficients must be between 0 and 1")
     204                        clist.extend([0.,1.])
     205                        clist.sort()
     206                        extrusionlist=list(set(clist))
     207                        numlayers=len(extrusionlist)
     208
     209                elif len(args)==2:    #one polynomial law
     210                        if args[1]<=0:
     211                                raise TypeError("extrusionexponent must be >=0")
     212                        numlayers=args[0]
     213                        extrusionlist=(numpy.arange(0.,float(numlayers-1)+1.,1.)/float(numlayers-1))**args[1]
     214
     215                elif len(args)==3:    #two polynomial laws
     216                        numlayers=args[0]
     217                        lowerexp=args[1]
     218                        upperexp=args[2]
     219
     220                        if args[1]<=0 or args[2]<=0:
     221                                raise TypeError("lower and upper extrusionexponents must be >=0")
     222
     223                        lowerextrusionlist=(numpy.arange(0.,1.+2./float(numlayers-1),2./float(numlayers-1)))**lowerexp/2.
     224                        upperextrusionlist=(numpy.arange(0.,1.+2./float(numlayers-1),2./float(numlayers-1)))**upperexp/2.
     225                        extrusionlist=numpy.unique(numpy.concatenate((lowerextrusionlist,1.-upperextrusionlist)))
     226
     227                if numlayers<2:
     228                        raise TypeError("number of layers should be at least 2")
     229                if md.mesh.dimension==3:
     230                        raise TypeError("Cannot extrude a 3d mesh (extrude cannot be called more than once)")
     231
     232                #Initialize with the 2d mesh
     233                x3d=numpy.empty((0))
     234                y3d=numpy.empty((0))
     235                z3d=numpy.empty((0))    #the lower node is on the bed
     236                thickness3d=md.geometry.thickness    #thickness and bed for these nodes
     237                bed3d=md.geometry.bed
     238
     239                #Create the new layers
     240                for i in xrange(numlayers):
     241                        x3d=numpy.concatenate((x3d,md.mesh.x))
     242                        y3d=numpy.concatenate((y3d,md.mesh.y))
     243                        #nodes are distributed between bed and surface accordingly to the given exponent
     244                        z3d=numpy.concatenate((z3d,bed3d+thickness3d*extrusionlist[i]))
     245                number_nodes3d=numpy.size(x3d)    #number of 3d nodes for the non extruded part of the mesh
     246
     247                #Extrude elements
     248                elements3d=numpy.empty((0,6))
     249                for i in xrange(numlayers-1):
     250                        elements3d=numpy.vstack((elements3d,numpy.hstack((md.mesh.elements+i*md.mesh.numberofvertices,md.mesh.elements+(i+1)*md.mesh.numberofvertices))))    #Create the elements of the 3d mesh for the non extruded part
     251                number_el3d=numpy.size(elements3d,axis=0)    #number of 3d nodes for the non extruded part of the mesh
     252
     253                #Keep a trace of lower and upper nodes
     254                mesh.lowervertex=float('NaN')*numpy.ones(number_nodes3d)
     255                mesh.uppervertex=float('NaN')*numpy.ones(number_nodes3d)
     256                mesh.lowervertex[md.mesh.numberofvertices:]=numpy.arange(1,(numlayers-1)*md.mesh.numberofvertices+1)
     257                mesh.uppervertex[:(numlayers-1)*md.mesh.numberofvertices]=numpy.arange(md.mesh.numberofvertices+1,number_nodes3d+1)
     258                md.mesh.lowervertex=mesh.lowervertex
     259                md.mesh.uppervertex=mesh.uppervertex
     260
     261                #same for lower and upper elements
     262                mesh.lowerelements=float('NaN')*numpy.ones(number_el3d)
     263                mesh.upperelements=float('NaN')*numpy.ones(number_el3d)
     264                mesh.lowerelements[md.mesh.numberofelements:]=numpy.arange(1,(numlayers-2)*md.mesh.numberofelements+1)
     265                mesh.upperelements[:(numlayers-2)*md.mesh.numberofelements]=numpy.arange(md.mesh.numberofelements+1,(numlayers-1)*md.mesh.numberofelements+1)
     266                md.mesh.lowerelements=mesh.lowerelements
     267                md.mesh.upperelements=mesh.upperelements
     268
     269                #Save old mesh
     270                md.mesh.x2d=md.mesh.x
     271                md.mesh.y2d=md.mesh.y
     272                md.mesh.elements2d=md.mesh.elements
     273                md.mesh.numberofelements2d=md.mesh.numberofelements
     274                md.mesh.numberofvertices2d=md.mesh.numberofvertices
     275
     276                #Update mesh type
     277                md.mesh.dimension=3
     278
     279                #Build global 3d mesh
     280                md.mesh.elements=elements3d
     281                md.mesh.x=x3d
     282                md.mesh.y=y3d
     283                md.mesh.z=z3d
     284                md.mesh.numberofelements=number_el3d
     285                md.mesh.numberofvertices=number_nodes3d
     286                md.mesh.numberoflayers=numlayers
     287
     288                #Ok, now deal with the other fields from the 2d mesh:
     289
     290                #lat long
     291                md.mesh.lat=project3d(md,'vector',md.mesh.lat,'type','node')
     292                md.mesh.long=project3d(md,'vector',md.mesh.long,'type','node')
     293
     294                #drag coefficient is limited to nodes that are on the bedrock.
     295                md.friction.coefficient=project3d(md,'vector',md.friction.coefficient,'type','node','layer',1)
     296
     297                #p and q (same deal, except for element that are on the bedrock: )
     298                md.friction.p=project3d(md,'vector',md.friction.p,'type','element')
     299                md.friction.q=project3d(md,'vector',md.friction.q,'type','element')
     300
     301                #observations
     302                md.inversion.vx_obs=project3d(md,'vector',md.inversion.vx_obs,'type','node')
     303                md.inversion.vy_obs=project3d(md,'vector',md.inversion.vy_obs,'type','node')
     304                md.inversion.vel_obs=project3d(md,'vector',md.inversion.vel_obs,'type','node')
     305                md.surfaceforcings.mass_balance=project3d(md,'vector',md.surfaceforcings.mass_balance,'type','node')
     306                md.surfaceforcings.precipitation=project3d(md,'vector',md.surfaceforcings.precipitation,'type','node')
     307                md.balancethickness.thickening_rate=project3d(md,'vector',md.balancethickness.thickening_rate,'type','node')
     308                md.surfaceforcings.monthlytemperatures=project3d(md,'vector',md.surfaceforcings.monthlytemperatures,'type','node')
     309
     310                #results
     311                if not numpy.any(numpy.isnan(md.initialization.vx)):
     312                        md.initialization.vx=project3d(md,'vector',md.initialization.vx,'type','node')
     313                if not numpy.any(numpy.isnan(md.initialization.vy)):
     314                        md.initialization.vy=project3d(md,'vector',md.initialization.vy,'type','node')
     315                if not numpy.any(numpy.isnan(md.initialization.vz)):
     316                        md.initialization.vz=project3d(md,'vector',md.initialization.vz,'type','node')
     317                if not numpy.any(numpy.isnan(md.initialization.vel)):
     318                        md.initialization.vel=project3d(md,'vector',md.initialization.vel,'type','node')
     319                if not numpy.any(numpy.isnan(md.initialization.temperature)):
     320                        md.initialization.temperature=project3d(md,'vector',md.initialization.temperature,'type','node')
     321                if not numpy.any(numpy.isnan(md.initialization.waterfraction)):
     322                        md.initialization.waterfraction=project3d(md,'vector',md.initialization.waterfraction,'type','node')
     323
     324                #bedinfo and surface info
     325                md.mesh.elementonbed=project3d(md,'vector',numpy.ones(md.mesh.numberofelements2d),'type','element','layer',1)
     326                md.mesh.elementonsurface=project3d(md,'vector',numpy.ones(md.mesh.numberofelements2d),'type','element','layer',md.mesh.numberoflayers-1)
     327                md.mesh.vertexonbed=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d),'type','node','layer',1)
     328                md.mesh.vertexonsurface=project3d(md,'vector',numpy.ones(md.mesh.numberofvertices2d),'type','node','layer',md.mesh.numberoflayers)
     329
     330                #elementstype
     331                if not numpy.any(numpy.isnan(md.flowequation.element_equation)):
     332                        oldelements_type=md.flowequation.element_equation
     333                        md.flowequation.element_equation=numpy.zeros(number_el3d)
     334                        md.flowequation.element_equation=project3d(md,'vector',oldelements_type,'type','element')
     335
     336                #verticestype
     337                if not numpy.any(numpy.isnan(md.flowequation.vertex_equation)):
     338                        oldvertices_type=md.flowequation.vertex_equation
     339                        md.flowequation.vertex_equation=numpy.zeros(number_nodes3d)
     340                        md.flowequation.vertex_equation=project3d(md,'vector',oldvertices_type,'type','node')
     341
     342                md.flowequation.bordermacayeal=project3d(md,'vector',md.flowequation.bordermacayeal,'type','node')
     343                md.flowequation.borderpattyn=project3d(md,'vector',md.flowequation.borderpattyn,'type','node')
     344                md.flowequation.borderstokes=project3d(md,'vector',md.flowequation.borderstokes,'type','node')
     345
     346                #boundary conditions
     347                md.diagnostic.spcvx=project3d(md,'vector',md.diagnostic.spcvx,'type','node')
     348                md.diagnostic.spcvy=project3d(md,'vector',md.diagnostic.spcvy,'type','node')
     349                md.diagnostic.spcvz=project3d(md,'vector',md.diagnostic.spcvz,'type','node')
     350                md.thermal.spctemperature=project3d(md,'vector',md.thermal.spctemperature,'type','node','layer',md.mesh.numberoflayers,'padding',float('NaN'))
     351                md.prognostic.spcthickness=project3d(md,'vector',md.prognostic.spcthickness,'type','node')
     352                md.balancethickness.spcthickness=project3d(md,'vector',md.balancethickness.spcthickness,'type','node')
     353                md.diagnostic.referential=project3d(md,'vector',md.diagnostic.referential,'type','node')
     354
     355                #in 3d, pressureload: [node1 node2 node3 node4 element]
     356                pressureload_layer1=numpy.hstack((md.diagnostic.icefront[:,0:2],md.diagnostic.icefront[:,1:2]+md.mesh.numberofvertices2d,md.diagnostic.icefront[:,0:1]+md.mesh.numberofvertices2d,md.diagnostic.icefront[:,2:4]))    #Add two columns on the first layer
     357                pressureload=numpy.empty((0,6))
     358                for i in xrange(numlayers-1):
     359                        pressureload=numpy.vstack((pressureload,numpy.hstack((pressureload_layer1[:,0:4]+i*md.mesh.numberofvertices2d,pressureload_layer1[:,4:5]+i*md.mesh.numberofelements2d,pressureload_layer1[:,5:6]))))
     360                md.diagnostic.icefront=pressureload
     361
     362                #connectivity
     363                md.mesh.elementconnectivity=numpy.tile(md.mesh.elementconnectivity,(numlayers-1,1))
     364                md.mesh.elementconnectivity[numpy.nonzero(md.mesh.elementconnectivity==0)]=float('NaN')
     365                for i in xrange(1,numlayers):
     366                        md.mesh.elementconnectivity[i*md.mesh.numberofelements2d+1:(i+1)*md.mesh.numberofelements2d,:] \
     367                                =md.mesh.elementconnectivity[i*md.mesh.numberofelements2d+1:(i+1)*md.mesh.numberofelements2d,:]+md.mesh.numberofelements2d
     368                md.mesh.elementconnectivity[numpy.nonzero(numpy.isnan(md.mesh.elementconnectivity))]=0
     369
     370                #materials
     371                md.materials.rheology_B=project3d(md,'vector',md.materials.rheology_B,'type','node')
     372                md.materials.rheology_n=project3d(md,'vector',md.materials.rheology_n,'type','element')
     373
     374                #parameters
     375                md.geometry.surface=project3d(md,'vector',md.geometry.surface,'type','node')
     376                md.geometry.thickness=project3d(md,'vector',md.geometry.thickness,'type','node')
     377                md.geometry.hydrostatic_ratio=project3d(md,'vector',md.geometry.hydrostatic_ratio,'type','node')
     378                md.geometry.bed=project3d(md,'vector',md.geometry.bed,'type','node')
     379                md.geometry.bathymetry=project3d(md,'vector',md.geometry.bathymetry,'type','node')
     380                md.mesh.vertexonboundary=project3d(md,'vector',md.mesh.vertexonboundary,'type','node')
     381                md.mask.elementonfloatingice=project3d(md,'vector',md.mask.elementonfloatingice,'type','element')
     382                md.mask.vertexonfloatingice=project3d(md,'vector',md.mask.vertexonfloatingice,'type','node')
     383                md.mask.elementongroundedice=project3d(md,'vector',md.mask.elementongroundedice,'type','element')
     384                md.mask.vertexongroundedice=project3d(md,'vector',md.mask.vertexongroundedice,'type','node')
     385                md.mask.elementonwater=project3d(md,'vector',md.mask.elementonwater,'type','element')
     386                md.mask.vertexonwater=project3d(md,'vector',md.mask.vertexonwater,'type','node')
     387                if not numpy.any(numpy.isnan(md.inversion.cost_functions_coefficients)):
     388                        md.inversion.cost_functions_coefficients=project3d(md,'vector',md.inversion.cost_functions_coefficients,'type','node');end;
     389                if not numpy.any(numpy.isnan(md.inversion.min_parameters)):
     390                        md.inversion.min_parameters=project3d(md,'vector',md.inversion.min_parameters,'type','node')
     391                if not numpy.any(numpy.isnan(md.inversion.max_parameters)):
     392                        md.inversion.max_parameters=project3d(md,'vector',md.inversion.max_parameters,'type','node')
     393                if not numpy.any(numpy.isnan(md.qmu.partition)):
     394                        md.qmu.partition=project3d(md,'vector',numpy.transpose(md.qmu.partition),'type','node')
     395                if(md.surfaceforcings.isdelta18o):
     396                        md.surfaceforcings.temperatures_lgm=project3d(md,'vector',md.surfaceforcings.temperatures_lgm,'type','node')
     397                if(md.surfaceforcings.isdelta18o):
     398                        md.surfaceforcings.temperatures_presentday=project3d(md,'vector',md.surfaceforcings.temperatures_presentday,'type','node')
     399                if(md.surfaceforcings.isdelta18o):
     400                        md.surfaceforcings.precipitations_presentday=project3d(md,'vector',md.surfaceforcings.precipitations_presentday,'type','node')
     401
     402                #Put lithostatic pressure if there is an existing pressure
     403                if not numpy.any(numpy.isnan(md.initialization.pressure)):
     404                        md.initialization.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.z)
     405
     406                #special for thermal modeling:
     407                md.basalforcings.melting_rate=project3d(md,'vector',md.basalforcings.melting_rate,'type','node','layer',1)
     408                if not numpy.any(numpy.isnan(md.basalforcings.geothermalflux)):
     409                        md.basalforcings.geothermalflux=project3d(md,'vector',md.basalforcings.geothermalflux,'type','node','layer',1)    #bedrock only gets geothermal flux
     410
     411                #increase connectivity if less than 25:
     412                if md.mesh.average_vertex_connectivity<=25:
     413                        md.mesh.average_vertex_connectivity=100
     414
     415                return md
     416                # }}}
     417
  • issm/trunk-jpl/src/m/extrusion/project3d.m

    r13007 r13150  
    3636if length(vector2d)==1,
    3737        projected_vector=vector2d;
     38
    3839elseif strcmpi(type,'node'),
    3940
     
    5758                projected_vector(((layer-1)*md.mesh.numberofvertices2d+1):(layer*md.mesh.numberofvertices2d),:)=vector2d;
    5859        end
     60
    5961elseif strcmpi(type,'element'),
    6062
     
    7072        end
    7173
     74        %Fill in
    7275        if layer==0,
    7376                for i=1:(md.mesh.numberoflayers-1),
    7477                        projected_vector( ((i-1)*md.mesh.numberofelements2d+1):(i*md.mesh.numberofelements2d),:)=vector2d;
    7578                end
    76 
    7779        else
    7880                projected_vector( ((layer-1)*md.mesh.numberofelements2d+1):(layer*md.mesh.numberofelements2d),:)=vector2d;
    7981        end
     82
    8083else
    8184        error('project3d error message: unknown projection type');
  • issm/trunk-jpl/src/m/miscellaneous/fielddisplay.py

    r13125 r13150  
    7878
    7979        #initialization
    80         if   isinstance(field,tuple):
     80        if   isinstance(field,list):
     81                sbeg='['
     82                send=']'
     83        elif isinstance(field,tuple):
    8184                sbeg='('
    8285                send=')'
    83         elif isinstance(field,list):
    84                 sbeg='['
    85                 send=']'
    8686        string=sbeg
    8787
Note: See TracChangeset for help on using the changeset viewer.