├── .gitignore ├── LICENSE ├── README.md ├── circle_blocks.py ├── config └── demo_3d.json ├── constants.py ├── default.json ├── demo ├── demo1_2d.gif ├── demo2_2d.gif └── demo3_3d.gif ├── main.py ├── obj ├── cube.stl ├── spot.obj └── spot100.obj ├── object.py ├── render ├── __init__.py └── render.py ├── requirements.txt ├── solver ├── __init__.py ├── explicit.py ├── explicit_auto_diff.py ├── implicit.py └── kinematic.py └── utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | imgui.ini 3 | output 4 | *.mtl 5 | *.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jukgei 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Finite Element Method 2 | 3 |

4 | 5 |

6 |

7 | 3D Demo: A simulation of an elasticity spot rendered using Houdini. 8 |

9 | 10 |

11 | 12 | 13 |

14 | 15 |

16 | 2D Demo: A simulation of an elasticity square mesh passing through a narrow passage. 17 |

18 | 19 | 20 | A Finite Element Method (FEM) implemented in [Taichi Lang](https://github.com/taichi-dev/taichi) that supports both 2D and 3D simulations. 21 | The FEM implementation includes support for both explicit and implicit integer methods. Have fun! 22 | 23 | ## Feature 24 | 25 | - Single object FEM simulation 26 | - Hyperelastic material model: Neo-Hookean solid 27 | - Explicit method: 28 | - [Taichi autodiff system](https://docs.taichi-lang.org/docs/differentiable_programming#limitations-of-taichi-autodiff-system) 29 | - Analytically differentiating 30 | - Implicit method: 31 | - Jacobi iterative method 32 | - Conjugate gradient method 33 | - Support `*.obj` and `*.stl` format 3D model input 34 | 35 | ## Prerequisites 36 | 37 | Taichi supports multiple difference backends, such as `cuda`, `metal`. For more detail, please refer to [this](https://docs.taichi-lang.org/docs/hello_world#supported-systems-and-backends). 38 | We utilize the `pyvista`, `tetgen` and `trimesh` packages to convert triangle meshes into tetrahedral meshes. 39 | The code test successfully passed on both Linux 22.04 and Windows 10, with CUDA as the backend. The necessary Python packages are listed below: 40 | 41 | - taichi 42 | - numpy 43 | - pyvista 44 | - tetgen 45 | - trimesh 46 | 47 | If you intend to output your simulation results in `*.gif` or `*.mp4` format, it is necessary to have `ffmpeg` installed. 48 | 49 | ## Usage 50 | 51 | ### Quickstart 52 | - Clone the repository 53 | ```bash 54 | git clone https://github.com/Jukgei/Finite-Element-Method.git 55 | ``` 56 | - Install the dependencies 57 | ```bash 58 | cd Finite-Element-Method 59 | pip install -r requirements.txt 60 | sudo apt install ffmpeg # if you intend to output your simulation results in `*.gif` of `*.mp4` 61 | ``` 62 | - Run simulation 63 | ```bash 64 | python main.py # use default config 65 | ``` 66 | If you are able to view the simulation, such as the 2D demo mentioned earlier, 67 | it indicates that your environment configuration is correct. 68 | - Use custom config 69 | ```bash 70 | python main.py --config ./config/demo_3d.json 71 | # Please change the "./config/demo_3d.json" to your config file path 72 | ``` 73 | ### Config explanation 74 | The project utilizes the JSON format for its configuration files. The JSON config contains the following parameters: 75 | - `dim` (integer): Specifies the dimension of the simulation. Valid values are 2 or 3. 76 | - `delta_time` (float): Represents the step size of the simulation. 77 | - `sim_count` (integer): Determines the number of simulation steps per render. 78 | - `auto_diff` (boolean): Specifies whether to use the Taichi autodiff system. The parameter is only valid when `"use_explicit_method": true` 79 | - `use_explicit_method` (boolean): Determines whether to use the explicit method for simulation, if set to `false`, the implicit method is used. If set to true, the explicit method is used. 80 | - `implicit_method` (integer): Configures the solver for the implicit method. This parameter is only valid when `"use_explicit_method": false`. The following options are available: 81 | - `0`: Jacobi iterative method 82 | - `1`: Conjugate gradient method 83 | - `preconditioned` (integer): Specifies whether to use the preconditioning technique before applying the conjugate gradient method to solve the system. 84 | This parameter is only valid when `"use_explicit_method": false` and `implicit_method: 1`. The following options are available: 85 | - `0`: No use of the preconditioning technique. 86 | - `1`: Use of the preconditioning technique with the equation $A^TAx = A^Tb$ 87 | - `g_dir` (list): Represents the gravity direction of the simulation. For example, `[0, -1, 0]` indicates gravity in the negative y-axis direction. 88 | - `is_output_gif` (boolean): Determines whether to output the simulation process as a `*.gif` format result. 89 | - `is_output_obj` (boolean): Determines whether to output the simulation process as a `*.obj` format result. 90 | This parameter is only valid in 2D simulation. 91 | - `output_fps` (integer): Specifies the frames per second of the output. 92 | - `objects` (list): Contains the simulation objects and their related parameters. 93 | - `blocks` (list): Contains the simulation blocks and their related parameters. 94 | This parameter is only valid in 2D simulation. Currently only circular obstacles are supported. 95 | 96 | Each object within the `objects` list contains the following parameters: 97 | - `id` (integer): Represents the object's ID. 98 | - `rho` (integer): Specifies the density of the object. 99 | - `center`: Represents the center of the object. 100 | - `side_length` (float) (2D only): Represents the side length of the simulation square. 101 | - `subdivisions` (integer) (2D only): Represents the subdivisions of each side of the square. 102 | - `E` (integer): Specifies the Young's modulus of the object. 103 | - `nu` (float): Specifies the Poisson ratio of the object. 104 | - `damping` (float): Specifies the simulation damping of the object. 105 | - `obj` (string) (3D only): Specifies the path of the simulation object. 106 | 107 | Each block within the `blocks` list contains the following parameters: 108 | - `id` (integer): Represents the block's ID. 109 | - `block_center` (list): Specifies the center of the block. 110 | - `block_radius` (float): Represents the radius of the circular block. 111 | 112 | ## Assets 113 | We provide three object models located in the `./obj` directory. It includes `cube.stl`, [Spot](https://www.cs.cmu.edu/~kmcrane/Projects/ModelRepository/#spot) and `spot100.obj`. 114 | The `spot100.obj` is generated by dividing from [Spot](https://www.cs.cmu.edu/~kmcrane/Projects/ModelRepository/#spot) model. 115 | You can simulate your own objects by adding your `*.obj` or `*.stl` model and modifying the JSON configuration file. 116 | 117 | For 2D simulations, you can construct your 2D mesh by overwriting the `construct_2d_mesh` function in `object.py` file. 118 | 119 | ## Reference 120 | - [FEM Simulation of 3D Deformable Solids](https://viterbi-web.usc.edu/~jbarbic/femdefo/) 121 | - [An Introduction to the Conjugate Gradient Method Without the Agonizing Pain](https://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf) 122 | - [Keenan's 3D Model Repository](https://www.cs.cmu.edu/~kmcrane/Projects/ModelRepository/#spot) -------------------------------------------------------------------------------- /circle_blocks.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import taichi as ti 4 | from constants import vec 5 | 6 | Block = ti.types.struct( 7 | id=ti.int32, 8 | center=vec, 9 | radius=ti.f32 10 | ) 11 | 12 | @ti.data_oriented 13 | class CircleBlocks: 14 | 15 | def __init__(self, configs): 16 | self.blocks_count = len(configs) 17 | self.blocks = Block.field(shape=self.blocks_count) 18 | self.init(configs) 19 | 20 | def init(self, block_configs): 21 | for index in range(len(block_configs)): 22 | block_config = block_configs[index] 23 | self.blocks[index].id = block_config.get('id') 24 | self.blocks[index].center = vec(block_config.get('block_center')) 25 | self.blocks[index].radius = block_config.get('block_radius') -------------------------------------------------------------------------------- /config/demo_3d.json: -------------------------------------------------------------------------------- 1 | { 2 | "dim": 3, 3 | "delta_time": 5e-4, 4 | "sim_count": 10, 5 | "auto_diff": false, 6 | "use_explicit_method": true, 7 | "implicit_method": 1, 8 | "preconditioned": 1, 9 | "g_dir": [0, -1, 0], 10 | "is_output_gif": true, 11 | "is_output_obj": false, 12 | "output_fps": 60, 13 | "objects": [ 14 | { 15 | "id": 0, 16 | "rho": 1000, 17 | "center": [2, 1, 2], 18 | "obj": "./obj/spot.obj", 19 | "E": 4e4, 20 | "nu": 0.4, 21 | "damping": 10 22 | } 23 | ], 24 | "blocks": [ 25 | { 26 | "id": 0, 27 | "block_center": [0.5, 0.5, 0.5], 28 | "block_radius": 0.0 29 | } 30 | ] 31 | 32 | } -------------------------------------------------------------------------------- /constants.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | # Init in utils.sys_init() 4 | dim = None 5 | auto_diff = None 6 | use_explicit_method = None 7 | implicit_method = None 8 | preconditioned = None 9 | g_dir = None 10 | vec = None 11 | mat = None 12 | index = None 13 | delta_time = None 14 | JACOBIN_METHOD = 0 15 | CONJUGATE_GRADIENT_METHOD = 1 16 | -------------------------------------------------------------------------------- /default.json: -------------------------------------------------------------------------------- 1 | { 2 | "dim": 2, 3 | "delta_time": 5e-4, 4 | "sim_count": 10, 5 | "auto_diff": true, 6 | "use_explicit_method": true, 7 | "implicit_method": 0, 8 | "preconditioned": 1, 9 | "g_dir": [0, -1], 10 | "is_output_gif": true, 11 | "is_output_obj": false, 12 | "output_fps": 60, 13 | "objects": [ 14 | { 15 | "id": 0, 16 | "rho": 500, 17 | "center": [0.5, 0.8], 18 | "side_length": 0.2, 19 | "subdivisions": 10, 20 | "E": 4e4, 21 | "nu": 0.2, 22 | "damping": 14.5 23 | } 24 | ], 25 | "blocks": [ 26 | { 27 | "id": 0, 28 | "block_center": [0.8, 0.5], 29 | "block_radius": 0.21 30 | }, 31 | { 32 | "id": 1, 33 | "block_center": [0.2, 0.5], 34 | "block_radius": 0.21 35 | } 36 | 37 | ] 38 | 39 | } -------------------------------------------------------------------------------- /demo/demo1_2d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jukgei/Finite-Element-Method/da2dd6686f1cbffb2c80cc5ee68aa1ad3f16e203/demo/demo1_2d.gif -------------------------------------------------------------------------------- /demo/demo2_2d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jukgei/Finite-Element-Method/da2dd6686f1cbffb2c80cc5ee68aa1ad3f16e203/demo/demo2_2d.gif -------------------------------------------------------------------------------- /demo/demo3_3d.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jukgei/Finite-Element-Method/da2dd6686f1cbffb2c80cc5ee68aa1ad3f16e203/demo/demo3_3d.gif -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import numpy as np 3 | import taichi as ti 4 | import argparse 5 | import utils 6 | 7 | 8 | def fem(soft_obj): 9 | if constants.use_explicit_method: 10 | neo_hookean_1_grad(soft_obj) 11 | else: 12 | implicit_solver_neo_hookean(soft_obj) 13 | 14 | ## debug code 15 | # A = soft_obj.matrix_ATA.to_numpy() 16 | # from constants import dim 17 | # AA = np.zeros([soft_obj.particle_cnt * dim, soft_obj.particle_cnt * dim]) 18 | # rows, cols, _, __ = A.shape 19 | # for i in range(rows): 20 | # for j in range(cols): 21 | # AA[i*dim: i*dim+dim, j*dim:j*dim+dim] = A[i, j] 22 | # 23 | # n = AA.shape[0] 24 | # leading_minors = [] 25 | # for k in range(1, n + 1): 26 | # sub_matrix = AA[:k, :k] 27 | # minor = np.linalg.det(sub_matrix) 28 | # leading_minors.append(minor) 29 | # print('\n') 30 | 31 | 32 | if __name__ == '__main__': 33 | 34 | parser = argparse.ArgumentParser(description='FEM in Taichi') 35 | parser.add_argument('--config', help="Please input a config json file.", type=str, default='default.json') 36 | args = parser.parse_args() 37 | config = utils.read_config(args.config) 38 | utils.sys_init(config) 39 | 40 | ti.init(ti.gpu, debug=False, device_memory_fraction=0.7, kernel_profiler=True) 41 | 42 | import constants 43 | from render.render import Render 44 | import solver.kinematic as ki 45 | from solver.implicit import implicit_solver_neo_hookean, advect_implicit 46 | from solver.explicit_auto_diff import compute_energy 47 | from solver.explicit import neo_hookean_1_grad 48 | from object import Object 49 | from circle_blocks import CircleBlocks 50 | 51 | render = Render(config) 52 | widget, camera = render.widget, render.camera 53 | 54 | frame_cnt = 0 55 | sim_count = config.get('sim_count') 56 | soft_objects = [] 57 | circle_blocks = CircleBlocks(config.get('blocks')) 58 | 59 | for i in config.get('objects'): 60 | soft_obj = Object(i) 61 | soft_objects.append(soft_obj) 62 | 63 | run = True 64 | now_frame = 0 65 | 66 | # is_output_gif = config.get('is_output_gif') 67 | is_output_obj = config.get('is_output_obj') 68 | output_fps = config.get('output_fps', 60) 69 | frame_time = 1.0 / output_fps 70 | virtual_time = 0.0 71 | dt = config.get("delta_time") 72 | ply_cnt = 0 73 | video_manager = ti.tools.VideoManager(output_dir="./output", framerate=output_fps, automatic_build=False) 74 | if constants.use_explicit_method: 75 | print('Simulation method: explicit method. Auto-diff {}'.format(bool(constants.auto_diff))) 76 | else: 77 | if constants.implicit_method == constants.JACOBIN_METHOD: 78 | print('Simulation method: implicit method. System Solver: jacobian iteration.') 79 | elif constants.implicit_method == constants.CONJUGATE_GRADIENT_METHOD: 80 | print('Simulation method: implicit method. System Solver: conjugate gradient. Preconditioned: {}'.format(bool(constants.preconditioned))) 81 | 82 | while widget.running: 83 | widget.get_event() 84 | if widget.is_pressed('c'): 85 | print('Camera position [{}]'.format(', '.join('{:.2f}'.format(x) for x in camera.curr_position))) 86 | print('Camera look at [{}]'.format(', '.join('{:.2f}'.format(x) for x in camera.curr_lookat))) 87 | print('Camera up [{}]'.format(', '.join('{:.2f}'.format(x) for x in camera.curr_up))) 88 | frame_cnt += 1 89 | if widget.is_pressed('r') and frame_cnt - now_frame > 20: 90 | print('Resume.') 91 | run = True 92 | now_frame = frame_cnt 93 | if widget.is_pressed('p'): 94 | print('Pause.') 95 | run = False 96 | 97 | if widget.is_pressed(ti.ui.ESCAPE): 98 | print('Quit.') 99 | break 100 | 101 | if run: 102 | for soft_obj in soft_objects: 103 | for i in range(sim_count): 104 | if constants.auto_diff == 0: 105 | fem(soft_obj) 106 | else: 107 | with ti.ad.Tape(loss=soft_obj.U): 108 | compute_energy(soft_obj) 109 | if constants.use_explicit_method or constants.auto_diff == 1: 110 | ki.kinematic(soft_obj, circle_blocks) 111 | else: 112 | advect_implicit(soft_obj, circle_blocks) 113 | virtual_time += sim_count * dt 114 | # ti.profiler.print_kernel_profiler_info() 115 | # ti.profiler.clear_kernel_profiler_info() 116 | 117 | if is_output_obj and (virtual_time / frame_time) > ply_cnt and constants.dim == 3: 118 | 119 | for soft_obj in soft_objects: 120 | soft_obj.update_obj() 121 | soft_obj.save_obj(f"output/obj_{ply_cnt:06}.obj") 122 | ply_cnt += 1 123 | 124 | msgs = [] 125 | if not render.is_output_gif: 126 | msgs.append("frame_cnt: {}".format(frame_cnt)) 127 | msgs.append("time: {:.4f}".format(virtual_time)) 128 | 129 | render.render(soft_objects, circle_blocks, virtual_time, msgs) 130 | 131 | if render.is_output_gif: 132 | render.video_manager.make_video(gif=True, mp4=True) 133 | print('Make video success.') 134 | # ffmpeg -i %6d.png -r 60 output.mp4 -------------------------------------------------------------------------------- /obj/cube.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jukgei/Finite-Element-Method/da2dd6686f1cbffb2c80cc5ee68aa1ad3f16e203/obj/cube.stl -------------------------------------------------------------------------------- /obj/spot.obj: -------------------------------------------------------------------------------- 1 | # File exported by Houdini 19.5.435 (www.sidefx.com) 2 | # 587 points 3 | # 3510 vertices 4 | # 1170 primitives 5 | # Bounds: [-0.471331894, -0.735905945, -0.6707322] to [0.471331894, 0.950944185, 1.05660439] 6 | g 7 | v 0.350476563 -0.335087717 -0.0838601291 8 | v 0.314698219 -0.39907077 0.880176485 9 | v 0.252071887 0.182858065 0.0680138543 10 | v 0.195375919 0.114902526 0.814325869 11 | v 0.346449554 -0.026735872 0.445661515 12 | v 0.327632159 -0.395449102 0.395364344 13 | v 0.332975656 0.00501069939 0.0168570019 14 | v 0.295646191 -0.0721143186 0.843159795 15 | v 0.262827009 0.117056534 0.436399698 16 | v 0.149351344 -0.45045653 0.163838685 17 | v 0.0900402889 -0.138784662 -0.204047561 18 | v 0.114009 -0.358339012 -0.0759520978 19 | v 0.102631636 -0.473665953 0.665558159 20 | v 0.240413457 -0.435263067 0.42229864 21 | v 0.388116181 -0.214244217 0.227876425 22 | v 0.358601987 -0.37797001 0.178969994 23 | v 0.338032693 -0.265635192 0.732927144 24 | v 0.316101998 -0.419396013 0.649152994 25 | v 0.0804953277 -0.165096328 0.971876264 26 | v 0.0876765996 -0.391182005 0.901606023 27 | v 0.177637279 0.276782393 0.307516783 28 | v 0.15053685 0.294125438 0.0428792462 29 | v 0.153975442 0.0966719911 -0.141223043 30 | v 0.322981924 -0.167709768 -0.078891702 31 | v 0.0906350762 0.21622169 0.666176438 32 | v 0.124172449 0.10534808 0.88811028 33 | v 0.287369579 -0.228718847 0.866671383 34 | v 0.220266536 0.145366013 0.628807664 35 | v 0.355366677 -0.0929871947 0.639581978 36 | v 0.379180908 -0.051618211 0.243738383 37 | v 0.306677341 0.100145623 0.283457607 38 | v 0.364004314 -0.234642878 0.490339279 39 | v 0.129834801 0.211629048 0.490059257 40 | v 0.156849936 0.316981137 -0.0193340983 41 | v 0.183948636 0.180969685 -0.239295796 42 | v 0.225100189 0.426615804 -0.0347001255 43 | v 0.317525566 0.310316712 -0.317258239 44 | v 0.245493203 0.526697576 -0.508367598 45 | v 0.159736171 0.766649246 -0.421086639 46 | v 0.179502666 0.119877577 -0.406148195 47 | v 0.255599439 0.183533803 -0.575846314 48 | v 0.217625797 0.363988072 -0.636265457 49 | v 0.348305702 -0.573224247 -0.0860086381 50 | v 0.290195048 -0.633514345 0.882218838 51 | v 0.17416656 -0.685710609 0.131388277 52 | v 0.143581927 -0.630804002 -0.0676795766 53 | v 0.154457599 -0.676494539 0.680257976 54 | v 0.317655653 -0.637830436 0.136132896 55 | v 0.254388094 -0.651347458 0.67166388 56 | v 0.130833417 -0.669327259 0.886708915 57 | v 0.264169008 0.646946013 -0.369897008 58 | v 0.178699583 0.694613576 -0.152503431 59 | v 0.26274386 0.561259687 -0.137458891 60 | v 0.366626501 0.688073516 -0.331132174 61 | v 0.461572886 0.743275702 -0.210357204 62 | v 0.427609652 0.703274727 -0.151132017 63 | v 0.353613108 0.589941561 -0.21609138 64 | v 0 -0.180931553 -0.206402048 65 | v 0.0951363966 0.468473732 -0.582499743 66 | v 0.0732702464 0.322780132 -0.6707322 67 | v -0.00130743289 0.057485234 -0.24622722 68 | v 0 0.118198752 -0.305449396 69 | v -0.0499868877 0.0988412648 -0.437340111 70 | v -0.0388184264 0.165013313 -0.600221872 71 | v 0.0644280985 0.75549221 -0.453814864 72 | v -4.06860721e-07 0.836310208 -0.309694588 73 | v -8.6231878e-19 -0.4365803 0.0599365272 74 | v -2.51736565e-05 -0.387711108 -0.0274457037 75 | v 1.27962694e-05 0.316789418 0.263570338 76 | v -0.00231968472 0.352353334 0.0387373269 77 | v -0.00211768039 0.516972303 0.056095764 78 | v 0.0122704767 0.745147288 -0.0776520148 79 | v 0.00596169103 0.833003283 -0.236074314 80 | v -1.52249196e-19 -0.437387228 0.728315949 81 | v 0.0419398136 -0.533073008 0.40549317 82 | v -5.47336583e-07 0.232040495 0.482914984 83 | v -2.4353425e-05 -0.319048136 0.916261315 84 | v 0 -0.230646551 0.962181985 85 | v -4.58214854e-05 0.214752927 0.754534483 86 | v 0.000216924702 0.134331197 0.894079685 87 | v 0.165109634 0.921998858 -0.221213356 88 | v 0.193791494 0.885855019 -0.330402076 89 | v 0.149685547 0.950944185 -0.258050978 90 | v 0.216307089 0.922198832 -0.242588505 91 | v 0.118086621 0.812756836 -0.215528116 92 | v 0.0770365894 0.817339063 -0.216234952 93 | v 0.177947789 0.781750083 -0.349054664 94 | v 0.0773600563 0.823041141 -0.293724298 95 | v 0.0817399174 0.829131663 -0.255232155 96 | v 0.219760388 0.752766669 -0.281413138 97 | v 0.200158715 0.77855289 -0.24971582 98 | v 0.188033953 0.763721943 -0.195627391 99 | v 0.281423986 0.763903022 -0.226394445 100 | v 0.111164652 -0.444501489 0.192145973 101 | v 0.0853611603 -0.46545282 0.636365473 102 | v 0.190951869 -0.487285376 0.405164272 103 | v -0.00163087761 -0.461006671 0.200054154 104 | v -0.0445239916 -0.442404896 0.713375926 105 | v 0.197574869 -0.0420864932 0.934544206 106 | v 0.102992192 -0.0302423146 0.980769873 107 | v 0.00048841181 0.0084783053 0.98655194 108 | v -9.19403246e-05 -0.0703475103 0.996276498 109 | v 0.00366945658 -0.0733824 1.05660439 110 | v 0.00438595004 -0.103514321 1.04006076 111 | v -0.350476563 -0.335087717 -0.0838601291 112 | v -0.314698219 -0.39907077 0.880176485 113 | v -0.276131749 0.144735128 0.0655443668 114 | v -0.197017714 0.106621876 0.826070428 115 | v -0.346449554 -0.026735872 0.445661515 116 | v -0.327632159 -0.395449102 0.395364344 117 | v -0.333758563 -0.000388677901 0.0152524263 118 | v -0.295646191 -0.0721143186 0.843159795 119 | v -0.262827009 0.117056534 0.436399698 120 | v -0.149351344 -0.45045653 0.163838685 121 | v -0.0900402889 -0.138784662 -0.204047561 122 | v -0.114009 -0.358339012 -0.0759520978 123 | v -0.102631636 -0.473665953 0.665558159 124 | v -0.240413457 -0.435263067 0.42229864 125 | v -0.388116181 -0.214244217 0.227876425 126 | v -0.358601987 -0.37797001 0.178969994 127 | v -0.336581677 -0.21406658 0.740621209 128 | v -0.316101998 -0.419396013 0.649152994 129 | v -0.0686293021 -0.17450504 0.971905231 130 | v -0.0876765996 -0.391182005 0.901606023 131 | v -0.125580758 0.308805317 0.27783671 132 | v -0.139748752 0.299782485 0.0236518364 133 | v -0.153975442 0.0966719911 -0.141223043 134 | v -0.322981924 -0.167709768 -0.078891702 135 | v -0.146838516 0.189826176 0.707982957 136 | v -0.123098217 0.089078702 0.900205255 137 | v -0.287369579 -0.228718847 0.866671383 138 | v -0.268895745 0.076757066 0.730028689 139 | v -0.355366677 -0.0929871947 0.639581978 140 | v -0.379180908 -0.051618211 0.243738383 141 | v -0.306677341 0.100145623 0.283457607 142 | v -0.364004314 -0.234642878 0.490339279 143 | v -0.132471159 0.211622223 0.484605074 144 | v -0.156849936 0.316981137 -0.0193340983 145 | v -0.183948636 0.180969685 -0.239295796 146 | v -0.225100189 0.426615804 -0.0347001255 147 | v -0.317525566 0.310316712 -0.317258239 148 | v -0.257826924 0.447386891 -0.547311008 149 | v -0.159736171 0.766649246 -0.421086639 150 | v -0.172127232 0.116680205 -0.405731231 151 | v -0.290681541 0.195403159 -0.552463949 152 | v -0.220383823 0.351278484 -0.642789662 153 | v -0.348305702 -0.573224247 -0.0860086381 154 | v -0.292704463 -0.624392867 0.883413255 155 | v -0.137264475 -0.685018301 0.0822613537 156 | v -0.143581927 -0.630804002 -0.0676795766 157 | v -0.154457599 -0.676494539 0.680257976 158 | v -0.317655653 -0.637830436 0.136132896 159 | v -0.254388094 -0.651347458 0.67166388 160 | v -0.115564339 -0.643383205 0.883395076 161 | v -0.264169008 0.646946013 -0.369897008 162 | v -0.178699583 0.694613576 -0.152503431 163 | v -0.26274386 0.561259687 -0.137458891 164 | v -0.365437597 0.657542109 -0.319862515 165 | v -0.461572886 0.743275702 -0.210357204 166 | v -0.427609652 0.703274727 -0.151132017 167 | v -0.398384184 0.610172927 -0.210954085 168 | v -0.165109634 0.921998858 -0.221213356 169 | v -0.193791494 0.885855019 -0.330402076 170 | v -0.149685547 0.950944185 -0.258050978 171 | v -0.216307089 0.922198832 -0.242588505 172 | v -0.118086621 0.812756836 -0.215528116 173 | v -0.0895274058 0.808698595 -0.203119889 174 | v -0.177947789 0.781750083 -0.349054664 175 | v -0.0861645415 0.819368362 -0.290965796 176 | v -0.219760388 0.752766669 -0.281413138 177 | v -0.200158715 0.77855289 -0.24971582 178 | v -0.188033953 0.763721943 -0.195627391 179 | v -0.281423986 0.763903022 -0.226394445 180 | v -0.16075559 -0.453055829 0.261204958 181 | v -0.0985496789 -0.468574107 0.619825423 182 | v -0.190951869 -0.487285376 0.405164272 183 | v -0.196695864 -0.0444197841 0.935579479 184 | v -0.072290428 -0.0547314435 1.00910878 185 | v -0.0855280086 -0.0654134378 0.983219504 186 | v 0.234294221 -0.430296183 0.330730468 187 | v 0.256636709 -0.447563142 0.211043283 188 | v 0.349622399 -0.363770753 0.249767527 189 | v 0.291503787 -0.41051057 0.262459725 190 | v 0.324657977 -0.383304596 0.581869662 191 | v 0.212046295 -0.475749135 0.622611403 192 | v 0.214358836 -0.44217369 0.508460343 193 | v 0.23944968 -0.341354817 -0.117949098 194 | v 0.174893796 -0.220864952 -0.148496747 195 | v 0.245440438 -0.0710229352 -0.129180118 196 | v 0.29770571 0.00931915455 -0.0410712622 197 | v 0.0973022953 0.0100067053 -0.200386018 198 | v 0.208421916 -0.195089698 0.925040185 199 | v 0.106078349 -0.312739074 0.927800298 200 | v 0.208495319 -0.394647807 0.923988283 201 | v 0.375769913 -0.157700077 0.0766851529 202 | v 0.379025668 -0.298249394 0.166935265 203 | v 0.382370323 -0.343648285 -0.0136551196 204 | v 0.38680616 -0.146027014 0.282424062 205 | v 0.363734543 -0.331111372 0.366796553 206 | v 0.364124864 -0.11594066 0.476503611 207 | v 0.36965701 -0.0440008268 0.101703286 208 | v 0.341910064 -0.404993862 0.821934879 209 | v 0.339115739 -0.336238652 0.636639476 210 | v 0.315431118 -0.215161711 0.813474476 211 | v 0.336743325 -0.0850382224 0.750065267 212 | v 0.175251648 0.300367355 0.201201141 213 | v 0.226468846 0.260323107 0.209106013 214 | v 0.30904904 0.113180958 0.156755447 215 | v 0.184790954 0.184618518 0.471051365 216 | v 0.229004651 0.178113341 0.391430229 217 | v 0.204431102 0.144210517 0.732392728 218 | v 0.0865407214 0.190672368 0.781911075 219 | v 0.30280602 0.0509218089 0.512628794 220 | v 0.311101615 0.0184453428 0.716499507 221 | v 0.25190717 0.0119482251 0.861387968 222 | v 0.187508225 0.227299884 0.00449118204 223 | v 0.161826357 0.171260476 -0.163417205 224 | v 0.187117562 0.27543202 -0.0859946162 225 | v 0.17068696 0.243594378 -0.0469624959 226 | v 0.258731574 0.238634199 -0.265018314 227 | v 0.287684649 0.409232974 -0.168603659 228 | v 0.258413851 0.353035718 -0.127936155 229 | v 0.246343255 0.143312633 -0.479601949 230 | v 0.32635957 0.23730731 -0.466926366 231 | v 0.26263383 0.180085212 -0.37679413 232 | v 0.254396975 0.253908217 -0.631763339 233 | v 0.256429791 0.408168823 -0.580816507 234 | v 0.324090749 0.381317765 -0.381516606 235 | v 0.329592288 0.305506617 -0.533200741 236 | v 0.336449146 -0.681405008 0.0501827151 237 | v 0.244666159 -0.690053999 0.149204567 238 | v 0.128314212 -0.690284014 0.0449966565 239 | v 0.221329376 -0.678402901 -0.0911568701 240 | v 0.193666026 -0.733229458 0.024581762 241 | v 0.216273442 -0.686591566 0.898569524 242 | v 0.108597182 -0.698693931 0.780374169 243 | v 0.213633567 -0.697957456 0.685113013 244 | v 0.290964305 -0.689761162 0.76903218 245 | v 0.227261275 -0.735757589 0.788902164 246 | v 0.312614262 -0.513675928 0.890427649 247 | v 0.300751448 -0.534623682 0.675487757 248 | v 0.333370864 -0.595548153 0.787878871 249 | v 0.0595087297 -0.458711863 0.794139504 250 | v 0.101001345 -0.640912652 0.718744695 251 | v 0.0999703035 -0.51869154 0.898235381 252 | v 0.0792686343 -0.632491231 0.79612118 253 | v 0.199523762 -0.645038724 0.657807887 254 | v 0.204170883 -0.608727098 0.928241789 255 | v 0.345742673 -0.50505662 0.153090701 256 | v 0.38765204 -0.486448497 0.0267112553 257 | v 0.131269529 -0.491246223 -0.0767498985 258 | v 0.241260916 -0.591095984 -0.121950604 259 | v 0.142879158 -0.614285529 0.136048883 260 | v 0.232863829 -0.630752325 0.178571522 261 | v 0.0974381939 -0.435338706 0.0358440354 262 | v 0.103383742 -0.620584846 0.031534303 263 | v 0.276047558 0.562179565 -0.37449491 264 | v 0.283804268 0.561653197 -0.234638631 265 | v 0.239848405 0.529744685 -0.0959880203 266 | v 0.281281471 0.518224597 -0.224368364 267 | v 0.20484215 0.620454073 -0.112493873 268 | v 0.294936448 0.567718267 -0.174596548 269 | v 0.432427853 0.634907782 -0.178927496 270 | v 0.261913985 0.615986288 -0.124127649 271 | v 0.289442658 0.665986061 -0.347120404 272 | v 0.386221588 0.625454247 -0.267059952 273 | v 0.29491055 0.614175856 -0.304026216 274 | v 0.417660654 0.743634701 -0.282175034 275 | v 0.454937041 0.730161607 -0.173111662 276 | v 0.442529351 0.690253079 -0.262573481 277 | v 0.127486497 0.306517392 0.284747183 278 | v 0.0752917007 0.323610097 0.168848738 279 | v 0.0464872345 0.233142465 0.477779925 280 | v 0.0718815327 -0.397859782 0.00753079634 281 | v 0.0674683154 -0.433194727 0.0861975625 282 | v 0.0468934327 -0.444088101 0.711921036 283 | v 0.0378084742 -0.351692051 0.887169302 284 | v 0.035280861 -0.402348936 0.816410065 285 | v 0 0.330987692 0.06023838 286 | v 0.0733893961 0.348736495 0.032352455 287 | v 0.0695058107 0.327796042 0.0532465018 288 | v 0.0299556535 0.443348974 0.0593780242 289 | v 0.165565744 0.488072306 0.0145662474 290 | v 0.142722473 0.422385603 0.0287537035 291 | v 0.0322997496 0.60598886 -0.521048427 292 | v 0.220697418 0.658144951 -0.471352041 293 | v 0.167782739 0.547699034 -0.532060742 294 | v -0.0957943574 0.500558197 -0.562347949 295 | v 0.137317657 0.353619933 -0.659454584 296 | v 9.97506163e-07 -0.297652364 -0.130493864 297 | v 0.0624241568 -0.211457282 -0.187470376 298 | v -0.0022815906 0.108577266 -0.275079787 299 | v 0.0661415085 0.123677261 -0.295586258 300 | v 0.102648303 0.105772465 -0.216746807 301 | v 0.0833983347 0.100595236 -0.433684021 302 | v -0.0341537483 0.114405207 -0.51485008 303 | v 0.114284173 0.167452216 -0.60045737 304 | v 0.143511191 0.117434211 -0.510704219 305 | v -0.0381832719 0.283535153 -0.668704212 306 | v 0.115755774 0.242034227 -0.654525459 307 | v -0.0014521624 0.6435377 -0.00422533974 308 | v 0.0751462951 0.631485462 -0.0203000102 309 | v 0.226763934 0.700259805 -0.426312208 310 | v 0.263280034 0.553680062 -0.466836572 311 | v 0.230416089 0.910754502 -0.296676636 312 | v 0.182736114 0.948761165 -0.302702487 313 | v 0.137672037 0.812195122 -0.336543024 314 | v 0.184387848 0.783480823 -0.31606403 315 | v 0.173123419 0.800176442 -0.223419324 316 | v 0.133432701 0.781293213 -0.189513654 317 | v 0.115386687 0.810680687 -0.343318641 318 | v 0.368402898 0.762684226 -0.240652695 319 | v 0.247670114 0.726394117 -0.326288372 320 | v 0.271310925 0.745573878 -0.185748979 321 | v 0.00640119752 0.793141246 -0.137173772 322 | v 0.0418602675 0.824662447 -0.366375118 323 | v 0.255864352 0.697721958 -0.352428824 324 | v 0.156325474 -0.49889186 0.488045126 325 | v 0.165905505 -0.454460919 0.582046747 326 | v 0.201645821 -0.433195889 0.25402379 327 | v -0.000939174206 -0.528347373 0.496696383 328 | v 0.0563536808 -0.500731349 0.304569393 329 | v 0.0777841061 -0.0685746893 0.987324238 330 | v -0.349622399 -0.363770753 0.249767527 331 | v -0.256636709 -0.447563142 0.211043283 332 | v -0.234294221 -0.430296183 0.330730468 333 | v -0.291503787 -0.41051057 0.262459725 334 | v -0.214358836 -0.44217369 0.508460343 335 | v -0.212046295 -0.475749135 0.622611403 336 | v -0.324562669 -0.383260518 0.581737638 337 | v -0.245440438 -0.0710229352 -0.129180118 338 | v -0.174893796 -0.220864952 -0.148496747 339 | v -0.23944968 -0.341354817 -0.117949098 340 | v -0.29770571 0.00931915455 -0.0410712622 341 | v -0.0973022953 0.0100067053 -0.200386018 342 | v -0.208495319 -0.394647807 0.923988283 343 | v -0.151798368 -0.225933552 0.944371641 344 | v -0.216186792 -0.294900805 0.91874814 345 | v -0.382370323 -0.343648285 -0.0136551196 346 | v -0.379025668 -0.298249394 0.166935265 347 | v -0.375769913 -0.157700077 0.0766851529 348 | v -0.363734543 -0.331111372 0.366796553 349 | v -0.38680616 -0.146027014 0.282424062 350 | v -0.364124864 -0.11594066 0.476503611 351 | v -0.36965701 -0.0440008268 0.101703286 352 | v -0.315431118 -0.215161711 0.813474476 353 | v -0.339115739 -0.336238652 0.636639476 354 | v -0.341910064 -0.404993862 0.821934879 355 | v -0.330961972 -0.053206291 0.751666367 356 | v -0.30904904 0.113180958 0.156755447 357 | v -0.237481445 0.226316392 0.267966568 358 | v -0.184472859 0.296815991 0.222123876 359 | v -0.226608202 0.257107913 0.157408178 360 | v -0.184790954 0.184618518 0.471051365 361 | v -0.229004651 0.178113341 0.391430229 362 | v -0.119325519 0.163531467 0.811994612 363 | v -0.216693923 0.149267197 0.608984888 364 | v -0.30280602 0.0509218089 0.512628794 365 | v -0.270184696 0.00770780863 0.835605919 366 | v -0.321507186 0.0106133586 0.647757173 367 | v -0.187508225 0.227299884 0.00449118204 368 | v -0.187117562 0.27543202 -0.0859946162 369 | v -0.161826357 0.171260476 -0.163417205 370 | v -0.17068696 0.243594378 -0.0469624959 371 | v -0.287684649 0.409232974 -0.168603659 372 | v -0.258731574 0.238634199 -0.265018314 373 | v -0.258413851 0.353035718 -0.127936155 374 | v -0.32635957 0.23730731 -0.466926366 375 | v -0.246343255 0.143312633 -0.479601949 376 | v -0.26263383 0.180085212 -0.37679413 377 | v -0.324090749 0.381317765 -0.381516606 378 | v -0.266173005 0.273139209 -0.631618202 379 | v -0.329490811 0.305421054 -0.534101844 380 | v -0.221329376 -0.678402901 -0.0911568701 381 | v -0.129219741 -0.686881721 0.00237951567 382 | v -0.244666159 -0.690053999 0.149204567 383 | v -0.336449146 -0.681405008 0.0501827151 384 | v -0.263865888 -0.731277287 0.0317262299 385 | v -0.290592253 -0.691456914 0.771571577 386 | v -0.213633567 -0.697957456 0.685113013 387 | v -0.108597182 -0.698693931 0.780374169 388 | v -0.185164839 -0.688758552 0.898132861 389 | v -0.225083858 -0.735905945 0.786244094 390 | v -0.300751448 -0.534623682 0.675487757 391 | v -0.312614262 -0.513675928 0.890427649 392 | v -0.333370864 -0.595548153 0.787878871 393 | v -0.0999703035 -0.51869154 0.898235381 394 | v -0.101001345 -0.640912652 0.718744695 395 | v -0.0615407526 -0.470413089 0.761756599 396 | v -0.0792686343 -0.632491231 0.79612118 397 | v -0.199523762 -0.645038724 0.657807887 398 | v -0.202982098 -0.61060077 0.928150773 399 | v -0.345742673 -0.50505662 0.153090701 400 | v -0.38765204 -0.486448497 0.0267112553 401 | v -0.131269529 -0.491246223 -0.0767498985 402 | v -0.241260916 -0.591095984 -0.121950604 403 | v -0.142992094 -0.615716696 0.13602069 404 | v -0.232863829 -0.630752325 0.178571522 405 | v -0.0974381939 -0.435338706 0.0358440354 406 | v -0.103383742 -0.620584846 0.031534303 407 | v -0.239848405 0.529744685 -0.0959880203 408 | v -0.283804268 0.561653197 -0.234638631 409 | v -0.276047558 0.562179565 -0.37449491 410 | v -0.281281471 0.518224597 -0.224368364 411 | v -0.426226228 0.648847878 -0.151391476 412 | v -0.295324057 0.56811142 -0.175984964 413 | v -0.20484215 0.620454073 -0.112493873 414 | v -0.261913985 0.615986288 -0.124127649 415 | v -0.290516049 0.656385124 -0.345458895 416 | v -0.298194617 0.585123539 -0.252044648 417 | v -0.454937041 0.730161607 -0.173111662 418 | v -0.417660654 0.743634701 -0.282175034 419 | v -0.452510208 0.664564192 -0.216977164 420 | v -0.063807413 0.327485889 0.0565829836 421 | v -0.0860658213 0.227423936 0.479970515 422 | v -0.0581933782 0.21804902 0.712290227 423 | v -0.055901736 0.121973038 0.898185849 424 | v -0.0681999698 -0.433643848 0.0869111866 425 | v -0.0718415678 -0.396208853 0.00176821975 426 | v -0.0378084742 -0.351692051 0.887169302 427 | v -0.035280861 -0.402348936 0.816410065 428 | v -0.102412872 0.344628602 0.0246572513 429 | v -0.126007617 0.471900195 0.0375257805 430 | v -0.220697418 0.658144951 -0.471352041 431 | v -0.0657018721 0.745782614 -0.459355772 432 | v -0.0968708247 0.353852481 -0.661493957 433 | v -0.181509733 0.4667826 -0.572312653 434 | v -0.0978178903 -0.31923455 0.924930632 435 | v -0.0624241568 -0.211457282 -0.187470376 436 | v -0.0661415085 0.123677261 -0.295586258 437 | v -0.102648303 0.105772465 -0.216746807 438 | v -0.206500873 0.205189347 -0.620046318 439 | v -0.160340309 0.120318048 -0.508634686 440 | v -0.188754395 0.283420295 -0.659428298 441 | v -0.0652408451 0.660761535 -0.0375410169 442 | v -0.226763934 0.700259805 -0.426312208 443 | v -0.263280034 0.553680062 -0.466836572 444 | v -0.182736114 0.948761165 -0.302702487 445 | v -0.230416089 0.910754502 -0.296676636 446 | v -0.184387848 0.783480823 -0.31606403 447 | v -0.137672037 0.812195122 -0.336543024 448 | v -0.133432701 0.781293213 -0.189513654 449 | v -0.173123419 0.800176442 -0.223419324 450 | v -0.115386687 0.810680687 -0.343318641 451 | v -0.0751669407 0.822734118 -0.252806455 452 | v -0.247670114 0.726394117 -0.326288372 453 | v -0.368402898 0.762684226 -0.240652695 454 | v -0.271310925 0.745573878 -0.185748979 455 | v -0.0630472079 0.820435226 -0.36640799 456 | v -0.255864352 0.697721958 -0.352428824 457 | v -0.156325474 -0.49889186 0.488045126 458 | v -0.165905505 -0.454460919 0.582046747 459 | v -0.188057408 -0.440998673 0.22751458 460 | v -0.0794142932 -0.523885787 0.383868873 461 | v -0.204333693 0.0236322097 0.895443022 462 | v 0.204234317 -0.457244188 0.197878852 463 | v 0.309395254 -0.423070252 0.206855208 464 | v 0.26038757 -0.432266176 0.57131952 465 | v 0.266382933 -0.45607543 0.625383914 466 | v 0.160820231 -0.482311606 0.634497941 467 | v 0.303059071 -0.335740685 -0.111157618 468 | v 0.211619198 -0.269202352 -0.12632297 469 | v 0.284192652 -0.211612552 -0.111704715 470 | v 0.0903125629 -0.314181745 -0.102047384 471 | v 0.170185983 -0.350156426 -0.104084931 472 | v 0.173298568 0.12897709 -0.0972575396 473 | v 0.169946045 0.00666383235 -0.151523918 474 | v 0.25325036 -0.250443101 0.900018632 475 | v 0.190672293 -0.298316717 0.923659384 476 | v 0.27055639 -0.396435738 0.910789788 477 | v 0.147719651 -0.393377066 0.920287371 478 | v 0.361835241 -0.218746915 -0.0283186529 479 | v 0.379151344 -0.364794105 0.105828792 480 | v 0.338358968 -0.414275885 0.721365213 481 | v 0.194477379 0.219454736 -0.176645011 482 | v 0.135166779 0.329247594 0.00251659378 483 | v 0.303267658 0.204719007 -0.532993197 484 | v 0.304330319 0.275782257 -0.593158543 485 | v 0.287338316 0.338924021 -0.602775276 486 | v 0.22811377 0.308669388 -0.649814546 487 | v 0.296282351 0.415877998 -0.511540771 488 | v 0.352516055 -0.642470777 -0.0281333998 489 | v 0.285008192 -0.72164309 0.0599848181 490 | v 0.233667001 -0.718383014 -0.039468199 491 | v 0.291648984 -0.686297953 -0.0668676719 492 | v 0.203443229 -0.725372493 0.0933172554 493 | v 0.151416451 -0.693492293 -0.0317136087 494 | v 0.2187839 -0.722445607 0.853622139 495 | v 0.303527743 -0.662087142 0.835301638 496 | v 0.127366945 -0.70182842 0.846735239 497 | v 0.147959813 -0.728327334 0.771490991 498 | v 0.219650373 -0.725713134 0.728663325 499 | v 0.314603746 -0.612978935 0.730403662 500 | v 0.336064875 -0.517847657 0.843798041 501 | v 0.0637296066 -0.431806624 0.851622105 502 | v 0.083776243 -0.615518749 0.848562658 503 | v 0.0707501471 -0.474309355 0.73389101 504 | v 0.151955143 -0.607260466 0.919733465 505 | v 0.257259578 -0.5971784 0.918778419 506 | v 0.361814141 -0.595625162 0.0913660526 507 | v 0.368236005 -0.614975989 0.0306266993 508 | v 0.381565809 -0.479238838 -0.0392692871 509 | v 0.184586659 -0.589301884 -0.108078398 510 | v 0.29921177 -0.576118588 -0.115698747 511 | v 0.184867114 -0.627466321 0.166398212 512 | v 0.290986151 -0.594278574 0.175411984 513 | v 0.109679654 -0.602961779 -0.0251720455 514 | v 0.0964717716 -0.405480385 -0.0208246876 515 | v 0.115438968 -0.620358765 0.0867255852 516 | v 0.113636747 -0.451944619 0.0950633287 517 | v 0.278055012 0.60076499 -0.320107996 518 | v 0.420696735 0.658374727 -0.148902759 519 | v 0.366231024 0.603710473 -0.15930517 520 | v 0.239081994 0.578957021 -0.111996002 521 | v 0.471331894 0.698281229 -0.183391824 522 | v 0.0639849752 0.512354016 0.0491083972 523 | v 0.0339090042 0.0578160882 -0.238855705 524 | v 0.0882825777 0.120671004 -0.253875405 525 | v 0.127393752 0.143644422 -0.270980805 526 | v -0.0396417901 0.219032437 -0.643658459 527 | v 0.197968945 0.580437124 -0.0749395564 528 | v 0.114128463 0.731500685 -0.147622719 529 | v 0 0.804349601 -0.412463874 530 | v -0.309395254 -0.423070252 0.206855208 531 | v -0.204234317 -0.457244188 0.197878852 532 | v -0.26038757 -0.432266176 0.57131952 533 | v -0.160820231 -0.482311606 0.634497941 534 | v -0.266382933 -0.45607543 0.625383914 535 | v -0.284192652 -0.211612552 -0.111704715 536 | v -0.211619198 -0.269202352 -0.12632297 537 | v -0.303059071 -0.335740685 -0.111157618 538 | v -0.170185983 -0.350156426 -0.104084931 539 | v -0.0979501754 -0.304340065 -0.107824497 540 | v -0.169946045 0.00666383235 -0.151523918 541 | v -0.173298568 0.12897709 -0.0972575396 542 | v -0.27055639 -0.396435738 0.910789788 543 | v -0.25325036 -0.250443101 0.900018632 544 | v -0.147719651 -0.393377066 0.920287371 545 | v -0.361835241 -0.218746915 -0.0283186529 546 | v -0.379151344 -0.364794105 0.105828792 547 | v -0.338358968 -0.414275885 0.721365213 548 | v -0.194477379 0.219454736 -0.176645011 549 | v -0.283752918 0.338543236 -0.606334269 550 | v -0.296214342 0.416023314 -0.511761546 551 | v -0.304330319 0.275782257 -0.593158543 552 | v -0.291648984 -0.686297953 -0.0668676719 553 | v -0.233667001 -0.718383014 -0.039468199 554 | v -0.352516055 -0.642470777 -0.0281333998 555 | v -0.170584068 -0.721205115 -0.0029043504 556 | v -0.174761295 -0.703227282 0.114537776 557 | v -0.250249773 -0.723124623 0.0982298106 558 | v -0.304151416 -0.657911181 0.838974595 559 | v -0.198896006 -0.723335028 0.851930022 560 | v -0.249177545 -0.695756018 0.874580085 561 | v -0.219650373 -0.725713134 0.728663325 562 | v -0.147959813 -0.728327334 0.771490991 563 | v -0.127397478 -0.702231467 0.845921814 564 | v -0.314603746 -0.612978935 0.730403662 565 | v -0.336064875 -0.517847657 0.843798041 566 | v -0.083776243 -0.615518749 0.848562658 567 | v -0.0637296066 -0.431806624 0.851622105 568 | v -0.151213706 -0.605282724 0.919618011 569 | v -0.257259578 -0.5971784 0.918778419 570 | v -0.361814141 -0.595625162 0.0913660526 571 | v -0.381565809 -0.479238838 -0.0392692871 572 | v -0.368236005 -0.614975989 0.0306266993 573 | v -0.184586659 -0.589301884 -0.108078398 574 | v -0.29921177 -0.576118588 -0.115698747 575 | v -0.185233995 -0.62670207 0.166697204 576 | v -0.290986151 -0.594278574 0.175411984 577 | v -0.0964717716 -0.405480385 -0.0208246876 578 | v -0.109679654 -0.602961779 -0.0251720455 579 | v -0.115438968 -0.620358765 0.0867255852 580 | v -0.113636747 -0.451944619 0.0950633287 581 | v -0.278055012 0.60076499 -0.320107996 582 | v -0.371250272 0.605533361 -0.159935325 583 | v -0.239081994 0.578957021 -0.111996002 584 | v -0.411789566 0.713377953 -0.305811882 585 | v -0.471331894 0.698281229 -0.183391824 586 | v -0.0622614659 0.472178102 0.0583092906 587 | v -0.180939764 0.458075345 0.0113276765 588 | v -0.221461311 0.582857668 -0.503296971 589 | v -0.129824847 0.146268606 -0.268019706 590 | v -0.185076252 0.152236119 -0.56530875 591 | v -0.0862618834 0.557860017 0.0227628406 592 | v -0.197968945 0.580437124 -0.0749395564 593 | v -0.114128463 0.731500685 -0.147622719 594 | vt 0.821748793 0.669904888 0 595 | vt 0.795086205 0.669374704 0 596 | vt 0.819431305 0.66229105 0 597 | vt 0.788392365 0.661465049 0 598 | vt 0.804840922 0.657312512 0 599 | vt 0.832763553 0.652656138 0 600 | vt 0.83305639 0.657906592 0 601 | vt 0.81851846 0.652283072 0 602 | vt 0.833136737 0.66351372 0 603 | vt 0.74523139 0.661198854 0 604 | vt 0.760643959 0.665284932 0 605 | vt 0.74740535 0.667508721 0 606 | vt 0.756242275 0.653775513 0 607 | vt 0.77163738 0.658290327 0 608 | vt 0.743403614 0.655616224 0 609 | vt 0.864979744 0.662590861 0 610 | vt 0.854327917 0.659138501 0 611 | vt 0.86284548 0.653538585 0 612 | vt 0.854727745 0.65424794 0 613 | vt 0.860812843 0.641554594 0 614 | vt 0.871415496 0.651232839 0 615 | vt 0.855072737 0.649178743 0 616 | vt 0.887566268 0.669588745 0 617 | vt 0.89783442 0.64474076 0 618 | vt 0.865397215 0.669533968 0 619 | vt 0.887577236 0.688421845 0 620 | vt 0.929269373 0.658560216 0 621 | vt 0.93140316 0.69630146 0 622 | vt 0.914695561 0.67197901 0 623 | vt 0.725824296 0.673971534 0 624 | vt 0.712907493 0.691231787 0 625 | vt 0.707476377 0.682047129 0 626 | vt 0.720061541 0.663566232 0 627 | vt 0.72267276 0.669572949 0 628 | vt 0.708498895 0.669978619 0 629 | vt 0.704809844 0.660177886 0 630 | vt 0.71777153 0.658102453 0 631 | vt 0.877898693 0.6939466 0 632 | vt 0.852246344 0.682262063 0 633 | vt 0.856566906 0.670864582 0 634 | vt 0.838039398 0.667746782 0 635 | vt 0.846937597 0.664470673 0 636 | vt 0.834543049 0.674132943 0 637 | vt 0.803113401 0.679050922 0 638 | vt 0.830373704 0.68656987 0 639 | vt 0.784715652 0.698222339 0 640 | vt 0.825263023 0.699807227 0 641 | vt 0.838720441 0.711387753 0 642 | vt 0.85982585 0.697244704 0 643 | vt 0.723861396 0.69750011 0 644 | vt 0.732634783 0.674215674 0 645 | vt 0.754360139 0.682761848 0 646 | vt 0.739843667 0.692089975 0 647 | vt 0.742946923 0.672832072 0 648 | vt 0.706748962 0.730760276 0 649 | vt 0.734101117 0.7280339 0 650 | vt 0.793068767 0.7178545 0 651 | vt 0.805196226 0.734527111 0 652 | vt 0.75943327 0.725953162 0 653 | vt 0.903192997 0.729416847 0 654 | vt 0.938395262 0.749756038 0 655 | vt 0.892483592 0.762904227 0 656 | vt 0.9051826 0.774241567 0 657 | vt 0.879814982 0.787149668 0 658 | vt 0.874026477 0.729829431 0 659 | vt 0.851194799 0.743939042 0 660 | vt 0.825437665 0.798830271 0 661 | vt 0.822851717 0.768857777 0 662 | vt 0.842553318 0.778010368 0 663 | vt 0.826346576 0.818414688 0 664 | vt 0.736816943 0.801287651 0 665 | vt 0.716812551 0.845581353 0 666 | vt 0.706610799 0.795399964 0 667 | vt 0.667016447 0.810009718 0 668 | vt 0.765459478 0.846332252 0 669 | vt 0.770625412 0.795801938 0 670 | vt 0.74251163 0.755906701 0 671 | vt 0.694032371 0.756972611 0 672 | vt 0.796355844 0.757781506 0 673 | vt 0.93484503 0.683548331 0 674 | vt 0.956884265 0.694141984 0 675 | vt 0.929580748 0.728550494 0 676 | vt 0.946831822 0.724905849 0 677 | vt 0.969045937 0.703887582 0 678 | vt 0.962686777 0.724480212 0 679 | vt 0.957039177 0.748447955 0 680 | vt 0.125853956 0.196853936 0 681 | vt 0.162568703 0.207346007 0 682 | vt 0.1286477 0.216191739 0 683 | vt 0.0913637057 0.208591789 0 684 | vt 0.131284177 0.162945285 0 685 | vt 0.108332969 0.166794002 0 686 | vt 0.172408044 0.15626815 0 687 | vt 0.218385369 0.177933976 0 688 | vt 0.189566135 0.185307235 0 689 | vt 0.213375643 0.19403097 0 690 | vt 0.221766338 0.209246472 0 691 | vt 0.206917748 0.209112063 0 692 | vt 0.163601175 0.181327328 0 693 | vt 0.191483393 0.20802784 0 694 | vt 0.198489368 0.2251921 0 695 | vt 0.211737648 0.224054307 0 696 | vt 0.215223014 0.245220974 0 697 | vt 0.214002863 0.234121934 0 698 | vt 0.228734374 0.238343373 0 699 | vt 0.229799584 0.230766803 0 700 | vt 0.225105986 0.222437084 0 701 | vt 0.170646891 0.228666291 0 702 | vt 0.197756439 0.243925646 0 703 | vt 0.151360855 0.945260704 0 704 | vt 0.134327486 0.933548927 0 705 | vt 0.157535464 0.937792242 0 706 | vt 0.147013918 0.92732203 0 707 | vt 0.131990999 0.943023026 0 708 | vt 0.120262712 0.938697696 0 709 | vt 0.146105826 0.955218315 0 710 | vt 0.159933135 0.954230249 0 711 | vt 0.128669322 0.95830667 0 712 | vt 0.136301145 0.951369643 0 713 | vt 0.147514984 0.960722268 0 714 | vt 0.120108858 0.950248539 0 715 | vt 0.873875797 0.944404006 0 716 | vt 0.883479118 0.939934492 0 717 | vt 0.888611376 0.953401804 0 718 | vt 0.896926165 0.945128024 0 719 | vt 0.87571913 0.932143092 0 720 | vt 0.861411929 0.937427878 0 721 | vt 0.868414402 0.929839253 0 722 | vt 0.866472125 0.94961524 0 723 | vt 0.853830218 0.942483008 0 724 | vt 0.897843361 0.931324482 0 725 | vt 0.890904307 0.934995115 0 726 | vt 0.890322268 0.925220072 0 727 | vt 0.919631958 0.980641186 0 728 | vt 0.906405091 0.954842329 0 729 | vt 0.960170805 0.955293357 0 730 | vt 0.9148103 0.946168959 0 731 | vt 0.938506246 0.939378679 0 732 | vt 0.900354922 0.969379127 0 733 | vt 0.882033169 0.973695517 0 734 | vt 0.879268289 0.958423197 0 735 | vt 0.911304653 0.9339903 0 736 | vt 0.845821917 0.936354518 0 737 | vt 0.823352873 0.949185073 0 738 | vt 0.802744329 0.942787051 0 739 | vt 0.851830482 0.912028134 0 740 | vt 0.878394365 0.899151206 0 741 | vt 0.874281228 0.922405601 0 742 | vt 0.85608983 0.929576635 0 743 | vt 0.958022892 0.926807046 0 744 | vt 0.904238224 0.926745176 0 745 | vt 0.905604243 0.90655154 0 746 | vt 0.804108799 0.969539046 0 747 | vt 0.845932126 0.950849771 0 748 | vt 0.854851484 0.95656693 0 749 | vt 0.865810335 0.961719871 0 750 | vt 0.858604729 0.98965013 0 751 | vt 0.221844241 0.913030922 0 752 | vt 0.200937718 0.935814857 0 753 | vt 0.174546629 0.933390081 0 754 | vt 0.170164272 0.89035517 0 755 | vt 0.17410709 0.914581239 0 756 | vt 0.161957994 0.92840302 0 757 | vt 0.172676966 0.944142997 0 758 | vt 0.135263324 0.917405128 0 759 | vt 0.15338555 0.906520486 0 760 | vt 0.127982184 0.876216471 0 761 | vt 0.0444228239 0.924012184 0 762 | vt 0.101166919 0.936625063 0 763 | vt 0.0753248408 0.941783667 0 764 | vt 0.120445326 0.92089808 0 765 | vt 0.10031496 0.888806581 0 766 | vt 0.109885551 0.928686976 0 767 | vt 0.106067166 0.946477354 0 768 | vt 0.141787753 0.965385497 0 769 | vt 0.155795485 0.96243602 0 770 | vt 0.142035633 0.984646201 0 771 | vt 0.169136688 0.973190963 0 772 | vt 0.166686967 0.957187355 0 773 | vt 0.180583432 0.949293613 0 774 | vt 0.223135054 0.942722261 0 775 | vt 0.103657313 0.953320026 0 776 | vt 0.0528305545 0.951793611 0 777 | vt 0.115388907 0.95941478 0 778 | vt 0.127721727 0.963866949 0 779 | vt 0.111170001 0.97497946 0 780 | vt 0.193737313 0.270605117 0 781 | vt 0.157988995 0.278113991 0 782 | vt 0.133488104 0.260102868 0 783 | vt 0.171781674 0.268606752 0 784 | vt 0.135739997 0.245652169 0 785 | vt 0.0969883651 0.227839917 0 786 | vt 0.0677070022 0.524201453 0 787 | vt 0.0785132423 0.520003319 0 788 | vt 0.0407213531 0.532909751 0 789 | vt 0.0271133892 0.566232622 0 790 | vt 0.0396967381 0.563213408 0 791 | vt 0.0558458418 0.535469651 0 792 | vt 0.0347798206 0.533895373 0 793 | vt 0.0277081002 0.556062996 0 794 | vt 0.0567938089 0.550412536 0 795 | vt 0.0683801621 0.535056174 0 796 | vt 0.0579367951 0.583010197 0 797 | vt 0.0404442362 0.586482763 0 798 | vt 0.0553583018 0.596825004 0 799 | vt 0.0729262456 0.585593879 0 800 | vt 0.0817012563 0.566612661 0 801 | vt 0.0999933928 0.549184382 0 802 | vt 0.0849886537 0.548538923 0 803 | vt 0.0682832599 0.55308485 0 804 | vt 0.0905613601 0.524977624 0 805 | vt 0.0840217248 0.531997502 0 806 | vt 0.0981707945 0.532415926 0 807 | vt 0.928014755 0.789197624 0 808 | vt 0.918072164 0.824136078 0 809 | vt 0.89495945 0.797561228 0 810 | vt 0.842298269 0.844781458 0 811 | vt 0.846512735 0.860613942 0 812 | vt 0.728365064 0.888879478 0 813 | vt 0.644795775 0.870351434 0 814 | vt 0.843080044 0.630233049 0 815 | vt 0.84543103 0.641013384 0 816 | vt 0.842326522 0.630768418 0 817 | vt 0.843631923 0.646546185 0 818 | vt 0.849568903 0.645818651 0 819 | vt 0.83783108 0.647267759 0 820 | vt 0.725131869 0.64667803 0 821 | vt 0.712927818 0.646607101 0 822 | vt 0.734689355 0.642782331 0 823 | vt 0.706443429 0.635639429 0 824 | vt 0.735384703 0.650671482 0 825 | vt 0.728856266 0.651335716 0 826 | vt 0.722095907 0.652026594 0 827 | vt 0.951007307 0.767866254 0 828 | vt 0.960138261 0.759468853 0 829 | vt 0.175057247 0.715049982 0 830 | vt 0.233567804 0.702867508 0 831 | vt 0.192689374 0.751196384 0 832 | vt 0.25349319 0.74091506 0 833 | vt 0.268890828 0.803645909 0 834 | vt 0.235909447 0.807113349 0 835 | vt 0.134362891 0.74110508 0 836 | vt 0.190430149 0.81373179 0 837 | vt 0.20466575 0.81313014 0 838 | vt 0.261044592 0.288159311 0 839 | vt 0.229262963 0.273755491 0 840 | vt 0.248488858 0.258871019 0 841 | vt 0.285621494 0.322144687 0 842 | vt 0.251554757 0.324899197 0 843 | vt 0.209632352 0.297685027 0 844 | vt 0.222409368 0.329766303 0 845 | vt 0.207111478 0.26736632 0 846 | vt 0.285847485 0.237479031 0 847 | vt 0.289291501 0.264972061 0 848 | vt 0.24469018 0.237297371 0 849 | vt 0.668144166 0.628604233 0 850 | vt 0.650424063 0.665470183 0 851 | vt 0.865572393 0.626374245 0 852 | vt 0.88446486 0.636666954 0 853 | vt 0.89332968 0.6220873 0 854 | vt 0.954645514 0.647008061 0 855 | vt 0.966762722 0.663394868 0 856 | vt 0.973830998 0.6386289 0 857 | vt 0.964157879 0.63958627 0 858 | vt 0.954795301 0.667501628 0 859 | vt 0.978186369 0.657749772 0 860 | vt 0.97529608 0.675376773 0 861 | vt 0.282951683 0.173133686 0 862 | vt 0.247149229 0.174756259 0 863 | vt 0.270211726 0.141137645 0 864 | vt 0.235974148 0.145072639 0 865 | vt 0.203312263 0.150869533 0 866 | vt 0.249679118 0.206275836 0 867 | vt 0.239988908 0.190631852 0 868 | vt 0.275671959 0.204749197 0 869 | vt 0.275995523 0.187529832 0 870 | vt 0.275062233 0.2265798 0 871 | vt 0.250317335 0.220341399 0 872 | vt 0.275371552 0.215838149 0 873 | vt 0.256671429 0.232690901 0 874 | vt 0.269914806 0.700969994 0 875 | vt 0.269408703 0.633532345 0 876 | vt 0.220166475 0.634978354 0 877 | vt 0.119667239 0.702752054 0 878 | vt 0.147982091 0.653787434 0 879 | vt 0.127664 0.650148988 0 880 | vt 0.147059307 0.608287334 0 881 | vt 0.257765949 0.573562324 0 882 | vt 0.193735003 0.548220277 0 883 | vt 0.148447469 0.422797203 0 884 | vt 0.161250785 0.437032968 0 885 | vt 0.149452001 0.436101496 0 886 | vt 0.175485045 0.396880418 0 887 | vt 0.231270447 0.391462862 0 888 | vt 0.202172443 0.418883026 0 889 | vt 0.11113508 0.402460426 0 890 | vt 0.102030359 0.42321226 0 891 | vt -2.29344787e-05 0.425677121 0 892 | vt 0.126565814 0.448740393 0 893 | vt 0.148772508 0.467131972 0 894 | vt 0.0263122916 0.449533373 0 895 | vt 0.220867783 0.422855079 0 896 | vt 0.162767321 0.456435204 0 897 | vt 0.183827668 0.454363853 0 898 | vt 0.0829928517 0.393392533 0 899 | vt 0.105888627 0.387335062 0 900 | vt 0.120280936 0.551676989 0 901 | vt 0.106138222 0.528256595 0 902 | vt 0.0848076493 0.591064692 0 903 | vt 0.0830893442 0.48230961 0 904 | vt 0.0837680623 0.499892533 0 905 | vt 0.109791815 0.500364661 0 906 | vt 0.0458544418 0.504323423 0 907 | vt 0.225986123 0.49781993 0 908 | vt 0.265778869 0.491958946 0 909 | vt 0.264027715 0.538556397 0 910 | vt 0.153901771 0.48941952 0 911 | vt 0.169894844 0.551927209 0 912 | vt 0.183390319 0.492076755 0 913 | vt 0.22825706 0.362109482 0 914 | vt 0.256922215 0.358875394 0 915 | vt 0.24444817 0.380799294 0 916 | vt 0.26891759 0.379655153 0 917 | vt 0.204827368 0.350609511 0 918 | vt 0.268677741 0.343728065 0 919 | vt 0.231831014 0.460946769 0 920 | vt 0.268704087 0.455846816 0 921 | vt 0.198130876 0.309593707 0 922 | vt 0.172203183 0.315717071 0 923 | vt 0.16971837 0.332745373 0 924 | vt 0.16433689 0.366959095 0 925 | vt 0.176122338 0.416738898 0 926 | vt 0.159246802 0.416009068 0 927 | vt 0.168054014 0.427693546 0 928 | vt 0.77622962 0.639099061 0 929 | vt 0.731499791 0.609698653 0 930 | vt 0.781114161 0.584089339 0 931 | vt 0.740493476 0.56958425 0 932 | vt 0.96197629 0.496775776 0 933 | vt 0.935725689 0.531898141 0 934 | vt 0.878139496 0.496071428 0 935 | vt 0.821920991 0.617450058 0 936 | vt 0.624888659 0.47913298 0 937 | vt 0.734059155 0.49845171 0 938 | vt 0.666833758 0.544412076 0 939 | vt 0.778046072 0.515578449 0 940 | vt 0.883720338 0.550577402 0 941 | vt 0.827204585 0.521716833 0 942 | vt 0.857016206 0.594056308 0 943 | vt 0.655959964 0.735970318 0 944 | vt 0.589041352 0.698269904 0 945 | vt 0.563214362 0.648314476 0 946 | vt 0.477084458 0.704584956 0 947 | vt 0.827548385 0.330266327 0 948 | vt 0.8254686 0.337910354 0 949 | vt 0.801302075 0.331817746 0 950 | vt 0.839139879 0.341737926 0 951 | vt 0.838971317 0.336144447 0 952 | vt 0.829673171 0.349093705 0 953 | vt 0.810664415 0.343321562 0 954 | vt 0.839085877 0.346983612 0 955 | vt 0.793952525 0.339753836 0 956 | vt 0.777935803 0.343496352 0 957 | vt 0.767024159 0.336933762 0 958 | vt 0.75063473 0.347082466 0 959 | vt 0.751989722 0.341444939 0 960 | vt 0.763240397 0.348496228 0 961 | vt 0.753634393 0.335071921 0 962 | vt 0.870635808 0.336469084 0 963 | vt 0.868966937 0.34566015 0 964 | vt 0.860014319 0.340111911 0 965 | vt 0.860638261 0.345030665 0 966 | vt 0.892730176 0.328727752 0 967 | vt 0.870592892 0.329456955 0 968 | vt 0.903498352 0.35387361 0 969 | vt 0.877796829 0.34789148 0 970 | vt 0.861211181 0.350129396 0 971 | vt 0.86873889 0.356841296 0 972 | vt 0.932527661 0.338315159 0 973 | vt 0.918584049 0.325202376 0 974 | vt 0.891487777 0.30970487 0 975 | vt 0.933407426 0.300524563 0 976 | vt 0.726620913 0.338967085 0 977 | vt 0.715811014 0.330475122 0 978 | vt 0.728732288 0.332693517 0 979 | vt 0.712477624 0.320497811 0 980 | vt 0.731509984 0.328085005 0 981 | vt 0.717622101 0.311348408 0 982 | vt 0.724786282 0.344671577 0 983 | vt 0.71213156 0.34458971 0 984 | vt 0.843607605 0.331826687 0 985 | vt 0.839914978 0.325603038 0 986 | vt 0.852509797 0.334899634 0 987 | vt 0.880920291 0.305494398 0 988 | vt 0.861727178 0.328280717 0 989 | vt 0.856914937 0.316991508 0 990 | vt 0.808874309 0.321876466 0 991 | vt 0.829513431 0.300340116 0 992 | vt 0.835232019 0.313380539 0 993 | vt 0.789444089 0.303162485 0 994 | vt 0.842254937 0.288427889 0 995 | vt 0.863714278 0.301846653 0 996 | vt 0.728441119 0.304957837 0 997 | vt 0.738288462 0.327969044 0 998 | vt 0.759786308 0.319445699 0 999 | vt 0.74869597 0.329542428 0 1000 | vt 0.742667019 0.301769793 0 1001 | vt 0.710112035 0.272294104 0 1002 | vt 0.736381352 0.266057014 0 1003 | vt 0.762782872 0.275901586 0 1004 | vt 0.796706736 0.28322801 0 1005 | vt 0.807936549 0.266244233 0 1006 | vt 0.876267433 0.269384682 0 1007 | vt 0.85308516 0.25585711 0 1008 | vt 0.902241886 0.244377986 0 1009 | vt 0.875886559 0.233928099 0 1010 | vt 0.824970603 0.201317847 0 1011 | vt 0.842994511 0.221990317 0 1012 | vt 0.82382077 0.231529221 0 1013 | vt 0.899614632 0.223638922 0 1014 | vt 0.745261312 0.175826252 0 1015 | vt 0.776965499 0.205111846 0 1016 | vt 0.738888681 0.227970719 0 1017 | vt 0.827479064 0.182681456 0 1018 | vt 0.761973679 0.249727219 0 1019 | vt 0.706586599 0.24821952 0 1020 | vt 0.703120947 0.210925713 0 1021 | vt 0.798014939 0.243195817 0 1022 | vt 0.897185206 0.275721192 0 1023 | vt 0.930624366 0.269525707 0 1024 | vt 0.947400987 0.272891521 0 1025 | vt 0.937082291 0.312877089 0 1026 | vt 0.95766598 0.302015066 0 1027 | vt 0.945639253 0.250213146 0 1028 | vt 0.968953371 0.292365521 0 1029 | vt 0.962626934 0.273256928 0 1030 | vt 0.414094329 0.198643789 0 1031 | vt 0.409868926 0.164458856 0 1032 | vt 0.448703617 0.211566105 0 1033 | vt 0.432876736 0.169012949 0 1034 | vt 0.410646737 0.218038142 0 1035 | vt 0.37637192 0.208006009 0 1036 | vt 0.368642658 0.156602159 0 1037 | vt 0.349376738 0.185001045 0 1038 | vt 0.318436503 0.17650871 0 1039 | vt 0.376285106 0.181823909 0 1040 | vt 0.346765041 0.2078446 0 1041 | vt 0.324551642 0.193381146 0 1042 | vt 0.322612464 0.234160811 0 1043 | vt 0.339886248 0.244349942 0 1044 | vt 0.327112049 0.25211212 0 1045 | vt 0.367642045 0.229383007 0 1046 | vt 0.339188784 0.225222796 0 1047 | vt 0.325985789 0.223901644 0 1048 | vt 0.315101773 0.225103468 0 1049 | vt 0.308105737 0.236950517 0 1050 | vt 0.325558424 0.209103093 0 1051 | vt 0.637849987 0.953204989 0 1052 | vt 0.635512471 0.94373399 0 1053 | vt 0.649570704 0.948903501 0 1054 | vt 0.624879897 0.95571053 0 1055 | vt 0.612312317 0.947950125 0 1056 | vt 0.622825801 0.937505424 0 1057 | vt 0.640465379 0.961624682 0 1058 | vt 0.609911501 0.964401484 0 1059 | vt 0.617577672 0.961308479 0 1060 | vt 0.624937832 0.969560385 0 1061 | vt 0.647854388 0.964969456 0 1062 | vt 0.634763837 0.97083056 0 1063 | vt 0.369800329 0.91478157 0 1064 | vt 0.377594739 0.927123189 0 1065 | vt 0.357862592 0.920558393 0 1066 | vt 0.365341634 0.930943608 0 1067 | vt 0.381200999 0.91911 0 1068 | vt 0.390977204 0.924387097 0 1069 | vt 0.363427877 0.909341514 0 1070 | vt 0.357650578 0.905442894 0 1071 | vt 0.365549624 0.899819314 0 1072 | vt 0.37828517 0.907453537 0 1073 | vt 0.392244697 0.914113104 0 1074 | vt 0.386043459 0.905783653 0 1075 | vt 0.302356035 0.935405612 0 1076 | vt 0.320957154 0.916199028 0 1077 | vt 0.341651708 0.921974361 0 1078 | vt 0.340452909 0.961591065 0 1079 | vt 0.349263728 0.931760371 0 1080 | vt 0.345419139 0.908378065 0 1081 | vt 0.373502135 0.953231215 0 1082 | vt 0.356053799 0.948386967 0 1083 | vt 0.374036014 0.937541962 0 1084 | vt 0.408891201 0.913822532 0 1085 | vt 0.45342496 0.921462178 0 1086 | vt 0.43157807 0.927743018 0 1087 | vt 0.398966134 0.906373799 0 1088 | vt 0.405217111 0.919710338 0 1089 | vt 0.381497324 0.898250759 0 1090 | vt 0.416217834 0.89637816 0 1091 | vt 0.379311979 0.876916468 0 1092 | vt 0.304373443 0.905811429 0 1093 | vt 0.353564888 0.884635091 0 1094 | vt 0.352544278 0.901432037 0 1095 | vt 0.45220384 0.949201345 0 1096 | vt 0.408298582 0.929358244 0 1097 | vt 0.387738556 0.940494061 0 1098 | vt 0.398764849 0.970487893 0 1099 | vt 0.398687869 0.934900999 0 1100 | vt 0.599676907 0.90053618 0 1101 | vt 0.595734477 0.924760997 0 1102 | vt 0.547995448 0.92321223 0 1103 | vt 0.595294237 0.943573117 0 1104 | vt 0.568903327 0.945996523 0 1105 | vt 0.64185816 0.886397719 0 1106 | vt 0.634577453 0.927587271 0 1107 | vt 0.616455495 0.916702867 0 1108 | vt 0.607882977 0.938584983 0 1109 | vt 0.597163498 0.954324961 0 1110 | vt 0.72541821 0.934193194 0 1111 | vt 0.694515646 0.951966286 0 1112 | vt 0.66867429 0.946806431 0 1113 | vt 0.659955204 0.938869596 0 1114 | vt 0.663773954 0.956658661 0 1115 | vt 0.649395049 0.931080461 0 1116 | vt 0.669525623 0.898987293 0 1117 | vt 0.62790978 0.975478888 0 1118 | vt 0.627805352 0.99482733 0 1119 | vt 0.613861203 0.972606182 0 1120 | vt 0.600703716 0.983373106 0 1121 | vt 0.589257658 0.9594751 0 1122 | vt 0.546706021 0.952904463 0 1123 | vt 0.603154123 0.967368662 0 1124 | vt 0.666183591 0.963501811 0 1125 | vt 0.71701026 0.961975574 0 1126 | vt 0.642118812 0.974048197 0 1127 | vt 0.658670962 0.98516053 0 1128 | vt 0.654452205 0.969597697 0 1129 | vt 0.343610734 0.271397561 0 1130 | vt 0.40280056 0.247663438 0 1131 | vt 0.442491293 0.23080042 0 1132 | vt 0.379617989 0.279895008 0 1133 | vt 0.36582759 0.269849479 0 1134 | vt 0.404804558 0.262361288 0 1135 | vt 0.469611138 0.56575942 0 1136 | vt 0.492351472 0.584090471 0 1137 | vt 0.455240637 0.563624203 0 1138 | vt 0.481942356 0.545148492 0 1139 | vt 0.504753232 0.54164052 0 1140 | vt 0.482763886 0.56120497 0 1141 | vt 0.496487021 0.587314069 0 1142 | vt 0.509401023 0.558946013 0 1143 | vt 0.514317274 0.543615937 0 1144 | vt 0.501721919 0.531795084 0 1145 | vt 0.510133445 0.531184793 0 1146 | vt 0.481632888 0.526438892 0 1147 | vt 0.490828484 0.521063626 0 1148 | vt 0.502149999 0.526678026 0 1149 | vt 0.468279809 0.544173062 0 1150 | vt 0.465885431 0.522506475 0 1151 | vt 0.448401272 0.549580336 0 1152 | vt 0.457877249 0.550033212 0 1153 | vt 0.447406501 0.536328971 0 1154 | vt 0.455640793 0.519962549 0 1155 | vt 0.951950371 0.230064198 0 1156 | vt 0.895998299 0.202334672 0 1157 | vt 0.916730225 0.175165281 0 1158 | vt 0.834798932 0.167287007 0 1159 | vt 0.743595779 0.139089346 0 1160 | vt 0.843577266 0.138816416 0 1161 | vt 0.721667945 0.11322429 0 1162 | vt 0.702349901 0.174917459 0 1163 | vt 0.658056438 0.199874014 0 1164 | vt 0.649578393 0.162953481 0 1165 | vt 0.639597237 0.130525067 0 1166 | vt 0.849457324 0.368145198 0 1167 | vt 0.844423711 0.359184295 0 1168 | vt 0.852264583 0.358013451 0 1169 | vt 0.844314158 0.352304608 0 1170 | vt 0.850064218 0.352947831 0 1171 | vt 0.855949759 0.353595316 0 1172 | vt 0.733092546 0.356418282 0 1173 | vt 0.742763996 0.359804571 0 1174 | vt 0.720817387 0.356917769 0 1175 | vt 0.713649035 0.36945048 0 1176 | vt 0.740080953 0.351845324 0 1177 | vt 0.729619741 0.350917846 0 1178 | vt 0.959401846 0.245599613 0 1179 | vt 0.403046101 0.74110508 0 1180 | vt 0.346978843 0.81373179 0 1181 | vt 0.371046007 0.729329944 0 1182 | vt 0.315707862 0.80652225 0 1183 | vt 0.301449418 0.724288464 0 1184 | vt 0.307864815 0.257470548 0 1185 | vt 0.323670864 0.280778557 0 1186 | vt 0.327340364 0.29780969 0 1187 | vt 0.31463021 0.32955271 0 1188 | vt 0.675992548 0.378352195 0 1189 | vt 0.656896234 0.345060289 0 1190 | vt 0.690648496 0.33202371 0 1191 | vt 0.87109977 0.373060584 0 1192 | vt 0.851151347 0.368356019 0 1193 | vt 0.890462458 0.362573653 0 1194 | vt 0.896946907 0.378251612 0 1195 | vt 0.96200037 0.356330067 0 1196 | vt 0.956342816 0.328265071 0 1197 | vt 0.975365758 0.31939283 0 1198 | vt 0.978760958 0.337368131 0 1199 | vt 0.974197805 0.355416536 0 1200 | vt 0.339257449 0.150882244 0 1201 | vt 0.304603636 0.145112768 0 1202 | vt 0.301678687 0.191003844 0 1203 | vt 0.302596778 0.201990932 0 1204 | vt 0.303783119 0.214163378 0 1205 | vt 0.299880683 0.226896077 0 1206 | vt 0.318968445 0.677329123 0 1207 | vt 0.337112337 0.724263966 0 1208 | vt 0.313486069 0.617391169 0 1209 | vt 0.389427394 0.653786957 0 1210 | vt 0.343673944 0.548219979 0 1211 | vt 0.409745008 0.650148988 0 1212 | vt 0.390349865 0.608286738 0 1213 | vt 0.417741776 0.702752054 0 1214 | vt 0.387779593 0.417998105 0 1215 | vt 0.387594074 0.431385577 0 1216 | vt 0.375866294 0.432589531 0 1217 | vt 0.359172493 0.392579556 0 1218 | vt 0.3338826 0.415293545 0 1219 | vt 0.303140402 0.388401389 0 1220 | vt 0.411225468 0.44356209 0 1221 | vt 0.434152722 0.417359859 0 1222 | vt 0.536240458 0.417522639 0 1223 | vt 0.423798531 0.396720767 0 1224 | vt 0.41507715 0.460324079 0 1225 | vt 0.511399388 0.442084283 0 1226 | vt 0.357044995 0.443885744 0 1227 | vt 0.315451622 0.419698417 0 1228 | vt 0.451347858 0.386975706 0 1229 | vt 0.428109586 0.381410331 0 1230 | vt 0.486280322 0.510021508 0 1231 | vt 0.460804462 0.48286888 0 1232 | vt 0.442661524 0.51926142 0 1233 | vt 0.410901785 0.549307704 0 1234 | vt 0.430603564 0.504776061 0 1235 | vt 0.435659468 0.555714667 0 1236 | vt 0.47604084 0.619967103 0 1237 | vt 0.354018718 0.492076457 0 1238 | vt 0.383507788 0.489418715 0 1239 | vt 0.367514074 0.551926672 0 1240 | vt 0.324703306 0.500896215 0 1241 | vt 0.28717947 0.357726216 0 1242 | vt 0.309557527 0.362487048 0 1243 | vt 0.332805246 0.34964335 0 1244 | vt 0.297674179 0.381173521 0 1245 | vt 0.311205119 0.479133785 0 1246 | vt 0.310854912 0.461947054 0 1247 | vt 0.338833332 0.309639871 0 1248 | vt 0.37260437 0.360656768 0 1249 | vt 0.367290199 0.329945743 0 1250 | vt 0.364793718 0.314565241 0 1251 | vt 0.376586944 0.411424428 0 1252 | vt 0.359768331 0.412540704 0 1253 | vt 0.368498057 0.423359513 0 1254 | vt 0.776160836 0.355300158 0 1255 | vt 0.781296968 0.410819948 0 1256 | vt 0.730704725 0.386149257 0 1257 | vt 0.740317464 0.426593065 0 1258 | vt 0.674427807 0.449152738 0 1259 | vt 0.934593797 0.461407304 0 1260 | vt 0.850420177 0.420813531 0 1261 | vt 0.821931839 0.376563638 0 1262 | vt 0.868630469 0.407950222 0 1263 | vt 0.789066374 0.462404758 0 1264 | vt 0.657633424 0.270781308 0 1265 | vt 0.674443424 0.240816817 0 1266 | vt 0.545893967 0.186387673 0 1267 | vt 0.554036319 0.264264971 0 1268 | vt 0.463047147 0.31468451 0 1269 | vt 0.596127272 0.307408899 0 1270 | vt 0.832534313 0.64791131 0 1271 | vt 0.833087981 0.669026017 0 1272 | vt 0.761955619 0.675569236 0 1273 | vt 0.749724984 0.673721015 0 1274 | vt 0.741555154 0.650071323 0 1275 | vt 0.853998423 0.663679063 0 1276 | vt 0.855390012 0.645025015 0 1277 | vt 0.690375149 0.687888503 0 1278 | vt 0.715493977 0.652696013 0 1279 | vt 0.972917318 0.691530764 0 1280 | vt 0.956544816 0.743188918 0 1281 | vt 0.155180067 0.158941403 0 1282 | vt 0.989054978 0.938199997 0 1283 | vt 0.887400448 1.0006119 0 1284 | vt 0.775014997 0.959635019 0 1285 | vt 0.82761997 0.926767766 0 1286 | vt 0.930382729 0.915888846 0 1287 | vt 0.829389155 0.979322433 0 1288 | vt 0.254826009 0.925517976 0 1289 | vt 0.0190149006 0.939185023 0 1290 | vt 0.0721439421 0.906620741 0 1291 | vt 0.195348367 0.958360672 0 1292 | vt 0.0822220296 0.963872254 0 1293 | vt 0.176354006 0.291487008 0 1294 | vt 0.102763489 0.238131478 0 1295 | vt 0.0664284006 0.604860008 0 1296 | vt 0.837777555 0.639843404 0 1297 | vt 0.832343221 0.647978961 0 1298 | vt 0.738810539 0.647393763 0 1299 | vt 0.741648793 0.650040925 0 1300 | vt 0.962823153 0.771383226 0 1301 | vt 0.955353677 0.782122791 0 1302 | vt 0.981052339 0.639256179 0 1303 | vt 0.113543883 0.680470526 0 1304 | vt 0.100206651 0.578385592 0 1305 | vt 0.650845766 0.540877581 0 1306 | vt 0.692943811 0.577374578 0 1307 | vt 0.633033514 0.525777102 0 1308 | vt 0.610792518 0.502637744 0 1309 | vt 0.897593617 0.566535294 0 1310 | vt 0.592221975 0.7497437 0 1311 | vt 0.554488301 0.81974709 0 1312 | vt 0.46440196 0.751391411 0 1313 | vt 0.838683009 0.330653995 0 1314 | vt 0.839074314 0.351723403 0 1315 | vt 0.767914295 0.326648235 0 1316 | vt 0.74925226 0.352681488 0 1317 | vt 0.75544101 0.328792006 0 1318 | vt 0.859479249 0.335545331 0 1319 | vt 0.861720026 0.354306012 0 1320 | vt 0.722959995 0.350315988 0 1321 | vt 0.956569374 0.256002635 0 1322 | vt 0.972790182 0.303799927 0 1323 | vt 0.385922581 0.159729004 0 1324 | vt 0.275352001 0.917971015 0 1325 | vt 0.370684087 0.982072532 0 1326 | vt 0.480771989 0.938676 0 1327 | vt 0.330289692 0.894341409 0 1328 | vt 0.427377313 0.959566772 0 1329 | vt 0.515015006 0.935698986 0 1330 | vt 0.750826001 0.949366987 0 1331 | vt 0.697697043 0.916802108 0 1332 | vt 0.574491799 0.968542278 0 1333 | vt 0.687618852 0.974052846 0 1334 | vt 0.436383158 0.24099946 0 1335 | vt 0.360738993 0.292908013 0 1336 | vt 0.496385008 0.522840977 0 1337 | vt 0.838873208 0.351668417 0 1338 | vt 0.746448755 0.355458468 0 1339 | vt 0.749340594 0.352705419 0 1340 | vt 0.963408172 0.230830759 0 1341 | vt 0.95594722 0.218568861 0 1342 | vt 0.982015967 0.355741084 0 1343 | vt 0.42386511 0.680470526 0 1344 | vt 0.377941012 0.454323083 0 1345 | vt 0.476926506 0.499229103 0 1346 | vt 0.691365898 0.419882685 0 1347 | vt 0.648572505 0.458012849 0 1348 | vt 0.897571683 0.427201837 0 1349 | vt 0.558416843 0.363289267 0 1350 | vt 0.449448884 0.256144285 0 1351 | g 1352 | f 182/1 6/2 183/3 1353 | f 14/4 180/5 6/2 1354 | f 456/6 181/7 183/3 1355 | f 320/8 183/3 180/5 1356 | f 181/7 457/9 183/3 1357 | f 185/10 458/11 459/12 1358 | f 319/13 186/14 458/11 1359 | f 460/15 458/11 185/10 1360 | f 186/14 14/4 458/11 1361 | f 6/2 458/11 14/4 1362 | f 463/16 461/17 462/18 1363 | f 187/19 462/18 461/17 1364 | f 464/20 188/21 462/18 1365 | f 465/22 462/18 187/19 1366 | f 189/23 463/16 11/24 1367 | f 188/21 11/24 463/16 1368 | f 189/23 24/25 463/16 1369 | f 190/26 24/25 189/23 1370 | f 11/24 191/27 189/23 1371 | f 190/26 189/23 466/28 1372 | f 467/29 466/28 189/23 1373 | f 191/27 467/29 189/23 1374 | f 2/30 27/31 468/32 1375 | f 194/33 470/34 469/35 1376 | f 468/32 469/35 470/34 1377 | f 469/35 193/36 194/33 1378 | f 471/37 194/33 193/36 1379 | f 7/38 195/39 472/40 1380 | f 473/41 197/42 196/43 1381 | f 6/2 182/1 199/44 1382 | f 15/45 32/46 199/44 1383 | f 198/47 32/46 15/45 1384 | f 30/48 198/47 15/45 1385 | f 15/45 201/49 30/48 1386 | f 24/25 190/26 7/38 1387 | f 195/39 7/38 201/49 1388 | f 27/31 2/30 204/50 1389 | f 202/51 204/50 2/30 1390 | f 203/52 17/53 474/54 1391 | f 204/50 8/55 27/31 1392 | f 17/53 205/56 204/50 1393 | f 200/57 5/58 29/59 1394 | f 17/53 203/52 32/46 1395 | f 3/60 22/61 207/62 1396 | f 207/62 206/63 21/64 1397 | f 208/65 207/62 31/66 1398 | f 209/67 9/68 210/69 1399 | f 21/64 209/67 207/62 1400 | f 210/69 207/62 209/67 1401 | f 21/64 33/70 209/67 1402 | f 211/71 212/72 4/73 1403 | f 26/74 4/73 212/72 1404 | f 25/75 28/76 33/70 1405 | f 209/67 33/70 28/76 1406 | f 211/71 4/73 214/77 1407 | f 215/78 214/77 4/73 1408 | f 205/56 214/77 8/55 1409 | f 215/78 8/55 214/77 1410 | f 214/77 29/59 5/58 1411 | f 28/76 213/79 9/68 1412 | f 31/66 30/48 208/65 1413 | f 208/65 201/49 7/38 1414 | f 208/65 7/38 3/60 1415 | f 23/80 217/81 466/28 1416 | f 216/82 466/28 219/83 1417 | f 475/84 218/85 217/81 1418 | f 22/61 219/83 476/86 1419 | f 219/83 22/61 216/82 1420 | f 222/87 37/88 221/89 1421 | f 222/87 36/90 218/91 1422 | f 34/92 218/91 36/90 1423 | f 35/93 40/94 225/95 1424 | f 223/96 225/95 40/94 1425 | f 41/97 477/98 223/96 1426 | f 220/99 225/95 37/88 1427 | f 224/100 37/88 225/95 1428 | f 224/100 477/98 229/101 1429 | f 478/102 229/101 477/98 1430 | f 227/103 479/104 42/105 1431 | f 480/106 479/104 226/107 1432 | f 478/102 226/107 479/104 1433 | f 228/108 229/101 481/109 1434 | f 479/104 227/103 481/109 1435 | f 483/110 485/111 230/112 1436 | f 482/113 230/112 485/111 1437 | f 484/114 233/115 485/111 1438 | f 486/116 483/110 231/117 1439 | f 486/116 232/118 234/119 1440 | f 231/117 45/120 486/116 1441 | f 487/121 233/115 484/114 1442 | f 232/118 487/121 234/119 1443 | f 488/122 239/123 489/124 1444 | f 238/125 489/124 239/123 1445 | f 491/126 490/127 236/128 1446 | f 235/129 50/130 488/122 1447 | f 490/127 488/122 50/130 1448 | f 237/131 492/132 47/133 1449 | f 491/126 47/133 492/132 1450 | f 492/132 238/125 239/123 1451 | f 202/134 242/135 474/136 1452 | f 474/136 493/137 241/138 1453 | f 242/135 202/134 494/139 1454 | f 238/125 242/135 489/124 1455 | f 240/140 44/141 494/139 1456 | f 489/124 494/139 44/141 1457 | f 49/142 241/138 493/137 1458 | f 493/137 242/135 238/125 1459 | f 496/143 245/144 495/145 1460 | f 497/146 13/147 244/148 1461 | f 246/149 244/148 236/128 1462 | f 245/144 496/143 50/130 1463 | f 236/128 490/127 246/149 1464 | f 496/143 246/149 490/127 1465 | f 49/142 459/150 241/138 1466 | f 49/142 237/131 247/151 1467 | f 247/151 237/131 47/133 1468 | f 244/148 13/147 47/133 1469 | f 460/152 47/133 13/147 1470 | f 471/153 245/144 498/154 1471 | f 248/155 498/154 235/129 1472 | f 50/130 235/129 498/154 1473 | f 50/130 498/154 245/144 1474 | f 240/140 499/156 44/141 1475 | f 499/156 248/155 235/129 1476 | f 499/156 240/140 470/157 1477 | f 473/158 249/159 500/160 1478 | f 197/161 473/158 250/162 1479 | f 501/163 500/160 230/112 1480 | f 48/164 500/160 249/159 1481 | f 482/113 43/165 502/166 1482 | f 230/112 482/113 501/163 1483 | f 250/162 502/166 197/161 1484 | f 1/167 502/166 43/165 1485 | f 465/168 503/169 251/170 1486 | f 504/171 461/172 43/165 1487 | f 1/167 43/165 461/172 1488 | f 233/115 252/173 485/111 1489 | f 504/171 485/111 252/173 1490 | f 46/174 251/170 503/169 1491 | f 252/173 233/115 503/169 1492 | f 253/175 505/176 10/177 1493 | f 456/178 10/177 505/176 1494 | f 254/179 505/176 231/117 1495 | f 45/120 231/117 505/176 1496 | f 249/159 506/180 48/164 1497 | f 506/180 254/179 231/117 1498 | f 506/180 249/159 457/181 1499 | f 507/182 508/183 251/170 1500 | f 232/118 256/184 487/121 1501 | f 507/182 487/121 256/184 1502 | f 251/170 46/174 507/182 1503 | f 509/185 256/184 232/118 1504 | f 10/177 510/186 253/175 1505 | f 509/185 253/175 510/186 1506 | f 481/109 304/187 228/108 1507 | f 511/188 258/189 257/190 1508 | f 260/191 257/190 258/189 1509 | f 260/191 259/192 221/89 1510 | f 228/108 221/89 37/88 1511 | f 512/193 56/194 264/195 1512 | f 53/196 262/197 513/198 1513 | f 261/199 514/200 264/195 1514 | f 53/196 264/195 514/200 1515 | f 262/197 57/201 513/198 1516 | f 513/198 263/202 512/193 1517 | f 267/203 262/197 258/204 1518 | f 258/204 511/205 267/203 1519 | f 267/203 265/206 54/207 1520 | f 54/207 268/208 270/209 1521 | f 54/207 270/209 266/210 1522 | f 269/211 515/212 55/213 1523 | f 55/213 270/209 268/208 1524 | f 515/212 512/193 263/202 1525 | f 56/194 515/212 269/211 1526 | f 272/214 69/215 271/216 1527 | f 273/217 76/218 25/75 1528 | f 79/219 25/75 76/218 1529 | f 212/72 79/219 80/220 1530 | f 68/221 274/222 67/223 1531 | f 255/224 274/222 508/225 1532 | f 510/226 274/222 255/224 1533 | f 278/227 277/228 74/229 1534 | f 77/230 74/229 277/228 1535 | f 497/231 243/232 278/227 1536 | f 243/232 495/233 278/227 1537 | f 271/216 69/215 273/217 1538 | f 21/64 271/216 33/70 1539 | f 272/214 206/63 281/234 1540 | f 22/61 281/234 206/63 1541 | f 281/234 476/86 280/235 1542 | f 283/236 516/237 284/238 1543 | f 282/239 284/238 516/237 1544 | f 70/240 280/241 282/239 1545 | f 36/242 284/238 34/243 1546 | f 476/244 34/243 284/238 1547 | f 280/241 476/244 284/238 1548 | f 285/245 287/246 59/247 1549 | f 425/248 65/249 285/245 1550 | f 286/250 65/249 39/251 1551 | f 38/252 287/246 286/250 1552 | f 426/253 288/254 289/255 1553 | f 59/247 289/255 288/254 1554 | f 42/105 59/247 287/246 1555 | f 77/230 193/36 78/256 1556 | f 78/256 193/36 19/257 1557 | f 68/221 290/258 274/222 1558 | f 291/259 290/258 58/260 1559 | f 274/222 290/258 464/20 1560 | f 188/21 464/20 291/259 1561 | f 517/261 11/24 58/260 1562 | f 518/262 517/261 292/263 1563 | f 61/264 292/263 517/261 1564 | f 294/265 191/27 517/261 1565 | f 518/262 217/81 294/265 1566 | f 293/266 519/267 518/262 1567 | f 217/81 23/80 294/265 1568 | f 63/268 295/269 62/270 1569 | f 293/271 62/270 295/269 1570 | f 40/94 35/93 519/272 1571 | f 297/273 298/274 64/275 1572 | f 296/276 64/275 298/274 1573 | f 298/274 41/97 223/96 1574 | f 295/269 298/274 40/94 1575 | f 299/277 300/278 520/279 1576 | f 300/278 299/277 60/280 1577 | f 480/106 60/280 289/255 1578 | f 41/97 297/273 226/107 1579 | f 300/278 226/107 297/273 1580 | f 71/281 516/237 301/282 1581 | f 302/283 301/282 516/237 1582 | f 283/236 259/284 521/285 1583 | f 514/286 261/287 521/285 1584 | f 72/288 302/283 522/289 1585 | f 521/285 522/289 302/283 1586 | f 38/252 286/250 304/187 1587 | f 84/290 83/291 81/292 1588 | f 308/293 87/294 307/295 1589 | f 91/296 309/297 92/298 1590 | f 85/299 92/298 309/297 1591 | f 86/300 310/301 85/299 1592 | f 307/295 311/302 89/303 1593 | f 88/304 89/303 311/302 1594 | f 89/303 88/304 86/300 1595 | f 93/305 90/306 92/298 1596 | f 90/307 312/308 268/208 1597 | f 265/206 317/309 54/207 1598 | f 92/310 314/311 93/312 1599 | f 314/311 264/195 56/194 1600 | f 92/310 52/313 314/311 1601 | f 55/213 312/308 93/312 1602 | f 86/314 73/315 315/316 1603 | f 92/317 522/289 52/318 1604 | f 522/289 92/317 310/319 1605 | f 311/320 316/321 88/322 1606 | f 66/323 88/322 316/321 1607 | f 311/320 87/324 39/251 1608 | f 523/325 39/251 65/249 1609 | f 73/315 88/326 66/327 1610 | f 303/328 39/251 87/324 1611 | f 317/329 87/324 313/330 1612 | f 90/331 313/330 87/324 1613 | f 308/293 82/332 305/333 1614 | f 305/333 84/290 91/296 1615 | f 305/333 91/296 308/293 1616 | f 89/303 83/291 307/295 1617 | f 306/334 307/295 83/291 1618 | f 84/290 309/297 91/296 1619 | f 309/297 81/292 85/299 1620 | f 14/335 186/336 96/337 1621 | f 318/338 96/337 186/336 1622 | f 67/339 275/340 97/341 1623 | f 180/342 14/335 96/337 1624 | f 98/343 321/344 95/345 1625 | f 321/344 75/346 318/338 1626 | f 96/337 318/338 75/346 1627 | f 97/341 94/347 322/348 1628 | f 322/348 96/337 75/346 1629 | f 322/348 320/349 96/337 1630 | f 27/31 8/55 468/32 1631 | f 99/350 468/32 8/55 1632 | f 4/73 26/74 215/78 1633 | f 19/257 323/351 102/352 1634 | f 323/351 104/353 102/352 1635 | f 324/354 327/355 110/356 1636 | f 325/357 327/355 524/358 1637 | f 453/359 326/360 327/355 1638 | f 525/361 327/355 325/357 1639 | f 118/362 110/356 326/360 1640 | f 328/363 526/364 118/362 1641 | f 110/356 118/362 526/364 1642 | f 527/365 329/366 526/364 1643 | f 452/367 526/364 328/363 1644 | f 329/366 528/368 526/364 1645 | f 529/369 530/370 531/371 1646 | f 333/372 531/371 530/370 1647 | f 331/373 529/369 128/374 1648 | f 331/373 115/375 529/369 1649 | f 332/376 529/369 115/375 1650 | f 532/377 333/372 530/370 1651 | f 533/378 530/370 332/376 1652 | f 335/379 331/373 534/380 1653 | f 334/381 535/382 331/373 1654 | f 534/380 331/373 535/382 1655 | f 115/375 331/373 335/379 1656 | f 334/381 331/373 128/374 1657 | f 336/383 338/384 536/385 1658 | f 537/386 536/385 338/384 1659 | f 106/387 537/386 131/388 1660 | f 538/389 428/390 336/383 1661 | f 338/384 336/383 428/390 1662 | f 540/391 340/392 339/393 1663 | f 111/394 539/395 341/396 1664 | f 110/356 342/397 324/354 1665 | f 343/398 119/399 136/400 1666 | f 119/399 342/397 136/400 1667 | f 134/401 119/399 343/398 1668 | f 341/396 345/402 111/394 1669 | f 128/374 111/394 334/381 1670 | f 119/399 134/401 345/402 1671 | f 131/388 346/403 106/387 1672 | f 348/404 106/387 346/403 1673 | f 347/405 541/406 121/407 1674 | f 346/403 131/388 112/408 1675 | f 349/409 133/410 121/407 1676 | f 344/411 133/410 109/412 1677 | f 121/407 136/400 347/405 1678 | f 350/413 135/414 353/415 1679 | f 351/416 353/415 135/414 1680 | f 354/417 355/418 113/419 1681 | f 355/418 354/417 351/416 1682 | f 352/420 351/416 354/417 1683 | f 129/421 357/422 132/423 1684 | f 129/421 137/424 357/422 1685 | f 354/417 357/422 137/424 1686 | f 132/423 360/425 349/409 1687 | f 359/426 349/409 112/408 1688 | f 359/426 108/427 132/423 1689 | f 132/423 358/428 360/425 1690 | f 357/422 113/419 358/428 1691 | f 360/425 109/412 133/410 1692 | f 135/414 350/413 134/401 1693 | f 350/413 107/429 345/402 1694 | f 111/394 345/402 107/429 1695 | f 361/430 364/431 535/382 1696 | f 127/432 535/382 363/433 1697 | f 364/431 361/430 126/434 1698 | f 542/435 363/433 362/436 1699 | f 367/437 362/438 140/439 1700 | f 138/440 140/439 362/438 1701 | f 367/437 365/441 141/442 1702 | f 139/443 370/444 144/445 1703 | f 366/446 141/442 370/444 1704 | f 368/447 370/444 141/442 1705 | f 369/448 144/445 370/444 1706 | f 543/449 544/450 142/451 1707 | f 371/452 544/450 373/453 1708 | f 545/454 543/449 372/455 1709 | f 142/451 146/456 543/449 1710 | f 368/447 373/453 145/457 1711 | f 545/454 145/457 373/453 1712 | f 547/458 546/459 374/460 1713 | f 378/461 377/462 546/459 1714 | f 548/463 546/459 377/462 1715 | f 549/464 547/458 374/460 1716 | f 376/465 551/466 550/467 1717 | f 375/468 149/469 549/464 1718 | f 550/467 549/464 149/469 1719 | f 551/466 377/462 378/461 1720 | f 383/470 554/471 379/472 1721 | f 552/473 379/472 554/471 1722 | f 553/474 382/475 554/471 1723 | f 555/476 383/470 379/472 1724 | f 380/477 151/478 555/476 1725 | f 556/479 555/476 151/478 1726 | f 557/480 382/475 553/474 1727 | f 556/479 381/481 557/480 1728 | f 541/482 384/483 558/484 1729 | f 348/485 541/482 386/486 1730 | f 558/484 379/472 386/486 1731 | f 153/487 558/484 384/483 1732 | f 385/488 559/489 148/490 1733 | f 552/473 148/490 559/489 1734 | f 379/472 552/473 386/486 1735 | f 386/486 559/489 348/485 1736 | f 560/491 561/492 387/493 1737 | f 381/481 390/494 557/480 1738 | f 560/491 557/480 390/494 1739 | f 387/493 154/495 560/491 1740 | f 390/494 381/481 388/496 1741 | f 389/497 388/496 117/498 1742 | f 153/487 384/483 528/499 1743 | f 388/496 151/478 117/498 1744 | f 527/500 117/498 151/478 1745 | f 391/501 151/478 380/477 1746 | f 153/487 391/501 380/477 1747 | f 538/502 562/503 387/493 1748 | f 563/504 536/505 385/488 1749 | f 382/475 392/506 554/471 1750 | f 563/504 554/471 392/506 1751 | f 385/488 148/490 563/504 1752 | f 154/495 387/493 562/503 1753 | f 562/503 392/506 382/475 1754 | f 339/507 394/508 540/509 1755 | f 540/509 564/510 393/511 1756 | f 105/512 147/513 565/514 1757 | f 394/508 339/507 565/514 1758 | f 377/462 566/515 548/463 1759 | f 548/463 565/514 147/513 1760 | f 152/516 393/511 564/510 1761 | f 566/515 377/462 564/510 1762 | f 532/517 395/518 567/519 1763 | f 396/520 567/519 374/460 1764 | f 150/521 567/519 395/518 1765 | f 374/460 546/459 396/520 1766 | f 568/522 396/520 546/459 1767 | f 568/522 147/513 531/523 1768 | f 105/512 531/523 147/513 1769 | f 397/524 114/525 569/526 1770 | f 525/527 569/526 114/525 1771 | f 570/528 524/529 393/511 1772 | f 570/528 376/465 398/530 1773 | f 393/511 152/516 570/528 1774 | f 550/467 569/526 376/465 1775 | f 398/530 376/465 569/526 1776 | f 572/531 395/518 571/532 1777 | f 573/533 574/534 397/524 1778 | f 114/525 397/524 574/534 1779 | f 375/468 400/535 149/469 1780 | f 573/533 149/469 400/535 1781 | f 395/518 572/531 150/521 1782 | f 572/531 400/535 375/468 1783 | f 544/450 371/452 437/536 1784 | f 371/452 141/442 365/441 1785 | f 404/537 365/441 401/538 1786 | f 575/539 403/540 402/541 1787 | f 404/537 402/541 403/540 1788 | f 405/542 408/543 160/544 1789 | f 161/545 406/546 576/547 1790 | f 405/542 161/545 576/547 1791 | f 407/548 408/543 577/549 1792 | f 157/550 577/549 408/543 1793 | f 157/550 576/547 406/546 1794 | f 410/551 402/552 406/546 1795 | f 410/551 161/545 158/553 1796 | f 406/546 161/545 410/551 1797 | f 409/554 575/555 410/551 1798 | f 402/552 410/551 575/555 1799 | f 413/556 578/557 158/553 1800 | f 413/556 161/545 405/542 1801 | f 158/553 161/545 413/556 1802 | f 160/544 411/558 579/559 1803 | f 579/559 413/556 405/542 1804 | f 159/560 412/561 578/557 1805 | f 411/558 159/560 579/559 1806 | f 414/562 125/563 69/564 1807 | f 415/565 416/566 76/567 1808 | f 79/568 76/567 416/566 1809 | f 356/569 130/570 417/571 1810 | f 80/572 79/568 417/571 1811 | f 67/573 418/574 419/575 1812 | f 574/576 399/577 419/575 1813 | f 399/577 571/578 419/575 1814 | f 421/579 74/580 420/581 1815 | f 77/582 420/581 74/580 1816 | f 389/583 421/579 561/584 1817 | f 76/567 125/563 415/565 1818 | f 414/562 422/585 126/434 1819 | f 126/434 352/420 414/562 1820 | f 140/586 138/587 581/588 1821 | f 422/589 581/588 138/587 1822 | f 580/590 70/240 282/239 1823 | f 427/591 582/592 288/254 1824 | f 424/593 143/594 425/248 1825 | f 288/254 425/248 285/245 1826 | f 142/451 427/591 146/456 1827 | f 78/595 123/596 337/597 1828 | f 77/582 428/390 420/581 1829 | f 533/378 290/598 419/575 1830 | f 68/599 419/575 290/598 1831 | f 332/376 429/600 533/378 1832 | f 429/600 58/601 290/598 1833 | f 61/602 58/601 115/375 1834 | f 431/603 61/602 335/379 1835 | f 363/433 431/603 127/432 1836 | f 583/604 431/603 363/433 1837 | f 583/604 430/605 292/606 1838 | f 144/445 583/607 139/443 1839 | f 430/608 63/268 62/270 1840 | f 433/609 296/276 63/268 1841 | f 63/268 144/445 433/609 1842 | f 145/457 584/610 369/448 1843 | f 433/609 369/448 584/610 1844 | f 432/611 64/275 584/610 1845 | f 64/275 432/611 520/279 1846 | f 434/612 432/611 372/455 1847 | f 426/253 434/612 146/456 1848 | f 434/612 426/253 299/277 1849 | f 301/282 585/613 71/281 1850 | f 423/614 580/590 585/613 1851 | f 435/615 585/613 301/282 1852 | f 586/616 435/615 587/617 1853 | f 577/618 586/616 407/619 1854 | f 585/613 581/588 423/614 1855 | f 581/588 586/616 401/620 1856 | f 582/592 437/536 424/593 1857 | f 165/621 162/622 164/623 1858 | f 440/624 441/625 168/626 1859 | f 166/627 443/628 172/629 1860 | f 171/630 172/629 443/628 1861 | f 167/631 166/627 442/632 1862 | f 441/625 169/633 444/634 1863 | f 173/635 172/629 170/636 1864 | f 409/554 158/553 450/637 1865 | f 578/557 450/637 158/553 1866 | f 170/638 412/561 447/639 1867 | f 172/640 173/641 448/642 1868 | f 159/560 173/641 447/639 1869 | f 172/640 448/642 156/643 1870 | f 448/642 160/544 408/543 1871 | f 587/617 442/644 172/645 1872 | f 172/645 156/646 587/617 1873 | f 72/288 315/316 167/647 1874 | f 587/617 435/615 167/647 1875 | f 523/325 425/248 143/594 1876 | f 316/321 523/325 449/648 1877 | f 444/649 143/594 168/650 1878 | f 444/649 169/651 449/648 1879 | f 66/323 449/648 169/651 1880 | f 73/315 66/327 445/652 1881 | f 169/653 445/652 66/327 1882 | f 73/315 167/647 315/316 1883 | f 436/654 168/650 143/594 1884 | f 170/655 168/650 446/656 1885 | f 450/657 446/656 168/650 1886 | f 440/624 439/658 163/659 1887 | f 439/658 440/624 171/630 1888 | f 439/658 171/630 165/621 1889 | f 169/633 441/625 164/623 1890 | f 438/660 164/623 441/625 1891 | f 165/621 171/630 443/628 1892 | f 443/628 166/627 162/622 1893 | f 118/661 176/662 328/663 1894 | f 451/664 328/663 176/662 1895 | f 98/343 175/665 321/344 1896 | f 67/339 97/341 418/666 1897 | f 174/667 418/666 97/341 1898 | f 326/668 453/669 174/667 1899 | f 326/668 176/662 118/661 1900 | f 176/662 454/670 451/664 1901 | f 321/344 451/664 454/670 1902 | f 75/346 454/670 322/348 1903 | f 97/341 454/670 174/667 1904 | f 131/388 537/386 112/408 1905 | f 177/671 112/408 537/386 1906 | f 177/671 537/386 338/384 1907 | f 338/384 337/597 177/671 1908 | f 455/672 177/671 130/570 1909 | f 455/672 130/570 108/427 1910 | f 101/673 417/571 178/674 1911 | f 104/675 178/674 179/676 1912 | f 6/2 180/5 183/3 1913 | f 183/3 320/8 456/6 1914 | f 10/677 456/6 320/8 1915 | f 16/678 182/1 457/9 1916 | f 183/3 457/9 182/1 1917 | f 458/11 6/2 184/679 1918 | f 18/680 459/12 184/679 1919 | f 458/11 184/679 459/12 1920 | f 458/11 460/15 319/13 1921 | f 13/681 319/13 460/15 1922 | f 1/682 461/17 24/25 1923 | f 463/16 24/25 461/17 1924 | f 462/18 188/21 463/16 1925 | f 12/683 464/20 465/22 1926 | f 462/18 465/22 464/20 1927 | f 291/259 11/24 188/21 1928 | f 466/28 467/29 23/80 1929 | f 468/32 470/34 2/30 1930 | f 192/684 469/35 468/32 1931 | f 193/36 469/35 19/257 1932 | f 192/684 19/257 469/35 1933 | f 20/685 471/37 193/36 1934 | f 24/25 472/40 1/682 1935 | f 197/42 1/682 472/40 1936 | f 472/40 24/25 7/38 1937 | f 197/42 472/40 195/39 1938 | f 15/45 197/42 195/39 1939 | f 16/678 473/41 196/43 1940 | f 196/43 197/42 15/45 1941 | f 16/678 196/43 182/1 1942 | f 199/44 182/1 196/43 1943 | f 199/44 196/43 15/45 1944 | f 30/48 5/58 200/57 1945 | f 200/57 198/47 30/48 1946 | f 32/46 198/47 200/57 1947 | f 201/49 15/45 195/39 1948 | f 204/50 202/51 17/53 1949 | f 18/680 203/52 474/54 1950 | f 17/53 202/51 474/54 1951 | f 8/55 204/50 205/56 1952 | f 205/56 17/53 29/59 1953 | f 32/46 29/59 17/53 1954 | f 32/46 200/57 29/59 1955 | f 199/44 184/679 6/2 1956 | f 203/52 184/679 199/44 1957 | f 199/44 32/46 203/52 1958 | f 18/680 184/679 203/52 1959 | f 207/62 208/65 3/60 1960 | f 207/62 22/61 206/63 1961 | f 207/62 210/69 31/66 1962 | f 9/68 31/66 210/69 1963 | f 212/72 211/71 25/75 1964 | f 9/68 209/67 28/76 1965 | f 28/76 25/75 211/71 1966 | f 213/79 5/58 31/66 1967 | f 30/48 31/66 5/58 1968 | f 9/68 213/79 31/66 1969 | f 29/59 214/77 205/56 1970 | f 211/71 214/77 28/76 1971 | f 466/28 216/82 190/26 1972 | f 3/60 190/26 216/82 1973 | f 3/60 216/82 22/61 1974 | f 190/26 3/60 7/38 1975 | f 213/79 28/76 214/77 1976 | f 5/58 213/79 214/77 1977 | f 201/49 208/65 30/48 1978 | f 217/81 219/83 466/28 1979 | f 35/686 475/84 217/81 1980 | f 219/83 217/81 218/85 1981 | f 218/85 34/687 219/83 1982 | f 476/86 219/83 34/687 1983 | f 220/99 475/688 35/93 1984 | f 218/91 475/688 222/87 1985 | f 220/99 222/87 475/688 1986 | f 37/88 222/87 220/99 1987 | f 221/89 36/90 222/87 1988 | f 225/95 220/99 35/93 1989 | f 225/95 223/96 224/100 1990 | f 477/98 224/100 223/96 1991 | f 37/88 224/100 228/108 1992 | f 229/101 228/108 224/100 1993 | f 226/107 478/102 41/97 1994 | f 477/98 41/97 478/102 1995 | f 479/104 480/106 42/105 1996 | f 229/101 478/102 479/104 1997 | f 38/252 481/109 227/103 1998 | f 481/109 229/101 479/104 1999 | f 43/165 482/113 485/111 2000 | f 234/119 484/114 483/110 2001 | f 485/111 483/110 484/114 2002 | f 231/117 483/110 48/164 2003 | f 230/112 48/164 483/110 2004 | f 234/119 483/110 486/116 2005 | f 232/118 486/116 45/120 2006 | f 233/115 487/121 46/174 2007 | f 487/121 484/114 234/119 2008 | f 235/129 488/122 44/141 2009 | f 489/124 44/141 488/122 2010 | f 239/123 488/122 491/126 2011 | f 490/127 491/126 488/122 2012 | f 236/128 47/133 491/126 2013 | f 492/132 239/123 491/126 2014 | f 238/125 492/132 49/142 2015 | f 237/131 49/142 492/132 2016 | f 18/689 474/136 241/138 2017 | f 493/137 474/136 242/135 2018 | f 494/139 202/134 240/140 2019 | f 2/690 240/140 202/134 2020 | f 494/139 489/124 242/135 2021 | f 238/125 49/142 493/137 2022 | f 20/691 495/145 245/144 2023 | f 246/149 496/143 243/692 2024 | f 495/145 243/692 496/143 2025 | f 243/692 497/146 246/149 2026 | f 244/148 246/149 497/146 2027 | f 236/128 244/148 47/133 2028 | f 490/127 50/130 496/143 2029 | f 18/689 241/138 459/150 2030 | f 247/151 185/693 49/142 2031 | f 459/150 49/142 185/693 2032 | f 47/133 460/152 247/151 2033 | f 185/693 247/151 460/152 2034 | f 20/691 245/144 471/153 2035 | f 194/694 471/153 248/155 2036 | f 498/154 248/155 471/153 2037 | f 235/129 44/141 499/156 2038 | f 2/690 470/157 240/140 2039 | f 470/157 194/694 499/156 2040 | f 248/155 499/156 194/694 2041 | f 16/695 249/159 473/158 2042 | f 500/160 250/162 473/158 2043 | f 230/112 500/160 48/164 2044 | f 250/162 500/160 501/163 2045 | f 501/163 482/113 250/162 2046 | f 502/166 250/162 482/113 2047 | f 502/166 1/167 197/161 2048 | f 251/170 12/696 465/168 2049 | f 187/697 252/173 465/168 2050 | f 503/169 465/168 252/173 2051 | f 461/172 504/171 187/697 2052 | f 252/173 187/697 504/171 2053 | f 485/111 504/171 43/165 2054 | f 233/115 46/174 503/169 2055 | f 181/698 456/178 254/179 2056 | f 505/176 254/179 456/178 2057 | f 253/175 45/120 505/176 2058 | f 231/117 48/164 506/180 2059 | f 16/695 457/181 249/159 2060 | f 254/179 506/180 181/698 2061 | f 457/181 181/698 506/180 2062 | f 12/696 251/170 508/183 2063 | f 256/184 255/699 507/182 2064 | f 508/183 507/182 255/699 2065 | f 487/121 507/182 46/174 2066 | f 253/175 509/185 45/120 2067 | f 232/118 45/120 509/185 2068 | f 509/185 510/186 256/184 2069 | f 255/699 256/184 510/186 2070 | f 38/252 304/187 481/109 2071 | f 260/191 228/108 257/190 2072 | f 304/187 257/190 228/108 2073 | f 51/700 511/188 257/190 2074 | f 258/189 53/701 260/191 2075 | f 259/192 260/191 53/701 2076 | f 36/90 221/89 259/192 2077 | f 221/89 228/108 260/191 2078 | f 52/313 261/199 264/195 2079 | f 513/198 264/195 53/196 2080 | f 263/202 513/198 57/201 2081 | f 264/195 513/198 512/193 2082 | f 53/196 258/204 262/197 2083 | f 262/197 267/203 57/201 2084 | f 51/702 265/206 511/205 2085 | f 267/203 511/205 265/206 2086 | f 54/207 266/210 267/203 2087 | f 266/210 57/201 267/203 2088 | f 515/212 270/209 55/213 2089 | f 512/193 515/212 56/194 2090 | f 270/209 515/212 263/202 2091 | f 263/202 57/201 266/210 2092 | f 263/202 266/210 270/209 2093 | f 206/63 271/216 21/64 2094 | f 206/63 272/214 271/216 2095 | f 33/70 273/217 25/75 2096 | f 25/75 79/219 212/72 2097 | f 80/220 26/74 212/72 2098 | f 275/703 67/223 274/222 2099 | f 464/20 12/683 274/222 2100 | f 508/225 274/222 12/683 2101 | f 274/222 510/226 275/703 2102 | f 10/704 275/703 510/226 2103 | f 276/705 278/227 74/229 2104 | f 278/227 276/705 497/231 2105 | f 13/706 497/231 276/705 2106 | f 277/228 278/227 20/685 2107 | f 495/233 20/685 278/227 2108 | f 76/218 273/217 69/215 2109 | f 271/216 273/217 33/70 2110 | f 280/235 70/707 281/234 2111 | f 279/708 281/234 70/707 2112 | f 69/215 272/214 279/708 2113 | f 281/234 279/708 272/214 2114 | f 476/86 281/234 22/61 2115 | f 516/237 71/281 282/239 2116 | f 280/241 284/238 282/239 2117 | f 284/238 36/242 283/236 2118 | f 287/246 285/245 65/249 2119 | f 65/249 286/250 287/246 2120 | f 426/253 289/255 60/280 2121 | f 38/252 227/103 287/246 2122 | f 42/105 287/246 227/103 2123 | f 289/255 59/247 42/105 2124 | f 277/228 193/36 77/230 2125 | f 20/685 193/36 277/228 2126 | f 291/259 464/20 290/258 2127 | f 11/24 291/259 58/260 2128 | f 58/260 61/264 517/261 2129 | f 191/27 11/24 517/261 2130 | f 23/80 467/29 191/27 2131 | f 517/261 518/262 294/265 2132 | f 518/262 292/263 293/266 2133 | f 62/709 293/266 292/263 2134 | f 35/686 217/81 519/267 2135 | f 518/262 519/267 217/81 2136 | f 191/27 294/265 23/80 2137 | f 519/272 293/271 40/94 2138 | f 295/269 40/94 293/271 2139 | f 298/274 295/269 296/276 2140 | f 63/268 296/276 295/269 2141 | f 41/97 298/274 297/273 2142 | f 223/96 40/94 298/274 2143 | f 300/278 297/273 520/279 2144 | f 64/275 520/279 297/273 2145 | f 289/255 42/105 480/106 2146 | f 60/280 480/106 300/278 2147 | f 226/107 300/278 480/106 2148 | f 516/237 283/236 302/283 2149 | f 259/284 283/236 36/242 2150 | f 302/283 283/236 521/285 2151 | f 53/710 514/286 259/284 2152 | f 521/285 259/284 514/286 2153 | f 522/289 521/285 52/318 2154 | f 261/287 52/318 521/285 2155 | f 301/282 302/283 72/288 2156 | f 39/251 303/328 286/250 2157 | f 304/187 286/250 303/328 2158 | f 257/190 304/187 51/700 2159 | f 303/328 51/700 304/187 2160 | f 305/333 306/334 84/290 2161 | f 82/332 306/334 305/333 2162 | f 306/334 83/291 84/290 2163 | f 87/294 308/293 90/306 2164 | f 91/296 90/306 308/293 2165 | f 82/332 308/293 307/295 2166 | f 310/301 92/298 85/299 2167 | f 87/294 311/302 307/295 2168 | f 85/299 89/303 86/300 2169 | f 92/298 90/306 91/296 2170 | f 312/308 90/307 93/312 2171 | f 55/213 268/208 312/308 2172 | f 313/711 90/307 268/208 2173 | f 268/208 54/207 313/711 2174 | f 317/309 313/711 54/207 2175 | f 51/702 317/309 265/206 2176 | f 264/195 314/311 52/313 2177 | f 314/311 56/194 269/211 2178 | f 314/311 269/211 93/312 2179 | f 55/213 93/312 269/211 2180 | f 86/314 315/316 310/319 2181 | f 72/288 522/289 315/316 2182 | f 315/316 522/289 310/319 2183 | f 311/320 39/251 316/321 2184 | f 39/251 523/325 316/321 2185 | f 88/326 73/315 86/314 2186 | f 87/324 317/329 303/328 2187 | f 51/700 303/328 317/329 2188 | f 306/334 82/332 307/295 2189 | f 85/299 81/292 89/303 2190 | f 81/292 83/291 89/303 2191 | f 309/297 84/290 81/292 2192 | f 13/712 95/345 319/713 2193 | f 318/338 319/713 95/345 2194 | f 186/336 319/713 318/338 2195 | f 276/714 95/345 13/712 2196 | f 74/715 98/343 276/714 2197 | f 276/714 98/343 95/345 2198 | f 275/340 10/716 94/347 2199 | f 275/340 94/347 97/341 2200 | f 10/716 320/349 94/347 2201 | f 180/342 96/337 320/349 2202 | f 322/348 94/347 320/349 2203 | f 318/338 95/345 321/344 2204 | f 192/684 99/350 100/717 2205 | f 100/717 19/257 192/684 2206 | f 192/684 468/32 99/350 2207 | f 8/55 215/78 99/350 2208 | f 100/717 99/350 26/74 2209 | f 215/78 26/74 99/350 2210 | f 26/74 101/718 100/717 2211 | f 26/74 80/220 101/718 2212 | f 102/352 78/256 19/257 2213 | f 323/351 19/257 100/717 2214 | f 323/351 100/717 103/719 2215 | f 323/351 103/719 104/353 2216 | f 103/719 100/717 101/718 2217 | f 120/720 524/358 324/354 2218 | f 327/355 324/354 524/358 2219 | f 327/355 525/361 453/359 2220 | f 114/721 453/359 525/361 2221 | f 110/356 327/355 326/360 2222 | f 526/364 330/722 110/356 2223 | f 526/364 452/367 527/365 2224 | f 117/723 527/365 452/367 2225 | f 122/724 330/722 528/368 2226 | f 526/364 528/368 330/722 2227 | f 105/725 128/374 531/371 2228 | f 529/369 531/371 128/374 2229 | f 530/370 529/369 332/376 2230 | f 429/600 332/376 115/375 2231 | f 116/726 532/377 533/378 2232 | f 530/370 533/378 532/377 2233 | f 535/382 127/432 534/380 2234 | f 537/386 106/387 536/385 2235 | f 124/727 428/390 538/389 2236 | f 428/390 337/597 338/384 2237 | f 339/393 539/395 105/725 2238 | f 128/374 105/725 539/395 2239 | f 120/720 340/392 540/391 2240 | f 340/392 119/399 339/393 2241 | f 119/399 341/396 339/393 2242 | f 539/395 111/394 128/374 2243 | f 339/393 341/396 539/395 2244 | f 342/397 119/399 340/392 2245 | f 120/720 324/354 340/392 2246 | f 342/397 340/392 324/354 2247 | f 134/401 344/411 109/412 2248 | f 344/411 134/401 343/398 2249 | f 136/400 344/411 343/398 2250 | f 345/402 341/396 119/399 2251 | f 346/403 121/407 348/404 2252 | f 122/724 541/406 347/405 2253 | f 121/407 541/406 348/404 2254 | f 121/407 346/403 349/409 2255 | f 112/408 349/409 346/403 2256 | f 136/400 121/407 133/410 2257 | f 136/400 133/410 344/411 2258 | f 342/397 110/356 330/722 2259 | f 347/405 342/397 330/722 2260 | f 122/724 347/405 330/722 2261 | f 342/397 347/405 136/400 2262 | f 353/415 107/429 350/413 2263 | f 352/420 353/415 351/416 2264 | f 126/434 353/415 352/420 2265 | f 125/563 352/420 137/424 2266 | f 354/417 137/424 352/420 2267 | f 113/419 355/418 135/414 2268 | f 351/416 135/414 355/418 2269 | f 130/570 356/569 108/427 2270 | f 356/569 129/421 108/427 2271 | f 132/423 108/427 129/421 2272 | f 113/419 357/422 354/417 2273 | f 358/428 135/414 109/412 2274 | f 113/419 135/414 358/428 2275 | f 134/401 109/412 135/414 2276 | f 133/410 349/409 360/425 2277 | f 349/409 359/426 132/423 2278 | f 535/382 334/381 361/430 2279 | f 107/429 361/430 334/381 2280 | f 334/381 111/394 107/429 2281 | f 126/434 361/430 353/415 2282 | f 107/429 353/415 361/430 2283 | f 358/428 132/423 357/422 2284 | f 109/412 360/425 358/428 2285 | f 345/402 134/401 350/413 2286 | f 363/433 535/382 364/431 2287 | f 362/436 364/431 138/728 2288 | f 126/434 138/728 364/431 2289 | f 139/729 363/433 542/435 2290 | f 364/431 362/436 363/433 2291 | f 366/446 139/443 542/730 2292 | f 366/446 542/730 367/437 2293 | f 362/438 367/437 542/730 2294 | f 365/441 367/437 140/439 2295 | f 141/442 366/446 367/437 2296 | f 370/444 139/443 366/446 2297 | f 370/444 368/447 369/448 2298 | f 145/457 369/448 368/447 2299 | f 141/442 371/452 368/447 2300 | f 373/453 368/447 371/452 2301 | f 543/449 373/453 544/450 2302 | f 543/449 146/456 372/455 2303 | f 373/453 543/449 545/454 2304 | f 372/455 145/457 545/454 2305 | f 147/513 546/459 548/463 2306 | f 546/459 547/458 378/461 2307 | f 375/468 549/464 150/521 2308 | f 374/460 150/521 549/464 2309 | f 378/461 547/458 549/464 2310 | f 378/461 549/464 551/466 2311 | f 550/467 551/466 549/464 2312 | f 377/462 551/466 152/516 2313 | f 376/465 152/516 551/466 2314 | f 148/490 552/473 554/471 2315 | f 554/471 383/470 553/474 2316 | f 380/477 555/476 153/487 2317 | f 379/472 153/487 555/476 2318 | f 381/481 556/479 151/478 2319 | f 555/476 556/479 383/470 2320 | f 382/475 557/480 154/495 2321 | f 383/470 556/479 553/474 2322 | f 557/480 553/474 556/479 2323 | f 122/731 384/483 541/482 2324 | f 558/484 386/486 541/482 2325 | f 379/472 558/484 153/487 2326 | f 559/489 386/486 552/473 2327 | f 559/489 385/488 348/485 2328 | f 106/732 348/485 385/488 2329 | f 124/733 387/493 561/492 2330 | f 390/494 389/497 560/491 2331 | f 561/492 560/491 389/497 2332 | f 557/480 560/491 154/495 2333 | f 381/481 151/478 388/496 2334 | f 388/496 389/497 390/494 2335 | f 122/731 528/499 384/483 2336 | f 391/501 153/487 329/734 2337 | f 528/499 329/734 153/487 2338 | f 329/734 527/500 391/501 2339 | f 151/478 391/501 527/500 2340 | f 124/733 538/502 387/493 2341 | f 336/735 392/506 538/502 2342 | f 562/503 538/502 392/506 2343 | f 106/732 385/488 536/505 2344 | f 536/505 563/504 336/735 2345 | f 392/506 336/735 563/504 2346 | f 554/471 563/504 148/490 2347 | f 382/475 154/495 562/503 2348 | f 120/736 540/509 393/511 2349 | f 564/510 540/509 394/508 2350 | f 565/514 339/507 105/512 2351 | f 565/514 548/463 394/508 2352 | f 566/515 394/508 548/463 2353 | f 377/462 152/516 564/510 2354 | f 394/508 566/515 564/510 2355 | f 395/518 532/517 116/737 2356 | f 333/738 532/517 396/520 2357 | f 567/519 396/520 532/517 2358 | f 374/460 567/519 150/521 2359 | f 546/459 147/513 568/522 2360 | f 531/523 333/738 568/522 2361 | f 396/520 568/522 333/738 2362 | f 569/526 525/527 398/530 2363 | f 325/739 398/530 525/527 2364 | f 120/736 393/511 524/529 2365 | f 398/530 325/739 570/528 2366 | f 524/529 570/528 325/739 2367 | f 376/465 570/528 152/516 2368 | f 569/526 550/467 397/524 2369 | f 149/469 397/524 550/467 2370 | f 116/737 571/532 395/518 2371 | f 400/535 572/531 399/740 2372 | f 571/532 399/740 572/531 2373 | f 399/740 574/534 400/535 2374 | f 573/533 400/535 574/534 2375 | f 397/524 149/469 573/533 2376 | f 375/468 150/521 572/531 2377 | f 142/451 544/450 437/536 2378 | f 404/537 403/540 371/452 2379 | f 437/536 371/452 403/540 2380 | f 365/441 404/537 371/452 2381 | f 140/439 401/538 365/441 2382 | f 402/541 404/537 157/741 2383 | f 401/538 157/741 404/537 2384 | f 155/742 403/540 575/539 2385 | f 156/643 408/543 407/548 2386 | f 408/543 405/542 576/547 2387 | f 576/547 157/550 408/543 2388 | f 157/550 406/546 402/552 2389 | f 410/551 158/553 409/554 2390 | f 155/743 575/555 409/554 2391 | f 405/542 160/544 579/559 2392 | f 579/559 159/560 413/556 2393 | f 578/557 413/556 159/560 2394 | f 352/420 125/563 414/562 2395 | f 416/566 415/565 129/421 2396 | f 137/424 129/421 415/565 2397 | f 79/568 416/566 356/569 2398 | f 129/421 356/569 416/566 2399 | f 356/569 417/571 79/568 2400 | f 68/599 67/573 419/575 2401 | f 419/575 418/574 574/576 2402 | f 114/744 574/576 418/574 2403 | f 571/578 116/726 419/575 2404 | f 561/584 421/579 124/727 2405 | f 420/581 124/727 421/579 2406 | f 421/579 389/583 98/745 2407 | f 117/746 98/745 389/583 2408 | f 98/745 74/580 421/579 2409 | f 125/563 76/567 69/564 2410 | f 415/565 125/563 137/424 2411 | f 422/585 414/562 70/747 2412 | f 279/748 70/747 414/562 2413 | f 138/728 126/434 422/585 2414 | f 69/564 279/748 414/562 2415 | f 282/239 71/281 580/590 2416 | f 423/614 422/589 580/590 2417 | f 422/589 423/614 581/588 2418 | f 70/240 580/590 422/589 2419 | f 59/247 288/254 285/245 2420 | f 142/451 582/592 427/591 2421 | f 582/592 424/593 288/254 2422 | f 425/248 288/254 424/593 2423 | f 427/591 288/254 426/253 2424 | f 426/253 146/456 427/591 2425 | f 77/582 78/595 428/390 2426 | f 337/597 428/390 78/595 2427 | f 124/727 420/581 428/390 2428 | f 419/575 116/726 533/378 2429 | f 429/600 290/598 533/378 2430 | f 115/375 58/601 429/600 2431 | f 127/432 335/379 534/380 2432 | f 335/379 61/602 115/375 2433 | f 61/602 431/603 292/606 2434 | f 335/379 127/432 431/603 2435 | f 139/729 583/604 363/433 2436 | f 62/749 292/606 430/605 2437 | f 431/603 583/604 292/606 2438 | f 583/607 144/445 430/608 2439 | f 63/268 430/608 144/445 2440 | f 369/448 433/609 144/445 2441 | f 584/610 145/457 432/611 2442 | f 584/610 64/275 433/609 2443 | f 296/276 433/609 64/275 2444 | f 432/611 434/612 520/279 2445 | f 299/277 520/279 434/612 2446 | f 145/457 372/455 432/611 2447 | f 372/455 146/456 434/612 2448 | f 60/280 299/277 426/253 2449 | f 580/590 71/281 585/613 2450 | f 72/288 435/615 301/282 2451 | f 407/619 586/616 156/646 2452 | f 587/617 156/646 586/616 2453 | f 157/750 401/620 577/618 2454 | f 586/616 577/618 401/620 2455 | f 401/620 140/586 581/588 2456 | f 435/615 586/616 585/613 2457 | f 581/588 585/613 586/616 2458 | f 142/451 437/536 582/592 2459 | f 436/654 437/536 155/742 2460 | f 403/540 155/742 437/536 2461 | f 143/594 424/593 436/654 2462 | f 437/536 436/654 424/593 2463 | f 439/658 165/621 438/660 2464 | f 438/660 165/621 164/623 2465 | f 163/659 439/658 438/660 2466 | f 171/630 440/624 170/636 2467 | f 168/626 170/636 440/624 2468 | f 163/659 441/625 440/624 2469 | f 442/632 166/627 172/629 2470 | f 168/626 441/625 444/634 2471 | f 166/627 167/631 445/751 2472 | f 172/629 171/630 170/636 2473 | f 155/743 409/554 450/637 2474 | f 450/637 578/557 446/752 2475 | f 412/561 446/752 578/557 2476 | f 159/560 447/639 412/561 2477 | f 446/752 412/561 170/638 2478 | f 447/639 173/641 170/638 2479 | f 448/642 173/641 411/558 2480 | f 159/560 411/558 173/641 2481 | f 448/642 411/558 160/544 2482 | f 408/543 156/643 448/642 2483 | f 167/647 442/644 587/617 2484 | f 167/647 435/615 72/288 2485 | f 316/321 449/648 66/323 2486 | f 425/248 523/325 65/249 2487 | f 143/594 449/648 523/325 2488 | f 444/649 449/648 143/594 2489 | f 167/647 73/315 445/652 2490 | f 168/650 436/654 450/657 2491 | f 155/742 450/657 436/654 2492 | f 438/660 441/625 163/659 2493 | f 166/627 445/751 162/622 2494 | f 162/622 445/751 164/623 2495 | f 169/633 164/623 445/751 2496 | f 443/628 162/622 165/621 2497 | f 328/663 451/664 452/753 2498 | f 451/664 175/665 452/753 2499 | f 117/754 452/753 175/665 2500 | f 98/343 117/754 175/665 2501 | f 418/666 174/667 453/669 2502 | f 453/669 114/755 418/666 2503 | f 326/668 174/667 176/662 2504 | f 451/664 321/344 175/665 2505 | f 75/346 321/344 454/670 2506 | f 176/662 174/667 454/670 2507 | f 454/670 97/341 322/348 2508 | f 337/597 179/676 177/671 2509 | f 178/674 177/671 179/676 2510 | f 179/676 337/597 123/596 2511 | f 178/674 130/570 177/671 2512 | f 359/426 455/672 108/427 2513 | f 112/408 177/671 359/426 2514 | f 455/672 359/426 177/671 2515 | f 417/571 101/673 80/572 2516 | f 130/570 178/674 417/571 2517 | f 102/756 123/596 78/595 2518 | f 102/756 179/676 123/596 2519 | f 103/757 101/673 178/674 2520 | f 104/675 179/676 102/756 2521 | f 104/675 103/757 178/674 2522 | -------------------------------------------------------------------------------- /obj/spot100.obj: -------------------------------------------------------------------------------- 1 | # File exported by Houdini 19.5.435 (www.sidefx.com) 2 | # 119 points 3 | # 702 vertices 4 | # 234 primitives 5 | # Bounds: [-0.479814619, -0.721564114, -0.667753637] to [0.475172579, 0.961071491, 1.01403666] 6 | g 7 | v 0.359829545 -0.331479996 -0.0967725068 8 | v 0.249599457 -0.389725298 0.916248381 9 | v 0.296303093 0.148975626 0.138704464 10 | v 0.193690166 0.135300085 0.821777284 11 | v 0.335977733 -0.0371404812 0.729700387 12 | v 0.359230399 -0.377339154 0.185826182 13 | v 0.314433724 -0.080632098 -0.0868335441 14 | v 0.239136934 -0.0202986207 0.908333421 15 | v 0.190317318 0.18710877 0.480037153 16 | v 0.10955511 -0.444277555 0.113936625 17 | v 0.183438525 -0.219386324 -0.153521672 18 | v 0.104938477 -0.364497066 -0.0739640445 19 | v 0.0895884112 -0.477736741 0.676951766 20 | v 0.229002565 -0.440072745 0.490328312 21 | v 0.391795844 -0.0943820849 0.219634026 22 | v 0.339743167 -0.405097425 0.802337408 23 | v 0.31860894 -0.413832158 0.647545695 24 | v -0.000974499038 -0.0560934842 1.01403666 25 | v 0.0681133121 -0.405757755 0.883029997 26 | v 0.188233197 0.303228319 0.243232101 27 | v 0.152382687 0.313512772 -0.00813512038 28 | v 0.134542555 0.105003566 -0.168525532 29 | v 0.00232059928 0.225763023 0.753336608 30 | v 0.201026395 0.186303735 -0.226433679 31 | v 0.232857212 0.432941556 -0.0237637125 32 | v 0.297331244 0.364605457 -0.192146719 33 | v 0.310980707 0.310633421 -0.588252485 34 | v 0.194855437 0.734986663 -0.445575863 35 | v 0.168380514 0.0987348631 -0.464715034 36 | v 0.198615715 0.193915948 -0.629549265 37 | v 0.186317027 0.339405537 -0.652992427 38 | v 0.37647298 -0.573526084 -0.0542360656 39 | v 0.33314389 -0.645037711 0.827892959 40 | v 0.176648408 -0.715627968 0.141567454 41 | v 0.234498829 -0.679205596 -0.115705334 42 | v 0.210786551 -0.721461892 0.679043591 43 | v 0.32621327 -0.69161129 0.114888914 44 | v 0.0901048183 -0.706572413 0.806416512 45 | v 0.275831342 0.603990853 -0.329682827 46 | v 0.172205001 0.757694423 -0.195288166 47 | v 0.244049802 0.563677549 -0.109744743 48 | v 0.434807241 0.729759276 -0.29504025 49 | v 0.475172579 0.730142474 -0.169572175 50 | v 0.418026924 0.608743668 -0.182924747 51 | v -4.62926255e-05 -0.231889293 -0.191482857 52 | v -0.00151088124 0.0195270348 -0.246094733 53 | v 0.0202428568 0.112352408 -0.307376534 54 | v -0.0724443421 0.829235256 -0.296174973 55 | v -0.0043941373 -0.436292112 0.0536187775 56 | v 0.000414728333 0.273325473 0.371536821 57 | v -0.00253356039 0.349024951 0.0454587191 58 | v 0.0104112085 0.496157795 0.0682534277 59 | v -0.00221354468 0.687891543 -0.0191035755 60 | v 0.0664000884 0.836516857 -0.255633384 61 | v 0.000218279354 -0.437559247 0.733991385 62 | v 0.0899844244 -0.53872627 0.446197391 63 | v -1.792886e-05 -0.293188423 0.940995634 64 | v -0.00173045462 0.119892642 0.917304933 65 | v 0.204437509 0.958800673 -0.274499565 66 | v 0.155833453 0.795767665 -0.358606189 67 | v 0.236536503 0.764565885 -0.262405306 68 | v -0.387113929 -0.342712134 -0.0329630785 69 | v -0.346080214 -0.402969182 0.858976662 70 | v -0.265644401 0.204679206 0.139588818 71 | v -0.15202114 0.171487302 0.782620847 72 | v -0.301206201 0.0543364957 0.623399377 73 | v -0.355966061 -0.374679059 0.291858107 74 | v -0.310472637 -0.0911378413 -0.0917874351 75 | v -0.330017895 -0.0633513257 0.786292255 76 | v -0.177042484 0.199663267 0.478859931 77 | v -0.148454189 -0.443483382 0.162738889 78 | v -0.105254784 -0.367718041 -0.0752962753 79 | v -0.148769528 -0.470948905 0.62387085 80 | v -0.245736942 -0.430854231 0.366184443 81 | v -0.392247438 -0.0906549096 0.218455419 82 | v -0.359405845 -0.375197411 0.176439583 83 | v -0.320608139 -0.412212789 0.648878098 84 | v -0.0800084248 -0.390949041 0.902188182 85 | v -0.173990428 0.305050403 0.251231194 86 | v -0.153432101 0.30510655 -0.0136680258 87 | v -0.132726148 0.0938725621 -0.172633365 88 | v -0.195227489 0.16987294 -0.24580352 89 | v -0.241313711 0.435444593 -0.0290155038 90 | v -0.340850204 0.27497834 -0.437948853 91 | v -0.312980384 0.291329861 -0.597838283 92 | v -0.219474792 0.692014277 -0.449794948 93 | v -0.252620399 0.133546889 -0.50690949 94 | v -0.244374126 0.303337157 -0.667753637 95 | v -0.271527648 -0.661026001 -0.121685669 96 | v -0.322947949 -0.67074281 0.819600105 97 | v -0.104909524 -0.696991324 0.0344877988 98 | v -0.209012717 -0.721564114 0.679059386 99 | v -0.244260028 -0.717173815 0.155644476 100 | v -0.171371356 -0.672973335 0.92667383 101 | v -0.261887491 0.654519737 -0.377278298 102 | v -0.163217187 0.762219548 -0.19126983 103 | v -0.243997365 0.564617872 -0.110908322 104 | v -0.423190415 0.665100276 -0.290681601 105 | v -0.479814619 0.719991922 -0.161274642 106 | v -0.172145426 0.961071491 -0.246226996 107 | v -0.167754471 0.800803721 -0.35599488 108 | v -0.219676137 0.756374538 -0.267262042 109 | v -0.300815254 0.772201717 -0.233026817 110 | v -0.148865938 -0.516627431 0.412302762 111 | v -0.201877266 -0.0339500606 0.931980729 112 | v 0.211461663 -0.444035262 0.223197043 113 | v 0.19431442 -0.474597901 0.622548819 114 | v 0.343525559 0.258711785 -0.490304887 115 | v 0.108402804 -0.677795768 0.0185495056 116 | v 0.209141567 -0.675688863 0.924598515 117 | v -0.000360894395 0.798299074 -0.43653813 118 | v -0.269645602 -0.448419243 0.217814922 119 | v -0.145941436 -0.269463718 -0.132250816 120 | v -0.284950048 -0.336525559 -0.118256263 121 | v -0.222596109 -0.392320216 0.926266611 122 | v -0.36424166 -0.655472636 0.038477093 123 | v -0.0908382684 -0.701922357 0.787410498 124 | v -0.0615407526 -0.470413089 0.761756599 125 | v -0.278176039 0.562985539 -0.231994286 126 | vt 0.775262117 0.660416663 0 127 | vt 0.826250911 0.653022826 0 128 | vt 0.832804382 0.667449713 0 129 | vt 0.747710347 0.658327937 0 130 | vt 0.877319515 0.674019873 0 131 | vt 0.853795886 0.661281109 0 132 | vt 0.870944738 0.653824568 0 133 | vt 0.853549242 0.643766999 0 134 | vt 0.94291234 0.67933619 0 135 | vt 0.839582384 0.704307616 0 136 | vt 0.732776046 0.669249892 0 137 | vt 0.749571085 0.672931612 0 138 | vt 0.883581161 0.734296679 0 139 | vt 0.951640487 0.74190712 0 140 | vt 0.896279991 0.777809918 0 141 | vt 0.731064975 0.884031951 0 142 | vt 0.711108029 0.804761231 0 143 | vt 0.82322228 0.797715783 0 144 | vt 0.677914679 0.74385196 0 145 | vt 0.739773929 0.743710101 0 146 | vt 0.972622156 0.69444859 0 147 | vt 0.136611909 0.207993075 0 148 | vt 0.0886544436 0.210263595 0 149 | vt 0.108322583 0.163395226 0 150 | vt 0.235269234 0.212349311 0 151 | vt 0.193045363 0.212443128 0 152 | vt 0.228600949 0.181046128 0 153 | vt 0.167609394 0.159293383 0 154 | vt 0.234832823 0.232765943 0 155 | vt 0.208101839 0.225360125 0 156 | vt 0.144578189 0.916376889 0 157 | vt 0.165098503 0.944203377 0 158 | vt 0.119748034 0.936733484 0 159 | vt 0.862053871 0.950668097 0 160 | vt 0.896891356 0.931659698 0 161 | vt 0.895203471 0.955195963 0 162 | vt 0.933207154 0.973895013 0 163 | vt 0.980852902 0.938212991 0 164 | vt 0.863402128 0.931623876 0 165 | vt 0.871636629 0.901202679 0 166 | vt 0.921838999 0.911422074 0 167 | vt 0.841451824 0.987976849 0 168 | vt 0.79027319 0.950373709 0 169 | vt 0.123493753 0.877635539 0 170 | vt 0.244741529 0.927635968 0 171 | vt 0.184064195 0.968618453 0 172 | vt 0.117093191 0.981071651 0 173 | vt 0.149043128 0.959470987 0 174 | vt 0.0318261497 0.941151679 0 175 | vt 0.122168414 0.957909346 0 176 | vt 0.159269348 0.276831001 0 177 | vt 0.0967305601 0.234459579 0 178 | vt 0.0640325919 0.533910632 0 179 | vt 0.0912370831 0.523316205 0 180 | vt 0.0248493571 0.553985 0 181 | vt 0.887322545 0.845134556 0 182 | vt 0.698163569 0.628344297 0 183 | vt 0.734894991 0.643594682 0 184 | vt 0.718596339 0.651685238 0 185 | vt 0.268196404 0.808906138 0 186 | vt 0.196634635 0.817676246 0 187 | vt 0.134466425 0.74043721 0 188 | vt 0.214684024 0.318190634 0 189 | vt 0.309763342 0.22989139 0 190 | vt 0.325531214 0.304049462 0 191 | vt 0.730746448 0.661194205 0 192 | vt 0.557943821 0.6763708 0 193 | vt 0.837598979 0.630964756 0 194 | vt 0.880037367 0.622294724 0 195 | vt 0.835341156 0.646671355 0 196 | vt 0.95133543 0.636452496 0 197 | vt 0.97754854 0.645052254 0 198 | vt 0.257794023 0.141400024 0 199 | vt 0.120164938 0.662429571 0 200 | vt 0.164385319 0.506344497 0 201 | vt 0.270178407 0.609370112 0 202 | vt 0.0558474585 0.595670879 0 203 | vt 0.121618435 0.534180582 0 204 | vt 0.0958323553 0.55422014 0 205 | vt 0.0756526366 0.485428184 0 206 | vt 0.215043396 0.353874445 0 207 | vt 0.268921018 0.33491236 0 208 | vt 0.248895854 0.394242942 0 209 | vt 0.291315019 0.38235122 0 210 | vt 0.161311448 0.425556719 0 211 | vt 0.0490511656 0.423732251 0 212 | vt 0.215384021 0.405759692 0 213 | vt 0.167543113 0.460114717 0 214 | vt 0.869934916 0.593048871 0 215 | vt 0.739991844 0.619746268 0 216 | vt 0.758739948 0.535846531 0 217 | vt 0.840584695 0.352992028 0 218 | vt 0.804293931 0.340749174 0 219 | vt 0.821351528 0.330095232 0 220 | vt 0.754406214 0.34932223 0 221 | vt 0.881255209 0.325785726 0 222 | vt 0.872089922 0.351567 0 223 | vt 0.860507011 0.341787428 0 224 | vt 0.947690308 0.35668534 0 225 | vt 0.861032248 0.355119884 0 226 | vt 0.943357825 0.318972915 0 227 | vt 0.733834624 0.326941848 0 228 | vt 0.728063107 0.345949292 0 229 | vt 0.729531586 0.272043556 0 230 | vt 0.839515567 0.331222534 0 231 | vt 0.853186309 0.335898161 0 232 | vt 0.843924224 0.294869393 0 233 | vt 0.755557656 0.329450846 0 234 | vt 0.771862268 0.23742564 0 235 | vt 0.717621982 0.18125397 0 236 | vt 0.824380934 0.197256386 0 237 | vt 0.894222498 0.254915535 0 238 | vt 0.973707676 0.303247273 0 239 | vt 0.95079422 0.258181959 0 240 | vt 0.354586065 0.211591184 0 241 | vt 0.327869564 0.222251758 0 242 | vt 0.321410298 0.197164893 0 243 | vt 0.611042082 0.964689732 0 244 | vt 0.611185491 0.942814469 0 245 | vt 0.647929847 0.941733479 0 246 | vt 0.351748407 0.969939888 0 247 | vt 0.282556564 0.918379188 0 248 | vt 0.361708432 0.929653883 0 249 | vt 0.358661801 0.904998899 0 250 | vt 0.387934804 0.90574342 0 251 | vt 0.476825297 0.936346292 0 252 | vt 0.395964175 0.926019371 0 253 | vt 0.416217834 0.89637816 0 254 | vt 0.35594359 0.878978133 0 255 | vt 0.60630846 0.897320926 0 256 | vt 0.526818991 0.936338842 0 257 | vt 0.644897997 0.969379127 0 258 | vt 0.737210751 0.951246798 0 259 | vt 0.679701805 0.904935241 0 260 | vt 0.631902099 0.994515061 0 261 | vt 0.569181621 0.966799855 0 262 | vt 0.403223872 0.258986533 0 263 | vt 0.445367336 0.21150054 0 264 | vt 0.44239229 0.237783447 0 265 | vt 0.449645847 0.55611074 0 266 | vt 0.473470509 0.531025231 0 267 | vt 0.511985123 0.56927973 0 268 | vt 0.508414686 0.532879651 0 269 | vt 0.437299162 0.50251025 0 270 | vt 0.962105334 0.221566841 0 271 | vt 0.895154774 0.217531934 0 272 | vt 0.886463463 0.153342575 0 273 | vt 0.725925803 0.112790637 0 274 | vt 0.838933706 0.351462811 0 275 | vt 0.845579267 0.366201878 0 276 | vt 0.705316663 0.377504855 0 277 | vt 0.725572169 0.34931317 0 278 | vt 0.742952228 0.358922392 0 279 | vt 0.408047378 0.739944994 0 280 | vt 0.341946036 0.820652723 0 281 | vt 0.886478662 0.376015157 0 282 | vt 0.366524786 0.1570746 0 283 | vt 0.263874084 0.71079123 0 284 | vt 0.41751644 0.660686314 0 285 | vt 0.368887335 0.507574677 0 286 | vt 0.434483111 0.380867362 0 287 | vt 0.50946188 0.427728027 0 288 | vt 0.434909493 0.388440728 0 289 | vt 0.429929614 0.576463997 0 290 | vt 0.232677609 0.480821997 0 291 | vt 0.377173096 0.367223203 0 292 | vt 0.323849082 0.354743302 0 293 | vt 0.362134516 0.29424879 0 294 | vt 0.334997296 0.400208354 0 295 | vt 0.377937049 0.430117667 0 296 | vt 0.3590855 0.449728847 0 297 | vt 0.805060685 0.361928046 0 298 | vt 0.776519418 0.432834744 0 299 | vt 0.672996819 0.431688786 0 300 | vt 0.616704404 0.504958749 0 301 | vt 0.896247506 0.427030206 0 302 | vt 0.957254827 0.492238462 0 303 | vt 0.9200598 0.548960865 0 304 | vt 0.658981621 0.266019374 0 305 | vt 0.552434742 0.31525442 0 306 | vt 0.621922255 0.144408435 0 307 | vt 0.73957473 0.649219275 0 308 | vt 0.629135609 0.872347534 0 309 | vt 0.741397142 0.650009811 0 310 | vt 0.959360898 0.77752018 0 311 | vt 0.0918129385 0.390835315 0 312 | vt 0.157815248 0.362271518 0 313 | vt 0.645507634 0.536116958 0 314 | vt 0.838615358 0.340533614 0 315 | vt 0.430391192 0.163775533 0 316 | vt 0.427870721 0.961369514 0 317 | vt 0.496688783 0.519100368 0 318 | vt 0.740080953 0.351845324 0 319 | vt 0.753158391 0.351922423 0 320 | vt 0.982095301 0.361898601 0 321 | vt 0.455266505 0.483197451 0 322 | vt 0.305442661 0.46026808 0 323 | g 324 | f 14/1 106/2 6/3 325 | f 6/3 107/4 14/1 326 | f 7/5 1/6 11/7 327 | f 12/8 11/7 1/6 328 | f 11/7 22/9 7/5 329 | f 7/5 15/10 1/6 330 | f 16/11 17/12 15/10 331 | f 3/13 21/14 20/15 332 | f 23/16 4/17 9/18 333 | f 8/19 5/20 4/17 334 | f 4/17 5/20 9/18 335 | f 3/13 15/10 7/5 336 | f 24/21 21/14 22/9 337 | f 26/22 25/23 21/24 338 | f 30/25 108/26 29/27 339 | f 108/26 26/22 24/28 340 | f 31/29 27/30 30/25 341 | f 32/31 37/32 35/33 342 | f 110/34 36/35 33/36 343 | f 16/37 33/36 17/38 344 | f 36/35 17/38 33/36 345 | f 38/39 13/40 36/35 346 | f 107/41 36/35 13/40 347 | f 2/42 19/43 110/34 348 | f 38/39 110/34 19/43 349 | f 110/34 33/36 2/42 350 | f 1/44 6/45 32/31 351 | f 35/33 1/44 32/31 352 | f 106/46 10/47 34/48 353 | f 37/32 6/45 106/46 354 | f 12/49 35/33 109/50 355 | f 109/50 34/48 10/47 356 | f 39/51 41/52 26/22 357 | f 44/53 43/54 41/55 358 | f 21/14 50/56 20/15 359 | f 57/57 55/58 19/59 360 | f 51/60 21/61 25/62 361 | f 27/30 31/29 28/63 362 | f 88/64 86/65 31/29 363 | f 57/57 2/66 18/67 364 | f 49/68 45/69 10/70 365 | f 10/70 45/69 12/8 366 | f 46/71 11/7 45/69 367 | f 22/9 46/71 47/72 368 | f 29/27 24/28 47/73 369 | f 30/25 88/64 31/29 370 | f 41/74 40/75 53/76 371 | f 39/77 61/78 42/79 372 | f 40/80 41/55 43/54 373 | f 43/54 42/79 61/78 374 | f 60/81 111/82 54/83 375 | f 48/84 54/83 111/82 376 | f 59/85 40/86 60/87 377 | f 54/88 59/85 60/87 378 | f 106/89 14/90 56/91 379 | f 16/11 8/19 2/66 380 | f 71/92 74/93 67/94 381 | f 67/94 74/93 73/95 382 | f 68/96 113/97 114/98 383 | f 113/97 68/96 46/99 384 | f 72/100 114/98 113/97 385 | f 46/99 68/96 81/101 386 | f 63/102 115/103 69/104 387 | f 76/105 67/94 62/106 388 | f 68/96 62/106 75/107 389 | f 77/108 63/102 69/104 390 | f 75/107 69/104 66/109 391 | f 69/104 75/107 77/108 392 | f 65/110 70/111 66/109 393 | f 69/104 65/110 66/109 394 | f 68/96 75/107 64/112 395 | f 82/113 81/101 80/114 396 | f 84/115 85/116 87/117 397 | f 93/118 116/119 89/120 398 | f 63/121 77/122 90/123 399 | f 92/124 90/123 77/122 400 | f 117/125 78/126 94/127 401 | f 118/128 117/125 73/129 402 | f 117/125 92/124 73/129 403 | f 63/121 90/123 94/127 404 | f 116/119 62/130 89/120 405 | f 93/118 76/131 116/119 406 | f 91/132 89/120 72/133 407 | f 62/130 114/134 89/120 408 | f 91/132 71/135 93/118 409 | f 112/136 93/118 71/135 410 | f 93/118 112/136 76/131 411 | f 119/137 83/138 97/139 412 | f 99/140 98/141 97/142 413 | f 97/142 98/141 119/143 414 | f 99/140 103/144 98/141 415 | f 51/145 79/146 50/147 416 | f 70/111 23/148 50/147 417 | f 71/149 72/100 49/150 418 | f 57/151 78/152 55/153 419 | f 50/147 79/146 70/111 420 | f 80/114 79/146 51/145 421 | f 51/60 83/154 80/155 422 | f 85/116 86/65 88/64 423 | f 113/97 45/156 49/150 424 | f 82/157 29/27 47/73 425 | f 88/64 30/25 87/117 426 | f 83/154 52/158 53/76 427 | f 97/159 53/76 96/160 428 | f 103/161 96/162 102/163 429 | f 96/164 99/140 97/142 430 | f 53/76 54/165 96/160 431 | f 102/166 101/167 95/168 432 | f 101/169 102/163 100/170 433 | f 48/171 101/169 100/170 434 | f 102/163 96/162 100/170 435 | f 74/172 104/173 73/174 436 | f 55/175 73/174 56/91 437 | f 71/176 49/177 10/178 438 | f 10/178 104/173 71/176 439 | f 105/179 69/104 115/103 440 | f 115/103 18/180 105/179 441 | f 105/179 58/181 65/110 442 | f 107/4 6/3 17/12 443 | f 13/182 14/1 107/4 444 | f 6/3 1/6 15/10 445 | f 8/19 16/11 5/20 446 | f 15/10 5/20 16/11 447 | f 6/3 15/10 17/12 448 | f 20/15 9/18 3/13 449 | f 15/10 3/13 5/20 450 | f 9/18 5/20 3/13 451 | f 22/9 21/14 7/5 452 | f 3/13 7/5 21/14 453 | f 21/24 24/28 26/22 454 | f 24/28 29/27 108/26 455 | f 108/26 30/25 27/30 456 | f 34/48 35/33 37/32 457 | f 109/50 35/33 34/48 458 | f 36/35 110/34 38/39 459 | f 2/42 33/36 16/37 460 | f 19/43 13/40 38/39 461 | f 17/38 36/35 107/41 462 | f 37/32 32/31 6/45 463 | f 1/44 35/33 12/49 464 | f 34/48 37/32 106/46 465 | f 12/49 109/50 10/47 466 | f 27/30 39/51 108/26 467 | f 25/23 26/22 41/52 468 | f 26/22 108/26 39/51 469 | f 41/55 39/77 44/53 470 | f 42/79 44/53 39/77 471 | f 42/79 43/54 44/53 472 | f 9/18 50/56 23/16 473 | f 58/183 4/17 23/16 474 | f 19/59 55/58 13/184 475 | f 20/15 50/56 9/18 476 | f 50/56 21/14 51/185 477 | f 51/60 25/62 52/158 478 | f 31/29 111/82 28/63 479 | f 19/59 2/66 57/57 480 | f 11/7 12/8 45/69 481 | f 22/9 11/7 46/71 482 | f 24/21 22/9 47/72 483 | f 52/158 25/62 53/76 484 | f 53/76 25/62 41/74 485 | f 28/63 39/51 27/30 486 | f 40/86 61/186 60/87 487 | f 40/80 43/54 61/78 488 | f 53/76 40/75 54/165 489 | f 60/81 28/63 111/82 490 | f 60/81 61/187 28/63 491 | f 39/51 28/63 61/187 492 | f 40/86 59/85 54/88 493 | f 13/188 55/175 14/90 494 | f 56/91 14/90 55/175 495 | f 56/91 10/178 106/89 496 | f 8/19 18/67 2/66 497 | f 4/17 58/183 8/19 498 | f 18/67 8/19 58/183 499 | f 67/94 76/105 112/189 500 | f 67/94 112/189 71/92 501 | f 73/95 77/108 67/94 502 | f 62/106 68/96 114/98 503 | f 45/156 113/97 46/99 504 | f 78/152 18/180 115/103 505 | f 67/94 75/107 62/106 506 | f 67/94 77/108 75/107 507 | f 80/114 64/112 79/146 508 | f 79/146 64/112 70/111 509 | f 70/111 64/112 66/109 510 | f 75/107 66/109 64/112 511 | f 81/101 68/96 80/114 512 | f 64/112 80/114 68/96 513 | f 80/190 83/138 82/157 514 | f 84/115 82/157 83/138 515 | f 82/157 84/115 87/117 516 | f 93/118 89/120 91/132 517 | f 90/123 92/124 94/127 518 | f 92/124 117/125 94/127 519 | f 78/126 117/125 118/128 520 | f 77/122 73/129 92/124 521 | f 78/126 115/191 94/127 522 | f 63/121 94/127 115/191 523 | f 116/119 76/131 62/130 524 | f 114/134 72/133 89/120 525 | f 72/133 71/135 91/132 526 | f 119/137 95/168 84/115 527 | f 85/116 84/115 95/168 528 | f 83/138 119/137 84/115 529 | f 119/143 98/141 95/192 530 | f 23/148 70/111 65/110 531 | f 65/110 58/181 23/148 532 | f 78/152 118/193 55/153 533 | f 73/194 55/153 118/193 534 | f 83/154 51/60 52/158 535 | f 31/29 86/65 111/82 536 | f 18/180 78/152 57/151 537 | f 49/150 72/100 113/97 538 | f 46/99 81/101 47/195 539 | f 81/101 82/113 47/195 540 | f 29/27 82/157 87/117 541 | f 29/27 87/117 30/25 542 | f 87/117 85/116 88/64 543 | f 83/154 53/76 97/159 544 | f 86/65 85/116 95/168 545 | f 103/144 95/192 98/141 546 | f 95/192 103/144 102/196 547 | f 96/164 103/144 99/140 548 | f 111/82 101/167 48/84 549 | f 86/65 101/167 111/82 550 | f 96/160 54/165 48/197 551 | f 101/167 86/65 95/168 552 | f 96/162 48/171 100/170 553 | f 74/172 71/176 104/173 554 | f 104/173 56/91 73/174 555 | f 104/173 10/178 56/91 556 | f 18/180 58/181 105/179 557 | f 69/104 105/179 65/110 558 | -------------------------------------------------------------------------------- /object.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import os 3 | import time 4 | 5 | import taichi as ti 6 | import numpy as np 7 | from constants import dim, vec, mat, index, use_explicit_method 8 | import trimesh as tm 9 | import pyvista as pv 10 | import tetgen 11 | 12 | Particle = ti.types.struct( 13 | pos=vec, 14 | vel=vec, 15 | vel_g=vec, 16 | vel_next=vec, 17 | acc=vec, 18 | mass=ti.f32, 19 | force=vec, 20 | ref_pos=vec, 21 | implicit_A=mat, 22 | implicit_b=vec 23 | ) 24 | 25 | Mesh = ti.types.struct( 26 | p0=ti.i32, 27 | p1=ti.i32, 28 | p2=ti.i32, 29 | ref=mat 30 | ) 31 | 32 | Element = ti.types.struct( 33 | vertex_indices=index, 34 | volume=ti.f32, 35 | ref=mat 36 | ) 37 | 38 | # side_length = 0.2 # 39 | # subdivisions = 10 # 40 | 41 | @ti.data_oriented 42 | class Object: 43 | 44 | def __init__(self, config): 45 | self.rho = config.get("rho") 46 | # Young's modulus and Poisson's ratio 47 | E, nu = config.get('E'), config.get('nu') 48 | self.mu, self.s_lambda = E / 2 / (1 + nu), E * nu / (1 + nu) / (1 - 2 * nu) 49 | self.E, self.nu = E, nu 50 | self.damping = config.get('damping') 51 | vertices, faces, element_indices, num_sides = self.load_obj(config) 52 | # self.mass = mass 53 | self.particle_cnt = vertices.shape[0] 54 | self.mesh_cnt = faces.shape[0] 55 | self.element_cnt = element_indices.shape[0] 56 | self.meshs = Mesh.field(shape=self.mesh_cnt) 57 | self.elements = Element.field(shape=self.element_cnt) 58 | 59 | self.particles = Particle.field(shape=self.particle_cnt, needs_grad=True) 60 | 61 | self.ti_vertices = ti.Vector.field(dim, ti.f32, shape=vertices.shape[0]) 62 | self.ti_vertices.from_numpy(vertices) 63 | self.ti_faces = ti.Vector.field(3, ti.i32, shape=faces.shape[0]) 64 | self.ti_faces.from_numpy(faces) 65 | self.indices = ti.field(dtype=ti.i32, shape=faces.shape[0] * 3) 66 | self.ti_element = ti.Vector.field(num_sides, ti.i32, shape=element_indices.shape[0]) 67 | self.ti_element.from_numpy(element_indices) 68 | self.phi = ti.field(dtype=ti.f32, shape=faces.shape[0]) 69 | self.U = ti.field(dtype=ti.f32, shape=(), needs_grad=True) 70 | 71 | self.particles_init() 72 | self.mesh_init() 73 | self.elements_init() 74 | 75 | print('Vertex count: {}'.format(self.particle_cnt)) 76 | print('Mesh count: {}'.format(self.mesh_cnt)) 77 | print('Element count: {}'.format(self.element_cnt)) 78 | if use_explicit_method: 79 | return 80 | 81 | # solve linear system 82 | self.matrix_A = ti.Matrix.field(n=dim, m=dim, shape=(self.particle_cnt, self.particle_cnt), dtype=ti.f32) 83 | self.vec_b = ti.Vector.field(n=dim, dtype=ti.f32, shape=self.particle_cnt) 84 | self.vec_x = ti.Vector.field(n=dim, dtype=ti.f32, shape=self.particle_cnt) 85 | self.past_vec_x = ti.Vector.field(n=dim, dtype=ti.f32, shape=self.particle_cnt) 86 | 87 | # use in conjugate gradient 88 | self.vec_d = ti.Vector.field(n=dim, dtype=ti.f32, shape=self.particle_cnt) 89 | self.vec_r = ti.Vector.field(n=dim, dtype=ti.f32, shape=self.particle_cnt) 90 | self.vec_q = ti.Vector.field(n=dim, dtype=ti.f32, shape=self.particle_cnt) 91 | self.matrix_ATA = ti.Matrix.field(n=dim, m=dim, shape=(self.particle_cnt, self.particle_cnt), dtype=ti.f32) 92 | self.matrix_AT = ti.Matrix.field(n=dim, m=dim, shape=(self.particle_cnt, self.particle_cnt), dtype=ti.f32) 93 | self.vec_ATb = ti.Vector.field(n=dim, dtype=ti.f32, shape=self.particle_cnt) 94 | 95 | def construct_2d_mesh(self, config): 96 | side_length = config.get('side_length') 97 | subdivisions = config.get('subdivisions') 98 | x = np.linspace(0, side_length, subdivisions + 1) # 99 | y = np.linspace(0, side_length, subdivisions + 1) # 100 | vertices = np.array(np.meshgrid(x, y)).T.reshape(-1, 2) # 101 | 102 | faces = [] 103 | for i in range(subdivisions): 104 | for j in range(subdivisions): 105 | p1 = i * (subdivisions + 1) + j 106 | p2 = p1 + 1 107 | p3 = p1 + subdivisions + 1 108 | p4 = p3 + 1 109 | faces.append([p1, p2, p4]) 110 | faces.append([p1, p4, p3]) 111 | faces = np.array(faces) 112 | element_indices = faces 113 | # A = ((side_length / subdivisions) ** 2) / 2 114 | # mass = self.rho * A 115 | num_sides = 3 116 | # self.center = ti.Vector([0.72, 0.32]) 117 | self.center = ti.Vector(config.get('center')) 118 | 119 | # Debug Mesh 120 | # vertices = np.array([[0.0, 0.0],[0.1,0.1 * np.sqrt(3)],[0.2,0.0]]) 121 | # vertices = np.array([[0.0, 0.0],[0.0, 0.2],[0.2,0.0], [0.2, 0.2]]) 122 | # faces = np.array([[0, 1, 2], [ 1, 2, 3]]) 123 | # element_indices = faces 124 | # A = (0.2 **2 ) 125 | # self.mass = self.rho * A 126 | return vertices, faces, element_indices, num_sides 127 | 128 | def load_obj(self, config): 129 | if dim == 2: 130 | vertices, faces, element_indices, num_sides = self.construct_2d_mesh(config) 131 | 132 | else: 133 | obj_path = config.get('obj') 134 | obj = tm.load_mesh(obj_path) 135 | self.obj = obj 136 | 137 | obj_pv_format = pv.read(obj_path) 138 | tet = tetgen.TetGen(obj_pv_format) 139 | ''' 140 | mindihedral: 141 | minratio: 142 | ''' 143 | tet.tetrahedralize(order=1, mindihedral=10, minratio=5.0) 144 | 145 | vertices = tet.node 146 | element_indices = tet.elem 147 | 148 | self.surface, self.surface_vertex = self.extract_surface(tet) 149 | faces = self.surface 150 | 151 | # self.uv = self.recover_uv(obj, self.surface, vertices) 152 | 153 | self.remap_surface = np.copy(self.surface) 154 | self.remap_surface_index(self.remap_surface, self.surface_vertex) 155 | mesh = tm.Trimesh(vertices=tet.grid.points[self.surface_vertex], faces=self.remap_surface) 156 | self.map_index = self.link_mesh_vertex(obj, mesh) 157 | # mass = self.rho / tet.elem.shape[0] 158 | # self.mass = mass 159 | num_sides = 4 160 | self.center = ti.Vector(config.get('center')) 161 | return vertices, faces, element_indices, num_sides 162 | 163 | @staticmethod 164 | def process_obj_duplicate_point(path): 165 | duplicate_point = {} 166 | duplicate_point_list = [] 167 | temp = {} 168 | ret = {} 169 | with open(path, 'r') as file: 170 | for line in file: 171 | data_list = line.split(' ') 172 | if len(data_list) > 0 and data_list[0] == 'f': 173 | for index in range(1, 4): 174 | v_id, t_id = data_list[index].split('/') 175 | if not int(v_id) in duplicate_point: 176 | duplicate_point[int(v_id)] = set() 177 | duplicate_point[int(v_id)].add(int(t_id.replace('\n', ''))) 178 | 179 | for i in range(len(duplicate_point)): 180 | count = len(duplicate_point[i+1]) 181 | for j in range(count): 182 | duplicate_point_list.append(i+1) 183 | 184 | for i in range(len(duplicate_point)): 185 | indices = [j for j, x in enumerate(duplicate_point_list) if x == i+1] 186 | temp[i+1] = indices 187 | 188 | for k, v in temp.items(): 189 | if len(v) == 1: 190 | ret[v[0]] = v 191 | else: 192 | for i in v: 193 | ret[i] = v 194 | 195 | return ret 196 | 197 | def link_mesh_vertex(self, mesh1, mesh2): 198 | map_index = [] 199 | # error_list = [] 200 | for pos in mesh1.vertices: 201 | v_d, v_index = mesh2.nearest.vertex(pos) 202 | # error_list.append(v_d) 203 | map_index.append(v_index) 204 | return map_index 205 | 206 | def recover_uv(self, ori_obj, surface, vertices): 207 | start_time = time.time() 208 | vertex_set = set() 209 | for tri in surface: 210 | v0, v1, v2 = tri 211 | vertex_set.add(v0) 212 | vertex_set.add(v1) 213 | vertex_set.add(v2) 214 | 215 | total_max = -np.inf 216 | error_list = [] 217 | uv = [] 218 | map_index = [] 219 | for indice in vertex_set: 220 | pos = vertices[indice] 221 | v_d, v_index = ori_obj.nearest.vertex(pos) 222 | error_list.append(v_d) 223 | map_index.append(v_index) 224 | 225 | for indice in vertex_set: 226 | pos = vertices[indice] 227 | v_d, v_index = ori_obj.nearest.vertex(pos) 228 | if v_d < 1e-7: 229 | uv.append(ori_obj.visual.uv[v_index]) 230 | else: 231 | p_in_tri, d, tri_index = ori_obj.nearest.on_surface(pos.reshape(-1, 3)) 232 | p0, p1, p2 = ori_obj.vertices[ori_obj.faces[tri_index[0]]] 233 | alpha, beta, gamma = self.barycentric_coordinates(p0, p1, p2, p_in_tri) 234 | ori_uv0, ori_uv1, ori_uv2 = ori_obj.visual.uv[ori_obj.faces[tri_index[0]]] 235 | uv.append(alpha * ori_uv0 + beta * ori_uv1 + gamma * ori_uv2) 236 | return uv 237 | 238 | @staticmethod 239 | def barycentric_coordinates(p0, p1, p2, p): 240 | A, B, C = p0, p1, p2 241 | P = p 242 | 243 | volume_ABC = 0.5 * np.linalg.norm(np.cross(B - A, C - A)) 244 | volume_PBC = 0.5 * np.linalg.norm(np.cross(B - P, C - P)) 245 | volume_PAC = 0.5 * np.linalg.norm(np.cross(C - P, A - P)) 246 | volume_PAB = 0.5 * np.linalg.norm(np.cross(A - P, B - P)) 247 | 248 | lambda1 = volume_PBC / volume_ABC 249 | lambda2 = volume_PAC / volume_ABC 250 | lambda3 = volume_PAB / volume_ABC 251 | 252 | return lambda1, lambda2, lambda3 253 | 254 | 255 | @staticmethod 256 | def extract_surface(tet): 257 | faces = [] 258 | faces_dict = {} 259 | # # for tetra in tetra_indices: 260 | for tetra in tet.elem: 261 | x, y, z, w = tetra 262 | faces.append([x, y, z]) 263 | faces.append([x, y, w]) 264 | faces.append([x, z, w]) 265 | faces.append([y, z, w]) 266 | 267 | faces_dict[tuple(sorted([x, y, z]))] = tetra 268 | faces_dict[tuple(sorted([x, y, w]))] = tetra 269 | faces_dict[tuple(sorted([x, z, w]))] = tetra 270 | faces_dict[tuple(sorted([y, z, w]))] = tetra 271 | 272 | faces = np.array(faces) 273 | 274 | d = {} 275 | surface = [] 276 | for tri in faces: 277 | key = tuple(sorted(tri)) 278 | if key in d: 279 | d[key] += 1 280 | else: 281 | d[key] = 1 282 | 283 | vertices = tet.node 284 | 285 | # Re-construct the surface in counterclockwise order 286 | for k, v in d.items(): 287 | if v == 1: 288 | tetra = faces_dict[k] 289 | inner_point_indice = Object.difference(tetra, k)[0] 290 | inner_point = vertices[inner_point_indice] 291 | f0, f1, f2 = k 292 | p0, p1, p2 = vertices[f0], vertices[f1], vertices[f2] 293 | 294 | if np.cross(p1 - p0, p2 - p0).dot(inner_point - p0) < 0: 295 | surface.append([f0, f1, f2]) 296 | else: 297 | surface.append([f0, f2, f1]) 298 | 299 | vertex = set() 300 | for f in surface: 301 | v0, v1, v2 = f 302 | vertex.add(v0) 303 | vertex.add(v1) 304 | vertex.add(v2) 305 | 306 | vertex = list(vertex) 307 | 308 | return np.array(surface), list(vertex) 309 | 310 | @staticmethod 311 | def remap_surface_index(surface, vertex): 312 | for index in range(len(surface)): 313 | for dim in range(len(surface[index])): 314 | if surface[index][dim] >= len(vertex): 315 | surface[index][dim] = vertex.index(surface[index][dim]) 316 | 317 | @staticmethod 318 | def difference(s1, s2): 319 | ret = list(set(s1) - set(s2)) 320 | return ret 321 | 322 | def update_obj(self): 323 | points = self.particles.pos.to_numpy() 324 | for i in range(len(self.map_index)): 325 | # obj_index_list = self.duplicate_index_2_obj_index[self.map_index[i]] 326 | # for index in obj_index_list: 327 | self.obj.vertices[i] = points[self.map_index[i]] 328 | # test_set.add(index) 329 | # self.tmmesh.vertices = self.particles.pos.to_numpy() 330 | 331 | def save_obj(self, file_name): 332 | with open(file_name, 'w') as f: 333 | # e = mesh.export(file_type='obj') 334 | e = self.obj.export(file_type='obj') 335 | f.write(e) 336 | 337 | @ti.kernel 338 | def particles_init(self): 339 | 340 | for i in range(self.particle_cnt): 341 | self.particles[i].pos = self.ti_vertices[i] + self.center 342 | self.particles[i].ref_pos = self.particles[i].pos 343 | # self.particles[i].mass = self.mass 344 | 345 | @ti.kernel 346 | def elements_init(self): 347 | for i in range(self.element_cnt): 348 | self.elements[i].vertex_indices = self.ti_element[i] 349 | 350 | r = mat(0) 351 | p_0 = self.particles[self.ti_element[i].x].pos 352 | for j in ti.static(range(dim)): 353 | if j + 1 <= dim: 354 | p_i = self.particles[self.ti_element[i][j + 1]].pos 355 | r[:, j] = p_i - p_0 356 | self.elements[i].volume = self.compute_volume(r) 357 | 358 | for j in ti.static(range(dim+1)): 359 | index = self.elements[i].vertex_indices[j] 360 | self.particles.mass[index] += 1.0 / (dim + 1) * self.elements[i].volume * self.rho 361 | 362 | self.elements[i].ref = ti.math.inverse(r) 363 | 364 | @ti.kernel 365 | def mesh_init(self): 366 | for i in range(self.mesh_cnt): 367 | self.meshs[i].p0 = self.ti_faces[i][0] 368 | self.meshs[i].p1 = self.ti_faces[i][1] 369 | self.meshs[i].p2 = self.ti_faces[i][2] 370 | 371 | self.indices[i * 3 + 0] = self.ti_faces[i][0] 372 | self.indices[i * 3 + 1] = self.ti_faces[i][1] 373 | self.indices[i * 3 + 2] = self.ti_faces[i][2] 374 | 375 | @staticmethod 376 | @ti.func 377 | def compute_volume(x: mat) -> ti.f32: 378 | m = ti.math.mat3(0) 379 | V = 0.0 380 | for i in ti.static(range(x.m)): 381 | for j in ti.static(range(x.n)): 382 | m[i, j] = x[i, j] 383 | 384 | p0 = m[:, 0] 385 | p1 = m[:, 1] 386 | p2 = m[:, 2] 387 | 388 | if dim == 2: 389 | V = ti.abs(p0.cross(p1).norm()) / 2 390 | else: 391 | V = (1 / 6) * ti.abs(p0.dot(p1.cross(p2))) 392 | return V -------------------------------------------------------------------------------- /render/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jukgei/Finite-Element-Method/da2dd6686f1cbffb2c80cc5ee68aa1ad3f16e203/render/__init__.py -------------------------------------------------------------------------------- /render/render.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import taichi as ti 4 | import constants 5 | import numpy as np 6 | 7 | class Render: 8 | 9 | def __init__(self, config): 10 | 11 | self.width = 640 12 | self.height = 640 13 | self.box_vert = None 14 | self.box_lines_indices = None 15 | self.is_output_gif = config.get('is_output_gif') 16 | self.output_fps = config.get('output_fps', 60) 17 | self.output_frame_cnt = 0 18 | self.frame_time = 1.0 / self.output_fps 19 | # virtual_time = 0.0 20 | self.widget, self.camera = self.render_init(config) 21 | if self.is_output_gif: 22 | self.video_manager = ti.tools.VideoManager(output_dir="./output", framerate=self.output_fps, automatic_build=False) 23 | 24 | def render_init(self, config): 25 | if constants.dim == 2: 26 | gui = ti.GUI('Finite Element Method', (self.width, self.height)) 27 | widget = gui 28 | camera = None 29 | else: 30 | window = ti.ui.Window('Finite Element Method', res=(self.width, self.height), pos=(150, 150)) 31 | 32 | canvas = window.get_canvas() 33 | 34 | scene = ti.ui.Scene() 35 | 36 | camera = ti.ui.Camera() 37 | camera.position(-6.36, 3.49, 2.44) 38 | camera.lookat(-5.40, 3.19, 2.43) 39 | camera.up(0, 1, 0) 40 | scene.set_camera(camera) 41 | 42 | gui = window.get_gui() 43 | widget = window 44 | 45 | # if dim == 3: 46 | # Boundary Box 47 | box_min = ti.Vector([0, 0, 0]) 48 | box_max = ti.Vector([5, 5, 5]) 49 | self.box_vert = ti.Vector.field(3, ti.f32, shape=12) 50 | self.box_vert[0] = ti.Vector([box_min.x, box_min.y, box_min.z]) 51 | self.box_vert[1] = ti.Vector([box_min.x, box_max.y, box_min.z]) 52 | self.box_vert[2] = ti.Vector([box_max.x, box_min.y, box_min.z]) 53 | self.box_vert[3] = ti.Vector([box_max.x, box_max.y, box_min.z]) 54 | self.box_vert[4] = ti.Vector([box_min.x, box_min.y, box_max.z]) 55 | self.box_vert[5] = ti.Vector([box_min.x, box_max.y, box_max.z]) 56 | self.box_vert[6] = ti.Vector([box_max.x, box_min.y, box_max.z]) 57 | self.box_vert[7] = ti.Vector([box_max.x, box_max.y, box_max.z]) 58 | self.box_lines_indices = ti.field(int, shape=(2 * 12)) 59 | for i, val in enumerate([0, 1, 0, 2, 1, 3, 2, 3, 4, 5, 4, 6, 5, 7, 6, 7, 0, 4, 1, 5, 2, 6, 3, 7]): 60 | self.box_lines_indices[i] = val 61 | 62 | return widget, camera 63 | 64 | def render2d(self, objects, circle_blocks, virtual_time): 65 | base_ = 0.13 66 | for obj in objects: 67 | pos_ = obj.particles.pos.to_numpy() 68 | phi_ = obj.phi.to_numpy() 69 | 70 | self.widget.triangles(a=pos_[obj.meshs.p0.to_numpy()], b=pos_[obj.meshs.p1.to_numpy()], c=pos_[obj.meshs.p2.to_numpy()], 71 | color=ti.rgb_to_hex([phi_ + base_, base_, base_])) 72 | self.widget.circles(pos_, radius=2, color=0xAAAA00) 73 | for index in range(circle_blocks.blocks_count): 74 | block = circle_blocks.blocks[index] 75 | self.widget.circle(block.center, color=0x343434, radius=block.radius * self.width) 76 | 77 | if self.is_output_gif and (virtual_time / self.frame_time) > self.output_frame_cnt: 78 | img = self.widget.get_image() 79 | self.video_manager.write_frame(img) 80 | self.widget.show() 81 | # self.widget.show(f'./output/frames/{self.output_frame_cnt:06d}.png') 82 | self.output_frame_cnt += 1 83 | else: 84 | self.widget.show() 85 | 86 | def render3d(self, objects, virtual_time, msgs): 87 | canvas = self.widget.get_canvas() 88 | scene = ti.ui.Scene() 89 | 90 | # Camera & light 91 | self.camera.track_user_inputs(self.widget, movement_speed=0.05, hold_key=ti.ui.RMB) 92 | scene.set_camera(self.camera) 93 | scene.ambient_light((0.8, 0.8, 0.8)) 94 | scene.point_light(pos=(3.5, 3.5, 3.5), color=(1, 1, 1)) 95 | scene.lines(self.box_vert, indices=self.box_lines_indices, color=(0.99, 0.68, 0.28), width=2.0) 96 | 97 | for obj in objects: 98 | scene.mesh(obj.particles.pos, obj.indices, show_wireframe=True) 99 | canvas.scene(scene) 100 | 101 | if self.is_output_gif and (virtual_time / self.frame_time) > self.output_frame_cnt: 102 | img = self.widget.get_image_buffer_as_numpy() 103 | self.video_manager.write_frame(img) 104 | self.output_frame_cnt += 1 105 | 106 | self.widget.show() 107 | 108 | gui = self.widget.get_gui() 109 | 110 | for msg in msgs: 111 | gui.text(msg) 112 | 113 | def render(self, soft_objects, circle_blcoks, virtual_time, msgs): 114 | 115 | if constants.dim == 2: 116 | self.render2d(soft_objects, circle_blcoks, virtual_time) 117 | else: 118 | self.render3d(soft_objects, virtual_time, msgs) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | taichi==1.6.0 2 | numpy 3 | pyvista 4 | tetgen 5 | trimesh 6 | -------------------------------------------------------------------------------- /solver/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jukgei/Finite-Element-Method/da2dd6686f1cbffb2c80cc5ee68aa1ad3f16e203/solver/__init__.py -------------------------------------------------------------------------------- /solver/explicit.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import taichi as ti 4 | from constants import dim, mat, vec 5 | 6 | 7 | @ti.kernel 8 | def neo_hookean_1_grad(obj: ti.template()): 9 | for i in range(obj.element_cnt): 10 | element = obj.elements[i] 11 | p_0 = obj.particles[element.vertex_indices.x].pos 12 | X = mat(0) 13 | for j in ti.static(range(dim)): 14 | if j + 1 <= dim: 15 | p_j = obj.particles.pos[element.vertex_indices[j + 1]] 16 | X[:, j] = p_j - p_0 17 | 18 | R_inv = element.ref 19 | F = X @ R_inv 20 | V = element.volume 21 | # R_inv_F_inv = ti.math.inverse(X) 22 | # force1 = mu * F @ R_inv.transpose() + (- mu * R_inv_F_inv).transpose() + (s_lambda * ti.log(F.determinant()) * R_inv_F_inv).transpose() 23 | F_inv = ti.math.inverse(F) 24 | log_J_i = ti.log(F.determinant()) 25 | force = (obj.mu * F - obj.mu * F_inv.transpose() + obj.s_lambda * ti.log(F.determinant()) * F_inv.transpose()) @ R_inv.transpose() 26 | # force1 = (mu * F - mu * F_inv.transpose() + s_lambda/2 * ti.log((F.transpose()@F).determinant()) * F_inv.transpose()) @ R_inv.transpose() 27 | # print(force1 - force) 28 | force *= V 29 | 30 | phi_i = obj.mu / 2 * ((F.transpose() @ F).trace() - dim) 31 | phi_i -= obj.mu * log_J_i 32 | phi_i += obj.s_lambda / 2 * log_J_i ** 2 33 | # factor = 1 / math.factorial(dim) 34 | # factor = 1 / 6 35 | # 36 | # p10, p20, p30 = vec(X[:, 0]), vec(X[:, 1]), vec(X[:, 2]) 37 | # V_t = p10.dot(p20.cross(p30)) 38 | # if V_t < 0: 39 | # n = p20.cross(p30).normalized() 40 | # l = p10.dot(n) 41 | # p10 = 2 * l * n - p10 42 | f0 = vec(0.0) 43 | for j in ti.static(range(dim)): 44 | f = vec(force[:, j]) 45 | index = element.vertex_indices[j+1] 46 | obj.particles.force[index] += f 47 | f0 -= f 48 | index0 = element.vertex_indices[0] 49 | obj.particles.force[index0] += f0 50 | 51 | # f1 = vec(force[:, 0])# + factor * p20.cross(p30) * phi_i 52 | # f2 = vec(force[:, 1])# + factor * p10.cross(p30) * phi_i 53 | # f3 = vec(force[:, 2])# + factor * p10.cross(p20) * phi_i 54 | # f0 = -f1 - f2 - f3 55 | # p0, p1, p2, p3 = element.vertex_indices 56 | # obj.particles.force[p0] += f0 57 | # obj.particles.force[p1] += f1 58 | # obj.particles.force[p2] += f2 59 | # obj.particles.force[p3] += f3 60 | # print(f1, particles[mesh.p1].pos, particles[mesh.p1].force) 61 | # if ti.math.isnan(f1[0]): 62 | # print(F, S) -------------------------------------------------------------------------------- /solver/explicit_auto_diff.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import taichi as ti 4 | from constants import dim, mat 5 | 6 | 7 | @ti.kernel 8 | def compute_energy(obj: ti.template()): 9 | for i in range(obj.element_cnt): 10 | element = obj.elements[i] 11 | p_0 = obj.particles[element.vertex_indices.x].pos 12 | X = mat(0) 13 | for j in ti.static(range(dim)): 14 | if j + 1 <= dim: 15 | p_j = obj.particles.pos[element.vertex_indices[j+1]] 16 | X[:, j] = p_j - p_0 17 | 18 | R_inv = element.ref 19 | F = X @ R_inv 20 | 21 | V = element.volume 22 | 23 | # Neo-Hookean 24 | F_i = F 25 | log_J_i = ti.log(F_i.determinant()) 26 | phi_i = obj.mu / 2 * ((F_i.transpose() @ F_i).trace() - dim) 27 | phi_i -= obj.mu * log_J_i 28 | phi_i += obj.s_lambda / 2 * log_J_i ** 2 29 | obj.phi[i] = phi_i * V 30 | obj.U[None] += V * phi_i 31 | 32 | # StVK 33 | # I = ti.math.eye(dim) 34 | # G = 0.5 * (F.transpose() @ F - I) 35 | # phi_i = (G ** 2).sum() * mu 36 | # phi_i += s_lambda/2 * G.trace() **2 37 | # phi[i] = phi_i * V 38 | # U[None] += V * phi_i -------------------------------------------------------------------------------- /solver/implicit.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import numpy as np 3 | import taichi as ti 4 | 5 | import constants 6 | from constants import delta_time, dim, mat, vec, g_dir 7 | 8 | 9 | @ti.func 10 | def kronecker_product(a: ti.template(), b: ti.template()): 11 | ret = ti.types.matrix(a.n*b.n, a.m*b.m, ti.f32)(0) 12 | for i in ti.static(range(a.n)): 13 | for j in ti.static(range(a.m)): 14 | ret[i*b.n:i*b.n+b.n, j*b.m:j*b.m+b.m] = a[i, j] * b 15 | return ret 16 | 17 | 18 | @ti.func 19 | def check_symmetry(obj: ti.template()): 20 | ret = 1 21 | for i in range(obj.particle_cnt): 22 | for j in range(obj.particle_cnt): 23 | mat1 = obj.matrix_A[i, j] 24 | mat2 = obj.matrix_A[j, i] 25 | for k in ti.static(range(dim)): 26 | for l in ti.static(range(dim)): 27 | if ti.abs(mat1[k, l] - mat2[l, k]) > 1e-7: 28 | print('Value {}'.format(ti.abs(mat1[k, l] - mat2[l, k]))) 29 | ret = 0 30 | return ret 31 | 32 | 33 | @ti.kernel 34 | def update_debug_a(obj:ti.template()) -> ti.types.matrix(6, 6, ti.f32): 35 | m = ti.types.matrix(obj.particle_cnt * dim , obj.particle_cnt * dim, ti.f32)(0) 36 | for i in range(obj.particle_cnt): 37 | for j in range(obj.particle_cnt): 38 | mat = obj.matrix_A[i, j] 39 | for k in ti.static(range(dim)): 40 | for l in ti.static(range(dim)): 41 | m[i*dim+k, j*dim+l] = mat[k, l] 42 | # print(m)# = print(mat[k, l]) 43 | return m 44 | 45 | @ti.func 46 | def check_diagonally_dominant(obj: ti.template()): 47 | ret = 1 48 | for i in range(obj.particle_cnt): 49 | for l in ti.static(range(dim)): 50 | diag_element = 0.0 51 | other_element = 0.0 52 | for j in range(obj.particle_cnt): 53 | for k in ti.static(range(dim)): 54 | mat = obj.matrix_A[i, j] 55 | if i == j and k == l: 56 | diag_element += ti.abs(mat[l, k]) 57 | else: 58 | other_element += ti.abs(mat[l, k]) 59 | if diag_element < other_element: 60 | ret = 0 61 | return ret 62 | 63 | 64 | @ti.func 65 | def compute_linear_system_vector_b(obj: ti.template()): 66 | # ret = ti.types.vector(obj.particle_cnt * dim, ti.f32)(0.0) 67 | for i in range(obj.particle_cnt): 68 | obj.vec_b[i] = obj.particles.vel[i] 69 | # for j in ti.static(range(dim)): 70 | # ret[i*dim+j] = obj.particles.vel[i][j] 71 | 72 | for i in range(obj.element_cnt): 73 | element = obj.elements[i] 74 | p_0 = obj.particles[element.vertex_indices.x].pos 75 | X = mat(0) 76 | for j in ti.static(range(dim)): 77 | if j + 1 <= dim: 78 | p_j = obj.particles.pos[element.vertex_indices[j + 1]] 79 | X[:, j] = p_j - p_0 80 | 81 | R_inv = element.ref 82 | # deformation gradient 83 | F = X @ R_inv 84 | F_inv = ti.math.inverse(F) 85 | V = element.volume 86 | 87 | force = (obj.mu * F - obj.mu * F_inv.transpose() + obj.s_lambda / 2 * ti.log((F.transpose() @ F).determinant()) * F_inv.transpose()) @ R_inv.transpose() 88 | force *= -V 89 | 90 | # f = ti.types.vector(dim*obj.particle_cnt, ti.f32)(0.0) 91 | 92 | f0 = vec(0.0) 93 | # m_ = 1.0 / obj.mass 94 | for i in ti.static(range(dim)): 95 | f_n = vec(force[:, i]) 96 | f0 -= f_n 97 | particle_index = element.vertex_indices[i+1] 98 | m_ = 1.0 / obj.particles.mass[particle_index] 99 | obj.vec_b[particle_index] += delta_time * m_ * f_n 100 | # for j in ti.static(range(dim)): 101 | # f[particle_index*dim+j] = f_n[j] 102 | 103 | particle_index = element.vertex_indices.x 104 | m_ = 1.0 / obj.particles.mass[particle_index] 105 | obj.vec_b[particle_index] += delta_time * m_ * f0 106 | # for i in ti.static(range(dim)): 107 | # f[particle_index*dim+i] = f0[i] 108 | # print('f is ', f) 109 | # M = 1.0 / obj.mass * ti.math.eye(dim*obj.particle_cnt) 110 | # ret += delta_time * M @ f 111 | # return ret 112 | 113 | @ti.func 114 | def compute_linear_system_matrix_a(obj: ti.template()): 115 | # ret = ti.types.matrix(obj.particle_cnt * dim, obj.particle_cnt * dim, ti.f32)(0.0) 116 | for i in range(obj.element_cnt): 117 | element = obj.elements[i] 118 | p_0 = obj.particles[element.vertex_indices.x].pos 119 | X = mat(0) 120 | for j in ti.static(range(dim)): 121 | if j + 1 <= dim: 122 | p_j = obj.particles.pos[element.vertex_indices[j + 1]] 123 | X[:, j] = p_j - p_0 124 | 125 | R_inv = element.ref 126 | # deformation gradient 127 | F = X @ R_inv 128 | F_inv = ti.math.inverse(F) 129 | V = element.volume 130 | 131 | log_J = ti.log(ti.max(F.determinant(), 1e-4)) 132 | F_inv_T = F_inv.transpose() 133 | dF_dx00 = ti.types.matrix(dim, dim, ti.f32)(0.0) 134 | temp = ti.types.matrix(dim, dim**2, ti.f32)(0.0) 135 | for i in ti.static(range(dim)): 136 | dF_dxi0 = ti.types.matrix(dim, dim, ti.f32)(0.0) 137 | for j in ti.static(range(dim)): 138 | rows = element.vertex_indices[i + 1] 139 | cols = element.vertex_indices[j + 1] 140 | # mass = obj.particles.mass[cols] 141 | dF = mat(0.0) 142 | if i == j: 143 | dF = ti.math.eye(dim) 144 | dF = dF@R_inv 145 | dF_T = dF.transpose() 146 | dF_dxij = obj.mu * dF + (obj.mu - obj.s_lambda * log_J) * F_inv_T @ dF_T @ F_inv_T + obj.s_lambda * (F_inv @ dF).trace() * F_inv_T 147 | dF_dxij = -V * dF_dxij @ R_inv.transpose() 148 | # dF_dxij = (delta_time ** 2) * (1.0 / obj.mass) * dF_dxij 149 | dF_dx00 += dF_dxij 150 | 151 | obj.matrix_A[rows, cols] += dF_dxij 152 | # for k in ti.static(range(dim)): 153 | # for l in ti.static(range(dim)): 154 | # ret[rows*dim + k, cols*dim + l] += dF_dxij[k, l] 155 | dF_dxi0 -= dF_dxij 156 | 157 | temp[0:dim, j*dim:j*dim+dim] -= dF_dxij 158 | 159 | rows = element.vertex_indices[i+1] 160 | cols = element.vertex_indices[0] 161 | obj.matrix_A[rows, cols] += dF_dxi0 162 | # for m in ti.static(range(dim)): 163 | # for n in ti.static(range(dim)): 164 | # ret[rows*dim+m, cols*dim+n] += dF_dxi0[m, n] 165 | 166 | rows = element.vertex_indices[0] 167 | cols = element.vertex_indices[0] 168 | obj.matrix_A[rows, cols] += dF_dx00 169 | # for i in ti.static(range(dim)): 170 | # for j in ti.static(range(dim)): 171 | # ret[rows*dim+i, cols*dim+j] += dF_dx00[i, j] 172 | 173 | # dF0_dx1 174 | # dF0_dx2 175 | for i in ti.static(range(dim)): 176 | r = element.vertex_indices[0] 177 | c = element.vertex_indices[i+1] 178 | obj.matrix_A[r, c] += temp[:, i*dim:i*dim+dim] 179 | # for k in ti.static(range(dim)): 180 | # for l in ti.static(range(dim)): 181 | # ret[r*dim+k, c*dim+l] += temp[k, l+i*dim] 182 | 183 | for i in range(obj.particle_cnt): 184 | for j in range(obj.particle_cnt): 185 | # m_ = obj.mass 186 | m_ = obj.particles.mass[i] 187 | obj.matrix_A[i, j] = (delta_time ** 2) * ((1.0 / m_) * ti.math.eye(dim))@obj.matrix_A[i, j] 188 | 189 | for i in range(obj.particle_cnt): 190 | for j in range(obj.particle_cnt): 191 | I = mat(0.0) 192 | if i == j: 193 | I = ti.math.eye(dim) 194 | obj.matrix_A[i, j] = I - obj.matrix_A[i, j] 195 | 196 | # ret = ti.math.eye(obj.particle_cnt * dim) - ret 197 | # return ret 198 | 199 | 200 | @ti.kernel 201 | def implicit_solver_neo_hookean(obj: ti.template()): 202 | obj.matrix_A.fill(mat(0.0)) 203 | obj.vec_b.fill(vec(0.0)) 204 | obj.vec_x.fill(vec(0.0)) 205 | 206 | if constants.implicit_method == constants.CONJUGATE_GRADIENT_METHOD: 207 | obj.vec_d.fill(vec(0.0)) 208 | obj.vec_q.fill(vec(0.0)) 209 | obj.vec_r.fill(vec(0.0)) 210 | obj.vec_ATb.fill(vec(0.0)) 211 | obj.matrix_ATA.fill(mat(0.0)) 212 | obj.matrix_AT.fill(mat(0.0)) 213 | 214 | compute_linear_system_matrix_a(obj) 215 | compute_linear_system_vector_b(obj) 216 | 217 | if constants.implicit_method == constants.JACOBIN_METHOD: 218 | jacobi_iter_field(obj) 219 | elif constants.implicit_method == constants.CONJUGATE_GRADIENT_METHOD: 220 | cg(obj) 221 | 222 | for i in range(obj.particle_cnt): 223 | obj.particles.vel[i] = obj.vec_x[i] 224 | 225 | 226 | @ti.func 227 | def jacobi_iter_field(obj: ti.template()): 228 | iter_cnt = 0 229 | 230 | # Set init point 231 | for i in range(obj.particle_cnt): 232 | obj.vec_x[i] = 0.5 * obj.vec_b[i] 233 | 234 | err = compute_error(obj) 235 | p_err = err 236 | threshold = 1e-5 237 | max_iter = 20000 238 | 239 | # symmetry = check_symmetry(obj) 240 | # 241 | # if symmetry == 1: 242 | # print('Fine!') 243 | # else: 244 | # print('Not a symmetry matrix') 245 | 246 | # convergent = check_diagonally_dominant(obj) 247 | # if convergent == 1: 248 | # print('convergent!') 249 | # else: 250 | # print('divergent!') 251 | # print('jacobi error first {}'.format(err)) 252 | while err > threshold and iter_cnt < max_iter:# and convergent == 1: 253 | 254 | jacobi_iter_field_once(obj) 255 | err = compute_error(obj) 256 | iter_cnt += 1 257 | if err >= p_err: 258 | recover_past_frame_x(obj) 259 | break 260 | p_err = err 261 | cache_x(obj) 262 | # print('jacobi field iter cnt: {}, loss {}'.format(iter_cnt, err)) 263 | 264 | 265 | @ti.func 266 | def cache_x(obj: ti.template()): 267 | for i in range(obj.particle_cnt): 268 | obj.past_vec_x[i] = obj.vec_x[i] 269 | 270 | 271 | @ti.func 272 | def recover_past_frame_x(obj: ti.template()): 273 | for i in range(obj.particle_cnt): 274 | obj.vec_x[i] = obj.past_vec_x[i] 275 | 276 | @ti.func 277 | def compute_error(obj: ti.template()): 278 | err = 0.0 279 | for i in range(obj.particle_cnt): 280 | v = vec(0.0) 281 | for j in range(obj.particle_cnt): 282 | v += obj.matrix_A[i, j] @ obj.vec_x[j] 283 | 284 | err += (obj.vec_b[i] - v).norm() ** 2 285 | err = ti.sqrt(err) 286 | return err 287 | 288 | @ti.func 289 | def preconditioned(obj: ti.template()): 290 | for i in range(obj.particle_cnt): 291 | for j in range(obj.particle_cnt): 292 | obj.matrix_AT[i, j] = obj.matrix_A[j, i].transpose() 293 | for i in range(obj.particle_cnt): 294 | for j in range(obj.particle_cnt): 295 | obj.vec_ATb[i] += obj.matrix_AT[i, j] @ obj.vec_b[j] 296 | for i in range(obj.particle_cnt): 297 | for j in range(obj.particle_cnt): 298 | for k in range(obj.particle_cnt): 299 | obj.matrix_ATA[i, j] += obj.matrix_AT[i, k] @ obj.matrix_A[k, j] 300 | 301 | @ti.func 302 | def non_preconditioned(obj: ti.template()): 303 | for i in range(obj.particle_cnt): 304 | obj.vec_ATb[i] = obj.vec_b[i] 305 | for i in range(obj.particle_cnt): 306 | for j in range(obj.particle_cnt): 307 | obj.matrix_ATA[i, j] = obj.matrix_A[i, j] 308 | 309 | # conjugate gradient in taichi field 310 | @ti.func 311 | def cg(obj: ti.template()): 312 | 313 | for i in range(obj.particle_cnt): 314 | obj.vec_x[i] = obj.vec_b[i] 315 | 316 | iter_cnt = 0 317 | 318 | if constants.preconditioned == 1: 319 | preconditioned(obj) 320 | else: 321 | non_preconditioned(obj) 322 | 323 | # r = b - A@x 324 | for i in range(obj.particle_cnt): 325 | obj.vec_r[i] = obj.vec_ATb[i] 326 | for j in range(obj.particle_cnt): 327 | obj.vec_r[i] -= obj.matrix_ATA[i, j] @ obj.vec_x[j] 328 | 329 | for i in range(obj.particle_cnt): 330 | obj.vec_d[i] = obj.vec_r[i] 331 | 332 | delta_new = 0.0 333 | for i in range(obj.particle_cnt): 334 | delta_new += obj.vec_r[i]@obj.vec_r[i] 335 | 336 | # delta_0 = delta_new 337 | iter_max = 500 338 | epsilon = 5e-3 339 | # print('Error before iteration is {}'.format(delta_new)) 340 | # while iter_cnt < iter_max and delta_new > delta_0 * epsilon**2: 341 | while iter_cnt < iter_max and delta_new > 1e-5: 342 | 343 | # q = A @ d 344 | for i in range(obj.particle_cnt): 345 | obj.vec_q[i] = vec(0.0) 346 | 347 | for i in range(obj.particle_cnt): 348 | for j in range(obj.particle_cnt): 349 | obj.vec_q[i] += obj.matrix_ATA[i, j] @ obj.vec_d[j] 350 | 351 | dTq = 0.0 352 | for i in range(obj.particle_cnt): 353 | dTq += obj.vec_d[i]@ obj.vec_q[i] 354 | alpha = delta_new / dTq 355 | 356 | # x = x + alpha * d 357 | for i in range(obj.particle_cnt): 358 | obj.vec_x[i] = obj.vec_x[i] + alpha * obj.vec_d[i] 359 | 360 | # if iter_cnt % 50 == 0: 361 | # # r = b - A@x 362 | # for i in range(obj.particle_cnt): 363 | # ax_ij = vec(0.0) 364 | # for j in range(obj.particle_cnt): 365 | # ax_ij += obj.matrix_ATA[i, j] @ obj.vec_x[j] 366 | # for k in range(dim): 367 | # r[i * dim + k] = obj.vec_ATb[i][k] - ax_ij[k] 368 | # 369 | # else: 370 | # r = r - alpha * q 371 | for i in range(obj.particle_cnt): 372 | obj.vec_r[i] = obj.vec_r[i] - alpha * obj.vec_q[i] 373 | # for i in range(obj.particle_cnt): 374 | # for j in range(dim): 375 | # r[i*dim + j] = r[i*dim + j] - alpha * q[i*dim+j] 376 | 377 | 378 | delta_old = delta_new 379 | delta_new = 0.0 380 | for i in range(obj.particle_cnt): 381 | delta_new += obj.vec_r[i] @ obj.vec_r[i] 382 | beta = delta_new / delta_old 383 | # d = r + beta * d 384 | for i in range(obj.particle_cnt): 385 | obj.vec_d[i] = obj.vec_r[i] + beta * obj.vec_d[i] 386 | iter_cnt = iter_cnt + 1 387 | 388 | # print('Error: {}, iter count {}'.format(delta_new, iter_cnt)) 389 | 390 | @ti.func 391 | def jacobi_iter_field_once(obj: ti.template()): 392 | omega = 0.75 393 | for i in range(obj.particle_cnt): 394 | b = obj.vec_b[i] 395 | for j in range(obj.particle_cnt): 396 | dF_dxij = obj.matrix_A[i, j] 397 | b -= dF_dxij@obj.vec_x[j] 398 | for k in ti.static(range(dim)): 399 | a_ii = obj.matrix_A[i, i][k, k] 400 | if ti.abs(a_ii) < 1e-6: 401 | obj.vec_x[i][k] = 0.0 402 | else: 403 | b[k] += a_ii * obj.vec_x[i][k] 404 | obj.vec_x[i][k] = omega * b[k] / a_ii + (1 - omega) * obj.past_vec_x[i][k] 405 | 406 | @ti.kernel 407 | def advect_implicit(obj: ti.template(), circle_blocks: ti.template()): 408 | for index in range(obj.particle_cnt): 409 | obj.particles[index].vel_g += 9.8 * ti.Vector(g_dir) * delta_time 410 | obj.particles[index].vel *= ti.exp(-delta_time * obj.damping) 411 | obj.particles[index].vel_g *= ti.exp(-delta_time * obj.damping) 412 | v = obj.particles[index].vel + obj.particles[index].vel_g 413 | 414 | for i in ti.static(range(dim)): 415 | if obj.particles.pos[index][i] < 0 and v[i] < 0: 416 | obj.particles.vel[index][i] = 0.0 417 | obj.particles.vel_g[index][i] = 0.0 418 | v[i] = 0.0 419 | 420 | if obj.particles.pos[index][i] > 1 and v[i] > 0: 421 | obj.particles.vel[index][i] = 0.0 422 | # obj.particles.vel_g[index][i] = 0.0 423 | v[i] = 0.0 424 | for i in range(circle_blocks.blocks_count): 425 | block = circle_blocks.blocks[i] 426 | if block.radius <= 0.0: 427 | continue 428 | center = block.center 429 | radius = block.radius 430 | if (obj.particles[index].pos - center).norm() < radius and v.dot( 431 | center - obj.particles[index].pos) > 0: 432 | disp = obj.particles[index].pos - center 433 | v -= v.dot(disp) * disp / disp.norm_sqr() 434 | obj.particles.vel[index] -= obj.particles.vel[index].dot(disp) * disp / disp.norm_sqr() 435 | obj.particles.vel_g[index] -= obj.particles.vel_g[index].dot(disp) * disp / disp.norm_sqr() 436 | 437 | obj.particles.pos[index] += v * delta_time 438 | # obj.particles.vel[index] = obj.particles[index].vel 439 | 440 | 441 | def gen_random_matrix(n): 442 | np.random.seed(42) 443 | return np.random.rand(n, n) 444 | 445 | def gen_n_dim_positive_diag_matrix(n): 446 | np.random.seed(42) 447 | 448 | m = np.zeros((n, n)) 449 | for i in range(n): 450 | m[i, :i+1] = np.random.rand(i+1) 451 | 452 | return m@m.transpose() 453 | 454 | def gen_n_dim_positive_matrix(n): 455 | # np.random.seed(42) 456 | A = np.random.rand(n, n) 457 | 458 | n = A.shape[0] 459 | leading_minors = [] 460 | for k in range(1, n + 1): 461 | sub_matrix = A[:k, :k] 462 | minor = np.linalg.det(sub_matrix) 463 | leading_minors.append(minor) 464 | while not all(num > 0 for num in leading_minors): 465 | A = np.random.rand(n, n) 466 | leading_minors = [] 467 | for k in range(1, n + 1): 468 | sub_matrix = A[:k, :k] 469 | minor = np.linalg.det(sub_matrix) 470 | leading_minors.append(minor) 471 | print(leading_minors) 472 | return A 473 | 474 | def gen_n_dim_b(n): 475 | return np.random.rand(n)# * 2 - 1 476 | 477 | def steepest_descent_np(A, b): 478 | print('\n') 479 | print('steepest descent ===============================') 480 | i = 0 481 | rows, _ = A.shape 482 | x = np.zeros(rows) 483 | r = b - A@x 484 | delta = r@r 485 | delta_0 = delta 486 | 487 | i_max = 1000 488 | epsilon = 1e-4 489 | while i < i_max and delta > 1e-4: 490 | q = A@r 491 | alpha = delta / (r@q) 492 | x = x + alpha * r 493 | 494 | if i % 50 == 0: 495 | r = b - A@x 496 | else: 497 | r = r - alpha*q 498 | 499 | delta = r @ r 500 | i = i+1 501 | print('x is ', x) 502 | print('iter count is ', i) 503 | print('loss is ', np.linalg.norm(A @ x - b)) 504 | 505 | 506 | def conjugate_gradient_np(A, b): 507 | print('Input: A is ', A) 508 | print('Input: b is ', b) 509 | 510 | i = 0 511 | rows, _ = A.shape 512 | x = np.zeros(rows) 513 | r = b - A @ x 514 | d = r 515 | delta_new = r.transpose() @ r 516 | delta_0 = delta_new 517 | i_max = 300000 518 | epsilon = 1e-4 519 | while i < i_max and delta_new > delta_0 * epsilon ** 2: 520 | q = A @ d 521 | alpha = delta_new / (d.transpose() @ q) 522 | x = x + alpha * d 523 | if i % 10 == 0: 524 | r = b - A@x 525 | else: 526 | r = r - alpha * q 527 | delta_old = delta_new 528 | delta_new = r.transpose() @ r 529 | beta = delta_new / delta_old 530 | d = r + beta * d 531 | i = i + 1 532 | # print('loss is', delta_new) 533 | print('x is ', x) 534 | print('iter count is ', i) 535 | print('loss is ', np.linalg.norm(A@x - b)) 536 | return x 537 | 538 | def test(): 539 | n = 5 540 | # A = gen_n_dim_positive_diag_matrix(n) 541 | A = gen_n_dim_positive_matrix(n) 542 | # A = gen_random_matrix(n) 543 | b = gen_n_dim_b(n) 544 | 545 | print('\n') 546 | from scipy.sparse.linalg import cg, gmres 547 | 548 | # x, info = gmres(A, b) 549 | x, info = cg(A.transpose()@ A, A.transpose()@b) 550 | print(x, info) 551 | print('\n') 552 | x = conjugate_gradient_np(A.transpose()@ A, A.transpose() @b) 553 | print('real loss is ', np.linalg.norm(A@x - b)) 554 | # steepest_descent_np(A, b) 555 | 556 | while True: 557 | pass 558 | -------------------------------------------------------------------------------- /solver/kinematic.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import taichi as ti 4 | from constants import delta_time 5 | from constants import vec, use_explicit_method, g_dir, dim, auto_diff 6 | 7 | 8 | @ti.kernel 9 | def kinematic(obj: ti.template(), circle_blocks: ti.template()): 10 | for i in range(obj.particle_cnt): 11 | kinematic_particle(i, delta_time, obj.particles, obj.damping, circle_blocks) 12 | 13 | @ti.func 14 | def kinematic_particle(index: ti.int32, dt: ti.f32, particles: ti.template(), damping: ti.f32, circle_blocks: ti.template()): 15 | if auto_diff == 1: 16 | particles[index].vel += (particles[index].acc + 9.8 * ti.Vector(g_dir) - particles.pos.grad[index] / 17 | particles[index].mass) * dt 18 | else: 19 | particles[index].vel += (particles[index].acc + 9.8 * ti.Vector(g_dir) - particles[index].force / particles[ 20 | index].mass) * dt 21 | 22 | 23 | particles[index].vel *= ti.exp(-dt * damping) 24 | 25 | for i in ti.static(range(dim)): 26 | if particles.pos[index][i] < 0 and particles.vel[index][i] < 0: 27 | particles.vel[index][i] = 0 28 | 29 | if particles.pos[index][i] > 1 and particles.vel[index][i] > 0: 30 | particles.vel[index][i] = 0 31 | 32 | for i in range(circle_blocks.blocks_count): 33 | block = circle_blocks.blocks[i] 34 | if block.radius <= 0.0: 35 | continue 36 | center = block.center 37 | radius = block.radius 38 | if (particles[index].pos - center).norm() < radius and particles[index].vel.dot( 39 | center - particles[index].pos) > 0: 40 | disp = particles[index].pos - center 41 | particles[index].vel -= particles[index].vel.dot(disp) * disp / disp.norm_sqr() 42 | 43 | particles.pos[index] += particles.vel[index] * dt 44 | if auto_diff == 0: 45 | particles[index].force = vec(0.0) 46 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | import taichi as ti 4 | from constants import dim, mat 5 | import constants 6 | import json 7 | 8 | 9 | def sys_init(config): 10 | constants.dim = config.get('dim') 11 | constants.auto_diff = 1 if config.get('auto_diff') else 0 12 | constants.use_explicit_method = config.get('use_explicit_method') 13 | constants.delta_time = config.get('delta_time') 14 | constants.g_dir = config.get('g_dir') 15 | constants.implicit_method = config.get('implicit_method') 16 | constants.preconditioned = config.get('preconditioned') 17 | # print('dim isss', dim, constants.dim) 18 | dim = constants.dim 19 | constants.vec = ti.types.vector(dim, ti.f32) 20 | constants.mat = ti.types.matrix(dim, dim, ti.f32) 21 | constants.index = ti.types.vector(dim+1, ti.i32) 22 | # print(dim, auto_diff, use_explicit_method, g_dir) 23 | 24 | def read_config(file_name): 25 | try: 26 | with open(file_name, 'r') as f: 27 | data = json.load(f) 28 | return data 29 | except Exception as e: 30 | print(e) 31 | print('Parsing config file error') 32 | exit(3) 33 | 34 | --------------------------------------------------------------------------------