Changeset 13150
- Timestamp:
- 08/23/12 15:49:08 (13 years ago)
- Location:
- issm/trunk-jpl/src/m
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/classes/model/model.m
r13131 r13150 543 543 %Extrude the mesh 544 544 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), 547 547 error('extrusioncoefficients must be between 0 and 1'); 548 548 end 549 extrusionlist=sort(unique([ list(:);0;1]));549 extrusionlist=sort(unique([clist(:);0;1])); 550 550 numlayers=length(extrusionlist); 551 551 elseif nargin==3, %one polynomial law -
issm/trunk-jpl/src/m/classes/model/model.py
r13139 r13150 1 1 #module imports {{{ 2 import numpy 2 3 from mesh import mesh 3 4 from mask import mask … … 37 38 from mumpsoptions import * 38 39 from iluasmoptions import * 40 from project3d import * 39 41 #}}} 40 42 … … 167 169 # }}} 168 170 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 36 36 if length(vector2d)==1, 37 37 projected_vector=vector2d; 38 38 39 elseif strcmpi(type,'node'), 39 40 … … 57 58 projected_vector(((layer-1)*md.mesh.numberofvertices2d+1):(layer*md.mesh.numberofvertices2d),:)=vector2d; 58 59 end 60 59 61 elseif strcmpi(type,'element'), 60 62 … … 70 72 end 71 73 74 %Fill in 72 75 if layer==0, 73 76 for i=1:(md.mesh.numberoflayers-1), 74 77 projected_vector( ((i-1)*md.mesh.numberofelements2d+1):(i*md.mesh.numberofelements2d),:)=vector2d; 75 78 end 76 77 79 else 78 80 projected_vector( ((layer-1)*md.mesh.numberofelements2d+1):(layer*md.mesh.numberofelements2d),:)=vector2d; 79 81 end 82 80 83 else 81 84 error('project3d error message: unknown projection type'); -
issm/trunk-jpl/src/m/miscellaneous/fielddisplay.py
r13125 r13150 78 78 79 79 #initialization 80 if isinstance(field,tuple): 80 if isinstance(field,list): 81 sbeg='[' 82 send=']' 83 elif isinstance(field,tuple): 81 84 sbeg='(' 82 85 send=')' 83 elif isinstance(field,list):84 sbeg='['85 send=']'86 86 string=sbeg 87 87
Note:
See TracChangeset
for help on using the changeset viewer.