File: extras.py

package info (click to toggle)
python-escript 5.6-10
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 144,304 kB
  • sloc: python: 592,074; cpp: 136,909; ansic: 18,675; javascript: 9,411; xml: 3,384; sh: 738; makefile: 207
file content (169 lines) | stat: -rw-r--r-- 6,271 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# -*- coding: utf-8 -*-

##############################################################################
#
# Copyright (c) 2003-2020 by The University of Queensland
# http://www.uq.edu.au
#
# Primary Business: Queensland, Australia
# Licensed under the Apache License, version 2.0
# http://www.apache.org/licenses/LICENSE-2.0
#
# Development until 2012 by Earth Systems Science Computational Center (ESSCC)
# Development 2012-2013 by School of Earth Sciences
# Development from 2014 by Centre for Geoscience Computing (GeoComp)
# Development from 2019 by School of Earth and Environmental Sciences
#
##############################################################################

from __future__ import print_function, division

__copyright__="""Copyright (c) 2003-2020 by The University of Queensland
http://www.uq.edu.au
Primary Business: Queensland, Australia"""
__license__="""Licensed under the Apache License, version 2.0
http://www.apache.org/licenses/LICENSE-2.0"""
__url__="https://launchpad.net/escript-finley"

"""
Layer Cake

This script uses the pycad module to build a rectangular layered
system of prisms for modelling.

:var __author__: name of author
:var __copyright__: copyrights
:var __license__: licence agreement
:var __url__: url entry point on documentation
:var __version__: version
:var __date__: date of the version
"""

__author__="Antony Hallam antony.hallam@uqconnect.edu.au"

import esys.pycad as pycad

def buildFreeSurface(xwidth,ywidth):
    '''
    Build a free surface to start the layer cake model.
        This surface is planar.

    Parameters:
        xwidth :: width in x direction in meters.\
        ywidth :: width in y direction in meters.\
    '''

    # Layer Corners
    corner_points=[]
    corner_points.append(pycad.Point(0.0,    0.0,      0.0))
    corner_points.append(pycad.Point(xwidth, 0.0,      0.0))
    corner_points.append(pycad.Point(xwidth, ywidth,   0.0))
    corner_points.append(pycad.Point(0.0,    ywidth,   0.0))
    corner_points.append(corner_points[0]) #repeated point for line looping

    # Edges of Free Surface 
    hor_lines=[]
    for i in range(0,4): # loop through four sides
        hor_lines.append(pycad.Line(corner_points[i],corner_points[i+1]))

    # Create Free Surface
    free_surf = pycad.PlaneSurface(pycad.CurveLoop(*tuple(hor_lines[0:4])))

    # Return Surface and primative arrays.
    return free_surf,hor_lines,corner_points

def buildLayer(xwidth,ywidth,depth,lay_surf,hor_lines,corner_points):
    '''
    Builds a boxlike volume and returns primatives for layered model
    construction.

    Parameters:
        xwidth :: width in x direction in meters.\
        ywidth :: width in y direction in meters.\
        depth  :: depth to bottom of layer in meters.\
        lay_surf :: surface at top of layer (see buildFreeSurf)\
        hor_lines :: lines of lay_surf\
        corner_points :: points of hor_lines\
    '''
    # Layer Corners
    corner_points.append(pycad.Point(0.0,    0.0,    depth))
    corner_points.append(pycad.Point(xwidth, 0.0,    depth))
    corner_points.append(pycad.Point(xwidth, ywidth, depth))
    corner_points.append(pycad.Point(0.0,    ywidth, depth))
    corner_points.append(corner_points[5]) #repeated point for line looping

    # Build the bottom surface edges.
    for i in range(0,4): # loop through four edges
        hor_lines.append(pycad.Line(corner_points[5+i],corner_points[6+i]))

    # Join corners vertically.
    ver_lines=[]
    for i in range(0,4): # loop through four corners
        ver_lines.append(pycad.Line(corner_points[i],corner_points[i+5]))
    ver_lines.append(ver_lines[0]) #repeated edge for surface looping   

    # Build surface array.
    lay_surf=[-lay_surf] #Negative of top surface
    # Bottom Surface
    lay_surf.append(pycad.PlaneSurface(pycad.CurveLoop(*tuple(hor_lines[4:8]))))
    for i in range(0,4): # loop through four sides
        lay_surf.append(pycad.PlaneSurface(pycad.CurveLoop(\
                        -ver_lines[i],-hor_lines[i+4],\
                        ver_lines[i+1],hor_lines[i] )))

    # Build Layer Volume
    lay_vol=pycad.Volume(-pycad.SurfaceLoop(*tuple(lay_surf)))
    
    # Return new volume, and primatives for next volume layer.    
    return lay_vol,-lay_surf[1],hor_lines[4:8],corner_points[5:10]


def layer_cake(domain,xwidth,ywidth,depths):
    '''
    Builds a horizontally layered box like model. All layers are 
    tagged as 'intface_i' where i is the python style integer denoting
    that layer. For example, the free surface is tagged 'interface_0'.
    Volumes are similarly tagged as 'volume_i'.

    Parameters:
       domain :: output of Pycad.Design - It needs to be dim 3.\
       xwidth :: width in x direction in meters.\
       ywidth :: width in y direction in meters.\
       depth  :: depth to bottom of layer in meters.\

    One may save the domain using:
        # Output settings.\    
        domain.setScriptFileName(os.path.join(save_path,fname+".geo"))\
        domain.setMeshFileName(os.path.join(save_path,fname+".msh"))\
        findomain=fin.MakeDomain(domain) #  make the finley domain:\
    
        Create a file that can be read back in to python with ReadMesh.\
        findomain.write(os.path.join(save_path,fname+".fly"))\             
    '''
    
    #get number of layers
    if not hasattr(depths,"__len__"): depths = [ depths, ]
    ndepths=len(depths)

    if domain.getDim() != 3:
        raise TypeError("domain must be of dimension order 3.")        

    # Build the First Surface and add it to the domain
    fsuf,fsurl,fsurp=buildFreeSurface(xwidth,ywidth)
    domain.addItems(pycad.PropertySet('intface_%d'%(0),fsuf))        

    # Build each layer sequentially
    # Set up temporary variables.
    tsuf=fsuf; tsurl=fsurl; tsurp=fsurp
    # Loop through all depths.
    for i in range(0,ndepths):
        # Build new layer.
        tvol,tsuf,tsurl,tsurp=buildLayer(xwidth,ywidth,depths[i],\
                                     tsuf,tsurl,tsurp)
        # Add the new interface to the domain.
        domain.addItems(pycad.PropertySet('intface_%d'%(i+1),tsuf))        
        # Add the new volume/layer to the domain.
        domain.addItems(pycad.PropertySet('volume_%d'%i,tvol))
    
    return domain