1 | import numpy as npy
|
---|
2 |
|
---|
3 | def project2d(md3d,value,layer):
|
---|
4 | '''
|
---|
5 | returns the value of a field for a given layer of the mesh
|
---|
6 |
|
---|
7 | project 'value' vector taken at layer 'layer' from extruded 2d-3d
|
---|
8 | mesh onto 2d mesh used to do the extrusion. This routine is used to
|
---|
9 | compare values between a 2d-3d mesh at a certain layer, and the
|
---|
10 | equivalent value (if it exists), on the original 2d mesh.
|
---|
11 |
|
---|
12 | Note: for consistency with usage in ISSM, layers are indexed starting
|
---|
13 | from one. This routine accounts for the fact that python indexes from
|
---|
14 | zero. In other words, when using this function consider the bottom
|
---|
15 | layer as layer=1.
|
---|
16 |
|
---|
17 | Usage:
|
---|
18 | projection_value=project2d(md3d,value,layer)
|
---|
19 |
|
---|
20 | Example:
|
---|
21 | vel2=project2d(md3d,md3d.vel,2)
|
---|
22 | '''
|
---|
23 |
|
---|
24 | if md3d.mesh.domaintype().lower() != '3d':
|
---|
25 | raise StandardError("model passed to project2d function should be 3D")
|
---|
26 |
|
---|
27 | if layer<1 or layer>md3d.mesh.numberoflayers:
|
---|
28 | raise ValueError("layer must be between 0 and %i" % md3d.mesh.numberoflayers)
|
---|
29 |
|
---|
30 | # coerce to array in case float is passed
|
---|
31 | if type(value)!=npy.ndarray:
|
---|
32 | print 'coercing array'
|
---|
33 | value=npy.array(value)
|
---|
34 |
|
---|
35 | vec2d=False
|
---|
36 | if value.ndim==2:
|
---|
37 | value=value.reshape(-1,)
|
---|
38 | vec2d=True
|
---|
39 |
|
---|
40 | if value.size==1:
|
---|
41 | projection_value=value[(layer-1)*md3d.mesh.numberofelements2d:layer*md3d.mesh.numberofelements2d]
|
---|
42 | elif value.shape[0]==md3d.mesh.numberofvertices:
|
---|
43 | #print 'indices: ', (layer-1)*md3d.mesh.numberofvertices2d, layer*md3d.mesh.numberofvertices2d
|
---|
44 | projection_value=value[(layer-1)*md3d.mesh.numberofvertices2d:layer*md3d.mesh.numberofvertices2d]
|
---|
45 | elif value.shape[0]==md3d.mesh.numberofvertices+1:
|
---|
46 | projection_value=[value[(layer-1)*md3d.mesh.numberofvertices2d:layer*md3d.mesh.numberofvertices2d], value[-1]]
|
---|
47 | else:
|
---|
48 | projection_value=value[(layer-1)*md3d.mesh.numberofelements2d:layer*md3d.mesh.numberofelements2d]
|
---|
49 |
|
---|
50 | if vec2d:
|
---|
51 | projection_value=projection_value.reshape(-1,1)
|
---|
52 |
|
---|
53 | return projection_value
|
---|