Initial Commit

This commit is contained in:
Patrick McDonagh
2016-07-01 16:43:39 -05:00
commit a1714c722f
38 changed files with 1830 additions and 0 deletions

1
FiniteDifferences/.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
FiniteDifferences

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

29
FiniteDifferences/.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.4.3 (/Library/Frameworks/Python.framework/Versions/3.4/bin/python3.4)" project-jdk-type="Python SDK" />
<component name="masterDetails">
<states>
<state key="ScopeChooserConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

8
FiniteDifferences/.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/FiniteDifferences.iml" filepath="$PROJECT_DIR$/.idea/FiniteDifferences.iml" />
</modules>
</component>
</project>

6
FiniteDifferences/.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="" />
</component>
</project>

289
FiniteDifferences/.idea/workspace.xml generated Normal file
View File

@@ -0,0 +1,289 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="4f940e47-aab9-49a1-968b-e17ba626fea1" name="Default" comment="" />
<ignored path="FiniteDifferences.iws" />
<ignored path=".idea/workspace.xml" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
<component name="CreatePatchCommitExecutor">
<option name="PATCH_PATH" value="" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FavoritesManager">
<favorites_list name="FiniteDifferences" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="FiniteDifferences.py" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/FiniteDifferences.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.679285">
<caret line="38" column="56" selection-start-line="38" selection-start-column="56" selection-end-line="38" selection-end-column="56" />
<folding>
<element signature="e#27#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/FiniteDifferences.py" />
</list>
</option>
</component>
<component name="NamedScopeManager">
<order />
</component>
<component name="ProjectFrameBounds">
<option name="x" value="38" />
<option name="y" value="36" />
<option name="width" value="1826" />
<option name="height" value="1069" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="FiniteDifferences" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="FiniteDifferences" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="FiniteDifferences" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Scratches" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="settings.editor.selected.configurable" value="configurable.group.editor" />
<property name="settings.editor.splitter.proportion" value="0.2" />
</component>
<component name="RunManager">
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="FiniteDifferences" />
<option name="SCRIPT_NAME" value="" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Attests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="FiniteDifferences" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Doctests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="FiniteDifferences" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Nosetests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="FiniteDifferences" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="PARAMS" value="" />
<option name="USE_PARAM" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Unittests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="FiniteDifferences" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="PUREUNITTEST" value="true" />
<option name="PARAMS" value="" />
<option name="USE_PARAM" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="py.test">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="FiniteDifferences" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="testToRun" value="" />
<option name="keywords" value="" />
<option name="params" value="" />
<option name="USE_PARAM" value="false" />
<option name="USE_KEYWORD" value="false" />
<method />
</configuration>
</component>
<component name="ShelveChangesManager" show_recycled="false" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="4f940e47-aab9-49a1-968b-e17ba626fea1" name="Default" comment="" />
<created>1434394978091</created>
<option name="number" value="Default" />
<updated>1434394978091</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="38" y="36" width="1826" height="1069" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Application Servers" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.2498615" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
</layout>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/FiniteDifferences.py">
<provider selected="true" editor-type-id="text-editor">
<state vertical-scroll-proportion="0.679285">
<caret line="38" column="56" selection-start-line="38" selection-start-column="56" selection-end-line="38" selection-end-column="56" />
<folding>
<element signature="e#27#38#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>

View File

@@ -0,0 +1,39 @@
__author__ = 'patrickjmcd'
import math
import numpy as np
import scipy.interpolate
# setting up constants
E = 30.5 * 10**6
A = math.pi/4 * (0.75)**2
L = 2000
Gc = 32.2
Rho = 490
T = 15
M = 100
NT = 360
C = 0.8
F = [4085.7, 3969.1, 3852.4, 3774.7, 3697, 3736, 3814, 3891.9, 3969.7, 4047.7, 4008.9, 3931.1, 3853.3, 3775.6, 3658.9, 3581.2, 3581.3, 3659.3, 3737.3, 3815.2, 3893.1, 3970.9, 4048.9, 4126.8, 4204.7, 4282.6, 4360.5, 4477.3, 4555.3, 4633.2, 4672.1, 4788.9, 4866.8, 4944.7, 5061.4, 5139.4, 5256.2, 5334, 5411.8, 5528.6, 5606.5, 5684.4, 5801.3, 5879.2, 5918.3, 5918.6, 5879.9, 5841.2, 5880.2, 5919.3, 5997.3, 6075.2, 6153.1, 6231, 6308.9, 6386.7, 6503.6, 6581.5, 6659.3, 6776.2, 6854.1, 6932, 6971.1, 6932.5, 6893.7, 6855, 6777.3, 6738.6, 6699.8, 6699.9, 6739.1, 6778.3, 6778.6, 6778.8, 6779.2, 6818.4, 6896.4, 6974.3, 7052.2, 7169, 7285.9, 7441.6, 7597.4, 7675.3, 7792.2, 7986.8, 8103.7, 8220.5, 8337.3, 8454.1, 8571, 8649, 8726.9, 8766, 8688.4, 8610.7, 8533, 8455.3, 8377.6, 8261, 8183.3, 8105.7, 8067, 8067.2, 8106.3, 8145.5, 8145.7, 8145.9, 8107.2, 8068.5, 8029.9, 7991.3, 7991.5, 7991.7, 7992, 7914.4, 7836.8, 7759, 7681.3, 7603.6, 7448.1, 7331.5, 7253.8, 7137.2, 7020.5, 6865, 6670.6, 6515, 6398.4, 6281.8, 6165.2, 6048.6, 5970.9, 5932.2, 5971.3, 6049.2, 6127.2, 6205.1, 6283, 6361.1, 6400.2, 6439.3, 6400.8, 6362.1, 6323.4, 6323.6, 6323.8, 6363.1, 6363.3, 6363.5, 6363.7, 6325.1, 6325.2, 6403.2, 6442.2, 6520.2, 6598.1, 6676, 6754, 6870.8, 6987.6, 7143.4, 7260.2, 7416, 7610.7, 7766.4, 7922.2, 8000.1, 8078, 8078.1, 8039.4, 8000.6, 7922.9, 7845.2, 7767.5, 7689.8, 7651, 7612.3, 7612.5, 7651.7, 7690.7, 7690.9, 7652.4, 7613.8, 7614, 7653.1, 7653.4, 7575.8, 7498, 7420.3, 7342.6, 7226, 7109.4, 6992.7, 6876, 6720.5, 6526.1, 6370.5, 6253.8, 6137.2, 6020.6, 5981.8, 6020.9, 6098.8, 6176.8, 6254.7, 6332.8, 6333, 6294.4, 6294.7, 6295, 6295.2, 6256.6, 6334.6, 6451.5, 6568.3, 6685.1, 6801.9, 6957.7, 7152.3, 7269, 7502.6, 7619.5, 7697.4, 7658.7, 7581, 7503.2, 7425.6, 7425.8, 7464.8, 7426.2, 7387.6, 7387.8, 7310.1, 7193.5, 7037.8, 6687.6, 6843.4, 6687.7, 6532.1, 6415.5, 6298.7, 6182, 6182.2, 6182.5, 6182.8, 6338.6, 6416.4, 6572, 6688.7, 6844.4, 7038.9, 7155.7, 7311.2, 7116.5, 6999.8, 6844.2, 6727.3, 6571.8, 6454.8, 6338, 5987.8, 5832.1, 5676.4, 5442.8, 5326, 5209.2, 5364.7, 5559.1, 5714.7, 5870.2, 5947.8, 5869.7, 5830.6, 5791.5, 5674.6, 5596.7, 5518.8, 5440.7, 5401.6, 5479.2, 5556.8, 5478.7, 5361.9, 5206.1, 5128.3, 5011.5, 4816.9, 4622.3, 4349.8, 4155.1, 3882.6, 3726.9, 3610.1, 3493, 3414.9, 3336.8, 3258.7, 3219.5, 3219.3, 3218.9, 3179.7, 3101.7, 2984.7, 2906.9, 2751, 2595.2, 2517.2, 2400.4, 2322.5, 2322.2, 2438.7, 2555.4, 2672, 2749.7, 2866.3, 2944, 3021.6, 3021.4, 2943.5, 2787.6, 2631.8, 2476.1, 2242.4, 2008.7, 1814.1, 1697.2, 1619.3, 1580, 1579.8, 1579.6, 1579.4, 1579.1, 1656.6, 1695.2, 1811.7, 1928.2, 2122.6, 2278, 2394.6, 2472.2, 2511, 2510.8, 2432.7, 2315.8, 2159.9, 2004, 1926, 1964.6, 2081.1, 2236.5, 2392, 2547.6, 2741.9, 2936.3, 3130.6, 3247.2, 3286, 3324.7, 3402.3, 3402, 3440.6, 3401.3, 3362.1, 3283.9, 3205.9, 3089.1, 3011.1, 2933.2, 2855.3, 2777.3, 2699.4, 2660.3, 2660, 2698.7, 2815.2, 3009.6, 3126.1, 3242.6, 3281.4, 3281.2, 3203.1, 3125.2, 3008.3, 2852.5, 2735.6, 2618.8, 2502, 2385.1, 2268.2, 2190.2, 2151.1, 2111.8, 2111.4, 2111.1, 2188.4, 2266, 2382.5, 2538.1, 2615.8, 2693.5, 2810, 2887.7, 2926.4, 2887.3, 2809.2, 2731.3, 2614.4, 2536.5, 2458.5, 2419.3, 2496.9, 2574.6, 2652.4, 2769, 2924.5, 3080, 3118.8, 3274.4, 3429.9, 3468.7, 3546.4, 3585.1, 3662.7, 3701.3, 3701, 3700.8, 3661.6, 3466.8, 3349.9, 3233.1, 3155.1, 3193.7, 3271.5, 3388.1, 3504.7, 3621.3, 3660.1, 3698.9, 3659.8, 3542.9, 3426.1, 3270.3, 3153.5, 2997.7, 2880.9, 2802.9, 2763.6, 2841.1, 2957.8, 3074.6, 3191.2, 3269, 3346.7, 3346.6, 3346.4 ]
X = [0.10168, 0.2756, 0.44953, 0.62278, 0.79604, 0.96729, 1.1379, 1.3084, 1.3071, 1.4777, 1.6503, 1.8235, 1.8249, 1.9981, 2.0001, 2.1734, 2.3453, 2.6878, 2.8584, 3.029, 3.1995, 3.1982, 3.3688, 3.5394, 3.7099, 3.7086, 3.8792, 4.0491, 4.2197, 4.3903, 4.3896, 4.5595, 4.5582, 4.7287, 4.7267, 4.8973, 5.0672, 5.0659, 5.0646, 5.0625, 5.2331, 5.4037, 5.5736, 5.7442, 6.0874, 6.4312, 6.7757, 7.1202, 7.2915, 7.6346, 7.8052, 7.9758, 8.1464, 8.145, 8.3156, 8.3143, 8.4842, 8.6548, 8.6534, 8.8233, 8.9939, 9.1645, 9.5077, 9.8522, 10.025, 10.369, 10.543, 10.887, 11.06, 11.232, 11.747, 12.09, 12.606, 12.949, 13.465, 13.98, 14.323, 14.321, 14.492, 14.662, 14.832, 15.001, 15.17, 15.341, 15.511, 15.679, 15.849, 16.019, 16.189, 16.187, 16.529, 16.699, 16.87, 17.213, 17.558, 17.732, 17.905, 18.078, 18.251, 18.425, 18.599, 18.944, 19.288, 19.632, 19.975, 20.318, 20.662, 21.006, 21.351, 21.695, 22.04, 22.556, 22.9, 23.244, 23.588, 23.933, 24.278, 24.451, 24.624, 24.798, 24.972, 25.146, 25.319, 25.493, 25.667, 25.842, 26.017, 26.192, 26.366, 26.54, 26.713, 26.887, 27.061, 27.405, 27.748, 27.919, 28.09, 28.26, 28.431, 28.773, 29.116, 29.459, 29.976, 30.32, 30.665, 31.009, 31.353, 31.868, 32.212, 32.555, 32.899, 33.244, 33.416, 33.758, 33.929, 34.1, 34.271, 34.441, 34.612, 34.782, 34.952, 35.121, 35.291, 35.46, 35.628, 35.798, 35.967, 36.138, 36.308, 36.48, 36.825, 36.997, 37.17, 37.344, 37.517, 37.69, 37.863, 38.207, 38.551, 38.894, 39.065, 39.409, 39.926, 40.442, 40.786, 41.129, 41.473, 41.818, 41.991, 42.165, 42.338, 42.512, 42.686, 42.688, 42.862, 43.036, 43.212, 43.386, 43.388, 43.562, 43.736, 43.909, 44.252, 44.422, 44.593, 44.764, 45.106, 45.45, 45.966, 46.482, 46.826, 47.17, 47.686, 48.029, 48.199, 48.368, 48.366, 48.536, 48.706, 48.874, 48.872, 49.04, 49.21, 49.381, 49.725, 49.898, 49.9, 50.245, 50.589, 50.76, 51.276, 51.621, 51.965, 52.138, 52.312, 52.315, 52.321, 52.49, 52.492, 52.495, 52.669, 52.671, 52.673, 53.017, 53.361, 53.877, 54.046, 54.044, 54.042, 54.04, 54.037, 54.034, 54.032, 53.857, 53.689, 53.691, 53.693, 53.523, 53.698, 53.356, 53.186, 53.192, 53.023, 53.026, 52.858, 52.688, 52.518, 52.343, 52.168, 51.993, 51.819, 51.474, 51.131, 50.788, 50.445, 50.275, 50.104, 49.934, 49.591, 49.248, 48.903, 48.558, 48.215, 48.045, 47.876, 47.877, 47.708, 47.711, 47.542, 47.375, 47.207, 47.039, 46.87, 46.7, 46.186, 45.844, 45.329, 44.987, 44.472, 44.128, 43.612, 43.097, 42.755, 42.413, 42.414, 42.073, 41.732, 41.561, 41.391, 41.221, 40.877, 40.531, 40.357, 40.183, 40.01, 39.836, 39.663, 39.318, 38.974, 38.803, 38.462, 38.293, 38.124, 37.784, 37.444, 37.275, 37.105, 36.935, 36.42, 36.076, 35.732, 35.388, 35.044, 34.527, 34.011, 33.665, 33.319, 32.972, 32.626, 32.452, 32.106, 31.934, 31.59, 31.248, 30.906, 30.565, 30.223, 29.881, 29.365, 29.019, 28.672, 28.498, 28.323, 27.976, 27.801, 27.453, 27.107, 26.935, 26.762, 26.417, 25.901, 25.385, 24.87, 24.355, 23.84, 23.498, 23.328, 23.157, 22.987, 22.816, 22.646, 22.475, 22.132, 21.788, 21.444, 21.098, 20.751, 20.405, 20.059, 19.886, 19.542, 19.2, 19.029, 18.859, 18.518, 18.348, 18.178, 18.009, 17.839, 17.497, 17.326, 16.983, 16.468, 15.78, 15.265, 14.576, 14.23, 13.885, 13.71, 13.537, 13.363, 13.018, 12.844, 12.5, 12.157, 11.814, 11.644, 11.474, 11.303, 10.961, 10.617, 10.272, 10.099, 9.9257, 9.7518, 9.5772, 9.4026, 9.23, 9.0555, 8.8809, 8.7083, 8.535, 8.1905, 7.8453, 7.3289, 6.9851, 6.6412, 6.1262, 5.7857, 5.6158, 5.4458, 5.1034, 4.7588, 4.5856, 4.4117, 4.2377, 4.0638, 3.8912, 3.7186, 3.3755, 3.2056, 3.0357, 2.8664, 2.6965, 2.5273, 2.3573, 2.0149, 1.4998, 0.98267, 0.98067, 0.97866, 0.80474, 0.8034, 0.63014, 0.45822, 0.11439]
[Xmin, IXmin] = min(X)
X = np.roll(X, 1 - IXmin)
F = np.roll(F, 1 - IXmin)
[Xmax, IXmax] = max(X)
Xu = X[0:IXmax]
Xd = X[IXmax:len(X)]
Xd.push(X[0])
Fu = F[0:IXmax]
Fd = F[IXmax:len(X)]
Fd.push(F[0])
S = Xmax - Xmin
Xi = [0.10168, 0.111692778, 0.13196366, 0.162450928, 0.203107855, 0.253882838, 0.314719538, 0.385557016, 0.466329871, 0.556968385, 0.65739866, 0.767542759, 0.887318849, 1.016641341, 1.155421026, 1.303565219, 1.460977889, 1.6275598, 1.80320864, 1.987819156, 2.181283279, 2.383490252, 2.594326755, 2.813677023, 3.041422967, 3.277444288, 3.521618587, 3.773821477, 4.033926687, 4.301806164, 4.577330175, 4.860367396, 5.150785014, 5.448448807, 5.753223235, 6.064971523, 6.383555736, 6.708836859, 7.040674868, 7.378928801, 7.723456822, 8.074116288, 8.430763807, 8.793255299, 9.161446046, 9.53519075, 9.914343578, 10.29875821, 10.6882879, 11.08278548, 11.48210343, 11.88609393, 12.29460886, 12.70749983, 13.12461828, 13.54581543, 13.97094234, 14.39984995, 14.8323891, 15.26841055, 15.70776498, 16.15030306, 16.59587544, 17.04433279, 17.49552579, 17.94930517, 18.40552174, 18.86402637, 19.32467006, 19.78730391, 20.25177917, 20.71794722, 21.18565964, 21.65476819, 22.12512482, 22.59658173, 23.06899135, 23.54220637, 24.01607978, 24.49046486, 24.96521521, 25.44018477, 25.91522788, 26.39019925, 26.864954, 27.33934771, 27.81323643, 28.28647671, 28.75892562, 29.2304408, 29.70088048, 30.17010353, 30.63796946, 31.10433849, 31.5690716, 32.03203051, 32.49307779, 32.95207685, 33.40889204, 33.86338863, 34.31543289, 34.76489217, 35.2116349, 35.65553064, 36.09645018, 36.53426556, 36.96885013, 37.4000786, 37.82782711, 38.25197327, 38.67239623, 39.08897675, 39.50159723, 39.91014179, 40.31449631, 40.71454852, 41.11018804, 41.50130641, 41.88779722, 42.26955608, 42.64648076, 43.01847117, 43.38542946, 43.74726007, 44.10386975, 44.45516765, 44.80106533, 45.14147682, 45.47631866, 45.80550996, 46.12897239, 46.44663024, 46.75841048, 47.06424272, 47.36405929, 47.65779525, 47.94538839, 48.22677923, 48.5019111, 48.77073005, 49.03318493, 49.28922733, 49.53881164, 49.78189496, 50.01843717, 50.24840083, 50.47175123, 50.68845631, 50.8984867, 51.10181559, 51.29841878, 51.48827461, 51.6713639, 51.84766995, 52.01717844, 52.17987741, 52.33575719, 52.48481037, 52.62703172, 52.76241813, 52.89096853, 53.01268389, 53.12756708, 53.23562284, 53.3368577, 53.43127994, 53.51889947, 53.59972779, 53.67377794, 53.74106438, 53.80160294, 53.85541079, 53.90250628, 53.94290897, 53.97663949, 54.00371951, 54.02417164, 54.03801941, 54.04528716, 54.046, 54.04018376, 54.02786489, 54.00907046, 53.98382803, 53.95216567, 53.91411185, 53.86969545, 53.81894562, 53.76189185, 53.69856383, 53.62899145, 53.55320476, 53.47123393, 53.38310922, 53.28886093, 53.1885194, 53.08211497, 52.96967792, 52.85123853, 52.72682697, 52.59647335, 52.46020767, 52.31805981, 52.17005956, 52.01623653, 51.85662026, 51.69124009, 51.52012528, 51.34330491, 51.16080797, 50.97266331, 50.77889967, 50.57954568, 50.37462992, 50.16418087, 49.94822697, 49.72679663, 49.49991826, 49.26762028, 49.02993118, 48.78687952, 48.53849395, 48.2848033, 48.02583657, 47.76162296, 47.49219198, 47.2175734, 46.93779736, 46.65289442, 46.36289555, 46.06783225, 45.76773656, 45.46264114, 45.1525793, 44.8375851, 44.51769336, 44.19293978, 43.86336097, 43.52899451, 43.18987904, 42.84605434, 42.49756136, 42.14444234, 41.78674086, 41.42450191, 41.057772, 40.6865992, 40.31103326, 39.93112565, 39.54692968, 39.15850056, 38.76589551, 38.3691738, 37.96839688, 37.56362844, 37.15493451, 36.74238354, 36.32604648, 35.90599687, 35.48231092, 35.0550676, 34.62434871, 34.19023899, 33.75282616, 33.31220102, 32.8684575, 32.4216928, 31.97200735, 31.51950499, 31.06429294, 30.60648193, 30.14618619, 29.68352357, 29.21861553, 28.7515872, 28.2825674, 27.81168873, 27.33908749, 26.86490378, 26.38928149, 25.91236828, 25.4343156, 24.95527863, 24.47541634, 23.99489139, 23.5138701, 23.03252244, 22.55102193, 22.0695456, 21.58827392, 21.10739066, 20.62708288, 20.14754073, 19.66895741, 19.19152901, 18.71545439, 18.24093498, 17.76817472, 17.2973798, 16.82875854, 16.36252121, 15.89887979, 15.43804781, 14.98024012, 14.52567268, 14.07456235, 13.62712662, 13.18358339, 12.74415076, 12.30904672, 11.87848894, 11.4526945, 11.03187963, 10.61625945, 10.20604771, 9.801456512, 9.402696059, 9.009974389, 8.623497114, 8.243467156, 7.870084499, 7.503545932, 7.144044805, 6.791770785, 6.446909627, 6.109642939, 5.780147969, 5.458597387, 5.145159087, 4.839995992, 4.54326587, 4.255121159, 3.97570881, 3.705170133, 3.443640654, 3.191249996, 2.948121753, 2.714373392, 2.490116162, 2.275455011, 2.070488521, 1.875308851, 1.690001699, 1.514646263, 1.349315229, 1.194074759, 1.048984495, 0.914097574, 0.789460652, 0.675113939, 0.571091244, 0.477420029, 0.394121474, 0.321210542, 0.258696068, 0.206580837, 0.164861684, 0.133529591, 0.112569796, 0.101961904 ]
Ni = len(Xi)
Xi_new = Xi.push(Xi[0])
Xi = scipy.interpolate.interp1d(np.linspace(0,1,Ni+1), )

View File

@@ -0,0 +1,12 @@
import numpy as np
class BackPropagationNetwork:
#
# Class Members
#
layerCount = 0
shape = None
weights = []

30
WellBore/drawWellBore.py Normal file
View File

@@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 23 18:23:25 2015
@author: patrickjmcd
"""
import csv
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
f = open('melinda254.csv', 'rb')
reader = csv.reader(f)
headers = reader.next()
csv_data = {}
for h in headers:
csv_data[h] = []
for row in reader:
for h,v in zip(headers, row):
csv_data[h].append(float(v))
csv_data['Depth'] = map(lambda x: -1*x, csv_data['Depth'])
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(csv_data['Northings'], csv_data['Eastings'], csv_data['Depth'])
plt.show()

171
WellBore/melinda252.csv Normal file
View File

@@ -0,0 +1,171 @@
Depth,Northings,Eastings
0,0,0
199.99,0.36,1.44
399.97,1,4.58
599.94,1.17,8.05
799.9,0.99,11.78
999.87,0.91,15.35
1199.84,0.71,18.55
1399.83,0.59,20.76
1599.83,0.33,21.89
1703.82,0.15,22.61
1861.82,0.29,24.11
1987.81,0.94,25.47
2114.79,2.26,27.1
2240.77,3.73,29.15
2366.74,5.38,31.32
2492.71,7.24,33.35
2619.67,9.23,35.43
2745.64,11.42,37.25
2871.61,13.58,38.76
2997.59,15.72,40.3
3124.55,18.16,41.82
3250.52,20.9,43.24
3376.47,23.85,44.41
3502.43,26.92,45.28
3629.39,30.16,46.38
3755.34,33.4,47.75
3881.3,36.18,48.76
4007.28,38.65,49.3
4134.26,41.05,49.7
4260.23,43.76,50.2
4387.18,46.93,50.68
4513.14,50.3,51.17
4639.08,54.1,51.83
4765.03,57.46,52.05
4892.02,58.95,51.49
5018.02,59.45,51.06
5144.02,59.69,50.83
5270.02,59.61,50.63
5396.02,59.74,50.81
5523.02,59.87,50.99
5649.02,60.08,50.95
5775.02,60,50.79
5902.01,58.8,50.64
6027.99,56.5,49.8
6153.95,53.92,48.64
6280.94,51.99,48.12
6406.93,50.48,47.86
6532.92,49.18,47.64
6658.92,48.23,47.37
6784.91,47.27,46.88
6910.91,46.3,46.38
7037.9,45.43,46.29
7163.9,44.74,46.79
7289.89,44.15,47.97
7416.88,44.13,49.85
7542.85,44.8,52.29
7668.84,44.67,54.43
7795.82,43.09,55.24
7921.81,41.74,55.78
8048.79,40.87,57.57
8174.76,39.07,59.88
8301.71,35.89,61.24
8427.65,32,61.94
8553.58,27.9,62.22
8680.5,23.77,60.7
8806.44,20.4,58.42
8932.4,17.86,56.51
8997.38,16.86,55.58
9049.37,16.16,54.87
9080.37,15.83,54.44
9112.36,15.89,53.98
9143.33,17.22,53.61
9175.15,20.53,53.63
9206.75,25.54,54.28
9237.07,31.89,55.24
9268.03,39.89,56.43
9297.61,49.04,57.91
9327.54,60.22,59.62
9356.71,73.25,61.28
9384.13,87.62,62.88
9411.49,104.11,64.55
9437.02,121.62,66.06
9462.11,141.43,67.29
9485.68,163.05,68.01
9506.96,185.59,68.22
9526.98,210.53,67.8
9543.93,236.44,66.54
9558.78,264.61,63.57
9570.95,292.61,58.24
9581.23,321.96,50.78
9588.33,351,42.61
9592.32,380.42,33.75
9594.42,410.88,24.18
9595.42,440.42,14.84
9595.78,470.91,5.14
9595.89,500.39,-4.47
9595.89,530.74,-14.6
9596.06,591.35,-35.17
9595.67,650.93,-55.63
9594.91,709.42,-76.17
9594.64,768.7,-97.51
9594.92,828.74,-119.66
9595.14,887.52,-142.34
9594.7,946.23,-165.17
9593.65,1005.31,-187.02
9592.44,1064.88,-207.48
9591.51,1124.92,-226.53
9590.5,1186.17,-245.08
9589.07,1246.38,-263.54
9587.81,1306.55,-282.17
9586.66,1366.85,-300.37
9584.84,1427.19,-318.42
9582.55,1488.35,-337.12
9580.74,1548.46,-355.9
9579.8,1608.79,-374
9579.09,1669.41,-391.15
9577.99,1730.02,-408.3
9576.45,1790.45,-426.03
9575.28,1851.79,-444.26
9574.51,1912.27,-461.88
9573.68,1973.03,-478.51
9572.62,2035.09,-494.1
9571.52,2096.32,-508.91
9571.3,2157.48,-523.99
9570.64,2218.58,-539.33
9569.05,2279.44,-555.53
9567.37,2340.78,-573.7
9565.28,2400.83,-592.63
9562.87,2460.69,-612.14
9561.38,2520.53,-631.76
9560.72,2580.63,-650.65
9560.28,2640.81,-669.28
9560.11,2701.74,-688.84
9559.67,2761.43,-708.99
9559.73,2820.98,-729.55
9560.11,2880.71,-749.59
9559.02,2940.59,-769.11
9557.15,3000.57,-788.3
9556.53,3061.53,-807.76
9556.7,3121.5,-827.07
9556.31,3181.42,-846.54
9555.54,3240.9,-867.26
9554.77,3299.81,-889.57
9554.77,3359.4,-912.93
9555.72,3419.16,-935.81
9557.04,3478.4,-957.19
9558.6,3538.77,-978.39
9559.39,3599.11,-999.7
9557.57,3658.59,-1020.36
9553.61,3719.22,-1040.47
9549.65,3779.2,-1059.32
9545.97,3840.51,-1077.31
9542.84,3901.19,-1093.96
9540.16,3962.94,-1110.57
9537.57,4023.93,-1126.11
9534.84,4086.34,-1140.01
9532.25,4148.07,-1152.34
9529.8,4210.86,-1164.49
9526.99,4272.55,-1176.93
9524.15,4335.04,-1190.44
9521.89,4396.45,-1204.34
9520,4458.81,-1218.62
9518.02,4520.16,-1232.78
9515.34,4582.31,-1247.82
9511.6,4644.12,-1263.98
9506.87,4704.63,-1280.87
9501.68,4765.81,-1298.93
9495.92,4825.74,-1317.48
9491.46,4865.52,-1330.18
9485.99,4911.86,-1345.15
1 Depth Northings Eastings
2 0 0 0
3 199.99 0.36 1.44
4 399.97 1 4.58
5 599.94 1.17 8.05
6 799.9 0.99 11.78
7 999.87 0.91 15.35
8 1199.84 0.71 18.55
9 1399.83 0.59 20.76
10 1599.83 0.33 21.89
11 1703.82 0.15 22.61
12 1861.82 0.29 24.11
13 1987.81 0.94 25.47
14 2114.79 2.26 27.1
15 2240.77 3.73 29.15
16 2366.74 5.38 31.32
17 2492.71 7.24 33.35
18 2619.67 9.23 35.43
19 2745.64 11.42 37.25
20 2871.61 13.58 38.76
21 2997.59 15.72 40.3
22 3124.55 18.16 41.82
23 3250.52 20.9 43.24
24 3376.47 23.85 44.41
25 3502.43 26.92 45.28
26 3629.39 30.16 46.38
27 3755.34 33.4 47.75
28 3881.3 36.18 48.76
29 4007.28 38.65 49.3
30 4134.26 41.05 49.7
31 4260.23 43.76 50.2
32 4387.18 46.93 50.68
33 4513.14 50.3 51.17
34 4639.08 54.1 51.83
35 4765.03 57.46 52.05
36 4892.02 58.95 51.49
37 5018.02 59.45 51.06
38 5144.02 59.69 50.83
39 5270.02 59.61 50.63
40 5396.02 59.74 50.81
41 5523.02 59.87 50.99
42 5649.02 60.08 50.95
43 5775.02 60 50.79
44 5902.01 58.8 50.64
45 6027.99 56.5 49.8
46 6153.95 53.92 48.64
47 6280.94 51.99 48.12
48 6406.93 50.48 47.86
49 6532.92 49.18 47.64
50 6658.92 48.23 47.37
51 6784.91 47.27 46.88
52 6910.91 46.3 46.38
53 7037.9 45.43 46.29
54 7163.9 44.74 46.79
55 7289.89 44.15 47.97
56 7416.88 44.13 49.85
57 7542.85 44.8 52.29
58 7668.84 44.67 54.43
59 7795.82 43.09 55.24
60 7921.81 41.74 55.78
61 8048.79 40.87 57.57
62 8174.76 39.07 59.88
63 8301.71 35.89 61.24
64 8427.65 32 61.94
65 8553.58 27.9 62.22
66 8680.5 23.77 60.7
67 8806.44 20.4 58.42
68 8932.4 17.86 56.51
69 8997.38 16.86 55.58
70 9049.37 16.16 54.87
71 9080.37 15.83 54.44
72 9112.36 15.89 53.98
73 9143.33 17.22 53.61
74 9175.15 20.53 53.63
75 9206.75 25.54 54.28
76 9237.07 31.89 55.24
77 9268.03 39.89 56.43
78 9297.61 49.04 57.91
79 9327.54 60.22 59.62
80 9356.71 73.25 61.28
81 9384.13 87.62 62.88
82 9411.49 104.11 64.55
83 9437.02 121.62 66.06
84 9462.11 141.43 67.29
85 9485.68 163.05 68.01
86 9506.96 185.59 68.22
87 9526.98 210.53 67.8
88 9543.93 236.44 66.54
89 9558.78 264.61 63.57
90 9570.95 292.61 58.24
91 9581.23 321.96 50.78
92 9588.33 351 42.61
93 9592.32 380.42 33.75
94 9594.42 410.88 24.18
95 9595.42 440.42 14.84
96 9595.78 470.91 5.14
97 9595.89 500.39 -4.47
98 9595.89 530.74 -14.6
99 9596.06 591.35 -35.17
100 9595.67 650.93 -55.63
101 9594.91 709.42 -76.17
102 9594.64 768.7 -97.51
103 9594.92 828.74 -119.66
104 9595.14 887.52 -142.34
105 9594.7 946.23 -165.17
106 9593.65 1005.31 -187.02
107 9592.44 1064.88 -207.48
108 9591.51 1124.92 -226.53
109 9590.5 1186.17 -245.08
110 9589.07 1246.38 -263.54
111 9587.81 1306.55 -282.17
112 9586.66 1366.85 -300.37
113 9584.84 1427.19 -318.42
114 9582.55 1488.35 -337.12
115 9580.74 1548.46 -355.9
116 9579.8 1608.79 -374
117 9579.09 1669.41 -391.15
118 9577.99 1730.02 -408.3
119 9576.45 1790.45 -426.03
120 9575.28 1851.79 -444.26
121 9574.51 1912.27 -461.88
122 9573.68 1973.03 -478.51
123 9572.62 2035.09 -494.1
124 9571.52 2096.32 -508.91
125 9571.3 2157.48 -523.99
126 9570.64 2218.58 -539.33
127 9569.05 2279.44 -555.53
128 9567.37 2340.78 -573.7
129 9565.28 2400.83 -592.63
130 9562.87 2460.69 -612.14
131 9561.38 2520.53 -631.76
132 9560.72 2580.63 -650.65
133 9560.28 2640.81 -669.28
134 9560.11 2701.74 -688.84
135 9559.67 2761.43 -708.99
136 9559.73 2820.98 -729.55
137 9560.11 2880.71 -749.59
138 9559.02 2940.59 -769.11
139 9557.15 3000.57 -788.3
140 9556.53 3061.53 -807.76
141 9556.7 3121.5 -827.07
142 9556.31 3181.42 -846.54
143 9555.54 3240.9 -867.26
144 9554.77 3299.81 -889.57
145 9554.77 3359.4 -912.93
146 9555.72 3419.16 -935.81
147 9557.04 3478.4 -957.19
148 9558.6 3538.77 -978.39
149 9559.39 3599.11 -999.7
150 9557.57 3658.59 -1020.36
151 9553.61 3719.22 -1040.47
152 9549.65 3779.2 -1059.32
153 9545.97 3840.51 -1077.31
154 9542.84 3901.19 -1093.96
155 9540.16 3962.94 -1110.57
156 9537.57 4023.93 -1126.11
157 9534.84 4086.34 -1140.01
158 9532.25 4148.07 -1152.34
159 9529.8 4210.86 -1164.49
160 9526.99 4272.55 -1176.93
161 9524.15 4335.04 -1190.44
162 9521.89 4396.45 -1204.34
163 9520 4458.81 -1218.62
164 9518.02 4520.16 -1232.78
165 9515.34 4582.31 -1247.82
166 9511.6 4644.12 -1263.98
167 9506.87 4704.63 -1280.87
168 9501.68 4765.81 -1298.93
169 9495.92 4825.74 -1317.48
170 9491.46 4865.52 -1330.18
171 9485.99 4911.86 -1345.15

146
WellBore/melinda254.csv Normal file
View File

@@ -0,0 +1,146 @@
Depth,Northings,Eastings
0,0,0
100,-0.33,0.25
199.99,-1.13,0.81
299.99,-1.54,1.85
399.98,-2.36,3.04
499.96,-2.72,4.97
599.92,-3.1,7.62
699.9,-4.07,9.54
799.87,-5.58,11.17
899.86,-6.56,12.54
999.84,-7.72,13.71
1099.83,-8.22,14.72
1199.83,-9.31,15.06
1299.82,-10.17,15.48
1399.82,-11.18,15.39
1499.81,-11.85,15.78
1599.81,-12.55,15.48
1699.8,-13.73,14.9
1799.79,-14.82,15.3
1899.79,-15.4,15.58
1999.79,-15.43,15.33
2099.79,-15.53,15.45
2199.79,-15.07,15.33
2299.79,-14.97,15.09
2399.79,-15.01,14.63
2499.78,-14.66,14.02
2599.78,-14.32,13.1
2699.77,-13.64,13
2799.77,-12.66,13.2
2899.76,-11.51,13.56
2999.75,-10.25,13.85
3099.74,-8.86,13.94
3199.73,-7.79,14.5
3299.71,-6.14,15.48
3399.69,-4.48,16.59
3499.68,-3.17,17.28
3599.67,-1.65,18.21
3699.66,-0.81,19
3799.65,0.48,19.93
3899.63,2.1,21.01
3999.61,3.69,22.03
4099.58,5.73,23.24
4199.57,6.85,24.03
4299.56,8.03,25.12
4399.53,9.69,26.35
4499.51,11.49,27.75
4599.46,13.44,30.11
4699.42,15.77,31.36
4799.38,17.71,33.42
4899.35,19.27,35.19
4999.34,20.08,36.23
5099.33,20.29,37.52
5199.33,20.79,38.03
5299.32,20.65,39.26
5399.31,20.36,40.74
5499.3,20.22,41.93
5599.29,19.77,43.34
5699.29,19.77,43.98
5799.29,19.27,44.79
5899.28,18.55,45.52
5999.27,17.35,45.75
6099.26,16.14,45.07
6199.26,15.87,44.37
6299.25,15.36,43.82
6399.25,15.71,43.43
6499.25,15.58,42.8
6599.25,15.53,42.19
6699.24,16.02,41.7
6799.24,15.89,41.13
6899.24,15.73,41.17
6999.24,15.77,41.49
7099.24,15.64,41.16
7199.23,15.91,39.87
7299.21,16.48,38.09
7399.17,18.79,36.42
7499.16,20.21,35.78
7599.15,21,36.6
7699.11,21.97,38.99
7799.02,23.9,42.73
7898.98,25.29,45.16
7998.97,26.38,45.51
8098.96,27.58,44.43
8198.95,28.08,43.25
8298.93,28.91,41.25
8398.88,28.64,38.42
8498.86,28.54,36.05
8598.83,29.75,34.38
8698.81,31.31,33.26
8798.8,32.57,32.61
8898.8,33.4,31.82
8998.78,34.4,30.69
9098.21,43.02,27.53
9193.48,71.25,18.27
9280.34,119.49,8.62
9357.9,179.92,-9.06
9424.72,249.84,-34.1
9479.19,330.19,-57.65
9517.6,418.81,-82.95
9541.53,512.14,-109.48
9555.24,606.96,-137.83
9558.16,703.18,-164.9
9560.78,798.81,-193.98
9563.45,893.01,-227.43
9565.16,988.21,-257.97
9566.63,1083.65,-287.8
9567.58,1179.11,-317.56
9567.8,1274.71,-346.86
9566.7,1370.83,-374.39
9564.42,1467.43,-400.17
9562.05,1564.5,-424.05
9559.6,1661.42,-448.58
9557.08,1758.46,-472.59
9554.28,1855.14,-497.96
9552.14,1951.81,-523.48
9551.17,2048.79,-547.83
9553.1,2145.95,-571.38
9555.42,2242.89,-595.82
9556.48,2339.8,-620.47
9555.22,2436.9,-644.3
9554.24,2533.89,-668.65
9552.68,2630.51,-694.34
9552.9,2726.64,-721.89
9551.95,2822.73,-749.58
9549.18,2919.02,-776.39
9544.82,3015.65,-801.73
9542.42,3112.25,-827.45
9543.04,3208.62,-854.15
9542.04,3305.07,-880.52
9539.22,3402.13,-904.4
9539.67,3498.9,-929.58
9541.02,3595.24,-956.35
9542.06,3691.21,-984.42
9542.26,3787.73,-1010.56
9542.24,3884.89,-1034.22
9541,3982.12,-1057.55
9539.24,4079.14,-1081.72
9537.89,4176.18,-1105.81
9536.18,4273.1,-1130.37
9534.93,4369.84,-1155.69
9534.45,4466.39,-1181.72
9534.09,4562.03,-1210.85
9534.13,4656.6,-1243.35
9533.28,4752.09,-1273.03
9530.08,4847.78,-1301.88
9527.2,4919.36,-1324.18
1 Depth Northings Eastings
2 0 0 0
3 100 -0.33 0.25
4 199.99 -1.13 0.81
5 299.99 -1.54 1.85
6 399.98 -2.36 3.04
7 499.96 -2.72 4.97
8 599.92 -3.1 7.62
9 699.9 -4.07 9.54
10 799.87 -5.58 11.17
11 899.86 -6.56 12.54
12 999.84 -7.72 13.71
13 1099.83 -8.22 14.72
14 1199.83 -9.31 15.06
15 1299.82 -10.17 15.48
16 1399.82 -11.18 15.39
17 1499.81 -11.85 15.78
18 1599.81 -12.55 15.48
19 1699.8 -13.73 14.9
20 1799.79 -14.82 15.3
21 1899.79 -15.4 15.58
22 1999.79 -15.43 15.33
23 2099.79 -15.53 15.45
24 2199.79 -15.07 15.33
25 2299.79 -14.97 15.09
26 2399.79 -15.01 14.63
27 2499.78 -14.66 14.02
28 2599.78 -14.32 13.1
29 2699.77 -13.64 13
30 2799.77 -12.66 13.2
31 2899.76 -11.51 13.56
32 2999.75 -10.25 13.85
33 3099.74 -8.86 13.94
34 3199.73 -7.79 14.5
35 3299.71 -6.14 15.48
36 3399.69 -4.48 16.59
37 3499.68 -3.17 17.28
38 3599.67 -1.65 18.21
39 3699.66 -0.81 19
40 3799.65 0.48 19.93
41 3899.63 2.1 21.01
42 3999.61 3.69 22.03
43 4099.58 5.73 23.24
44 4199.57 6.85 24.03
45 4299.56 8.03 25.12
46 4399.53 9.69 26.35
47 4499.51 11.49 27.75
48 4599.46 13.44 30.11
49 4699.42 15.77 31.36
50 4799.38 17.71 33.42
51 4899.35 19.27 35.19
52 4999.34 20.08 36.23
53 5099.33 20.29 37.52
54 5199.33 20.79 38.03
55 5299.32 20.65 39.26
56 5399.31 20.36 40.74
57 5499.3 20.22 41.93
58 5599.29 19.77 43.34
59 5699.29 19.77 43.98
60 5799.29 19.27 44.79
61 5899.28 18.55 45.52
62 5999.27 17.35 45.75
63 6099.26 16.14 45.07
64 6199.26 15.87 44.37
65 6299.25 15.36 43.82
66 6399.25 15.71 43.43
67 6499.25 15.58 42.8
68 6599.25 15.53 42.19
69 6699.24 16.02 41.7
70 6799.24 15.89 41.13
71 6899.24 15.73 41.17
72 6999.24 15.77 41.49
73 7099.24 15.64 41.16
74 7199.23 15.91 39.87
75 7299.21 16.48 38.09
76 7399.17 18.79 36.42
77 7499.16 20.21 35.78
78 7599.15 21 36.6
79 7699.11 21.97 38.99
80 7799.02 23.9 42.73
81 7898.98 25.29 45.16
82 7998.97 26.38 45.51
83 8098.96 27.58 44.43
84 8198.95 28.08 43.25
85 8298.93 28.91 41.25
86 8398.88 28.64 38.42
87 8498.86 28.54 36.05
88 8598.83 29.75 34.38
89 8698.81 31.31 33.26
90 8798.8 32.57 32.61
91 8898.8 33.4 31.82
92 8998.78 34.4 30.69
93 9098.21 43.02 27.53
94 9193.48 71.25 18.27
95 9280.34 119.49 8.62
96 9357.9 179.92 -9.06
97 9424.72 249.84 -34.1
98 9479.19 330.19 -57.65
99 9517.6 418.81 -82.95
100 9541.53 512.14 -109.48
101 9555.24 606.96 -137.83
102 9558.16 703.18 -164.9
103 9560.78 798.81 -193.98
104 9563.45 893.01 -227.43
105 9565.16 988.21 -257.97
106 9566.63 1083.65 -287.8
107 9567.58 1179.11 -317.56
108 9567.8 1274.71 -346.86
109 9566.7 1370.83 -374.39
110 9564.42 1467.43 -400.17
111 9562.05 1564.5 -424.05
112 9559.6 1661.42 -448.58
113 9557.08 1758.46 -472.59
114 9554.28 1855.14 -497.96
115 9552.14 1951.81 -523.48
116 9551.17 2048.79 -547.83
117 9553.1 2145.95 -571.38
118 9555.42 2242.89 -595.82
119 9556.48 2339.8 -620.47
120 9555.22 2436.9 -644.3
121 9554.24 2533.89 -668.65
122 9552.68 2630.51 -694.34
123 9552.9 2726.64 -721.89
124 9551.95 2822.73 -749.58
125 9549.18 2919.02 -776.39
126 9544.82 3015.65 -801.73
127 9542.42 3112.25 -827.45
128 9543.04 3208.62 -854.15
129 9542.04 3305.07 -880.52
130 9539.22 3402.13 -904.4
131 9539.67 3498.9 -929.58
132 9541.02 3595.24 -956.35
133 9542.06 3691.21 -984.42
134 9542.26 3787.73 -1010.56
135 9542.24 3884.89 -1034.22
136 9541 3982.12 -1057.55
137 9539.24 4079.14 -1081.72
138 9537.89 4176.18 -1105.81
139 9536.18 4273.1 -1130.37
140 9534.93 4369.84 -1155.69
141 9534.45 4466.39 -1181.72
142 9534.09 4562.03 -1210.85
143 9534.13 4656.6 -1243.35
144 9533.28 4752.09 -1273.03
145 9530.08 4847.78 -1301.88
146 9527.2 4919.36 -1324.18

442
cardAnalysis.py Normal file
View File

@@ -0,0 +1,442 @@
# Python program to analyze cards
import matplotlib.pyplot as plt
import numpy as np
import readCardFile as rcf
# Setup Data
slices = 250 # number of horizontal slices to evaluate
pctTop = 10 # when finding corners, percent below maximum to search
pctBottom = 10 # when finding corners, percent above minimum to search
pumpTapPercent = 35 # percentage of downhole load span to be considered 100% tapping
tubingMovementPctStroke = 25 # percentage of stroke taken up by tubing movement to consider score of 100
downhole = rcf.readFile()[1]
# Mostly Full Card
# downhole = [[64.577, -4503.565], [65.055, -4507.592], [65.432, -4493.037], [65.851, -4599.1], [66.291, -4735.827], [66.561, -4853.273], [66.682, -4899.307], [66.787, -4918.142], [66.89, -4929.726], [67.001, -4983.405], [67.108, -4978.893], [67.128, -4937.433], [67.101, -4955.286], [67.019, -4990.838], [66.86, -5014.888], [66.609, -5034.405], [66.286, -5053.554], [65.872, -5107.013], [65.38, -5126.4], [64.761, -5138.246], [64.073, -5152.267], [63.318, -5237.705], [62.387, -5360.465], [61.333, -5386.295], [60.202, -5427.148], [59.121, -5698.709], [58.068, -5775.45], [56.748, -5961.322], [55.738, -6598.427], [54.947, -7069.938], [54.472, -7458.419], [54.264, -7766.768], [54.231, -7900.823], [54.274, -7919.208], [54.493, -8065.488], [54.798, -8058.136], [54.94, -7923.052], [55.063, -7913.114], [55.224, -7932.654], [55.324, -7964.23], [55.394, -7934.037], [55.398, -7917.927], [55.438, -8037.331], [55.527, -8057.723], [55.46, -7971.96], [55.368, -7845.327], [55.488, -8151.271], [55.302, -8644.739], [54.942, -8993.722], [54.33, -9503.194], [53.228, -9900.778], [51.617, -9812.004], [49.266, -9620.005], [46.471, -9609.26], [43.288, -9329.185], [39.96, -9250.057], [36.341, -9366.431], [32.531, -9379.656], [28.688, -9408.648], [24.829, -9418.401], [20.988, -9513.613], [17.209, -9660.981], [13.48, -9622.327], [9.957, -9654.526], [6.484, -9772.297], [3.101, -9758.53], [-0.097, -9737.41], [-3.072, -9726.858], [-5.92, -9730.714], [-8.554, -9710.393], [-11.079, -9383.728], [-13.231, -9137.783], [-15.146, -8857.06], [-16.522, -8288.292], [-17.249, -7753.214], [-17.524, -6990.508], [-17.425, -6589.685], [-16.774, -6192.202], [-16.215, -5397.993], [-15.67, -4906.086], [-15.105, -4564.741], [-14.478, -4324.163], [-13.793, -4192.837], [-13.014, -4094.249], [-12.14, -3961.145], [-11.155, -3976.249], [-9.957, -4033.805], [-8.689, -4038.992], [-7.438, -4063.336], [-6.192, -3982.634], [-4.922, -3940.978], [-3.642, -3944.722], [-2.381, -3955.24], [-1.204, -4037.927], [-0.213, -4031.55], [0.623, -4048.03], [1.238, -3668.058], [2.166, -3223.797], [3.326, -3193.519], [4.675, -3049.454], [6.405, -2941.393], [8.566, -3218.628], [11.119, -3568.049], [13.674, -3672.504], [16.261, -3844.035], [18.726, -3851.298], [21.175, -3785.033], [23.526, -3837.698], [25.733, -3859.446], [27.746, -3803.885], [29.603, -3773.95], [31.459, -3777.372], [33.243, -3804.467], [34.927, -3828.283], [36.52, -3770.409], [38.017, -3681.814], [39.579, -3626.998], [41.175, -3641.395], [42.788, -3743.97], [44.416, -3937.624], [45.946, -4236.965], [47.175, -4377.768], [48.21, -4438.309], [48.838, -4537.2], [49.129, -4478.764], [49.196, -4308.402], [49.137, -4262.084], [49.143, -4247.508], [49.098, -4114.916], [49.084, -4100.473], [49.072, -4051.415], [49.196, -3999.507], [49.395, -4009.326], [49.634, -4000.167], [49.88, -3973.371], [50.084, -3918.636], [50.357, -3886.275], [50.697, -3936.03], [50.981, -4002.471], [51.209, -4039.17], [51.401, -4074.127], [51.553, -4057.877], [51.723, -4087.47], [52.184, -4223.707], [52.507, -4084.271], [53.238, -3994.224], [54.011, -3849.528], [54.93, -3743.578], [55.856, -3797.639], [56.748, -3817.357], [57.653, -3869.861], [58.552, -3891.538], [59.342, -3931.89], [60.089, -4015.883], [60.804, -4092.087]]
# Tubing Movement Card
#downhole = [[46.83,-2887.081], [46.892,-2852.452], [46.914,-2878.963], [46.902,-2899.007], [46.927,-2914.736], [47.007,-3009.142], [47.098,-3044.16], [47.092,-2973.454], [47.047,-2927.351], [47.051,-2983.958], [47.026,-3072.558], [46.947,-3099.861], [46.85,-3086.603], [46.764,-3128.667], [46.706,-3222.279], [46.686,-3412.667], [46.643,-3492.5], [46.517,-3486.271], [46.347,-3520.645], [46.154,-3498.79], [45.943,-3570.53], [45.735,-3729.349], [45.457,-3834.83], [45.112,-3882.304], [44.779,-3951.678], [44.53,-4202.284], [44.259,-4344.169], [43.867,-4339.462], [43.489,-4462.086], [43.164,-4546.753], [42.917,-4713.565], [42.674,-4933.95], [42.349,-5087.896], [42.091,-5281.532], [41.858,-5409.675], [41.692,-5623.63], [41.597,-5789.314], [41.413,-5789.535], [41.212,-5854.792], [41.086,-5882.121], [41.039,-6019.487], [41.043,-6218.706], [40.973,-6308.513], [40.906,-6457.92], [40.837,-6594.607], [40.856,-6745.795], [40.883,-6767.062], [40.83,-6794.824], [40.797,-6933.782], [40.778,-6895.658], [40.822,-7034.814], [40.884,-7296.804], [40.818,-7419.478], [40.803,-7614.82], [40.776,-7751.075], [40.777,-8017.832], [40.764,-8241.186], [40.682,-8306.266], [40.554,-8463.126], [40.378,-8506.211], [40.272,-8608.049], [40.154,-8848.913], [39.906,-8996.566], [39.656,-9101.418], [39.305,-9067.18], [38.986,-9168.235], [38.634,-9203.583], [38.111,-9143.733], [37.598,-9187.537], [37.048,-9105.862], [36.496,-9175.496], [35.831,-9297.358], [35.077,-9295.168], [34.328,-9385.535], [33.5,-9417.49], [32.723,-9524.418], [31.903,-9543.187], [30.982,-9451.246], [30.098,-9542.783], [29.151,-9510.178], [28.189,-9502.326], [27.179,-9617.115], [26.052,-9694.688], [24.867,-9766.146], [23.598,-9761.514], [22.288,-9798.367], [20.981,-9780.708], [19.63,-9698.224], [18.306,-9740.019], [16.958,-9686.539], [15.724,-9736.812], [14.441,-9795.19], [13.139,-9681.094], [11.895,-9693.57], [10.726,-9760.314], [9.592,-9739.54], [8.484,-9680.257], [7.457,-9688.138], [6.545,-9698.494], [5.685,-9580.339], [4.955,-9585.38], [4.243,-9641.511], [3.558,-9554.533], [2.959,-9510.332], [2.426,-9502.439], [1.926,-9394.177], [1.461,-9293.815], [1.131,-9240.729], [0.896,-9156.458], [0.718,-9034.355], [0.661,-8899.793], [0.632,-8803.163], [0.698,-8727.494], [0.864,-8618.893], [1.119,-8519.666], [1.39,-8330.483], [1.644,-8299.007], [2,-8344.218], [2.361,-8159.301], [2.726,-8045.124], [3.063,-7967.46], [3.394,-7865.336], [3.799,-7748.28], [4.204,-7632.871], [4.584,-7505.887], [4.938,-7339.214], [5.354,-7351.317], [5.839,-7334.936], [6.263,-7134.111], [6.694,-7091.65], [7.063,-6987.825], [7.409,-6818.716], [7.799,-6755.144], [8.162,-6656.295], [8.528,-6602.11], [8.814,-6468.438], [9.062,-6377.223], [9.418,-6363.788], [9.772,-6233.713], [10.132,-6193.403], [10.371,-6052.44], [10.667,-5807.847], [11.056,-5740.982], [11.428,-5666.741], [11.749,-5544.153], [11.979,-5295.527], [12.207,-5178.551], [12.512,-5210.087], [12.812,-5150.446], [13.077,-5086.271], [13.292,-4886.025], [13.578,-4669.326], [13.871,-4606.906], [14.153,-4517.883], [14.414,-4369.183], [14.606,-4223.626], [14.854,-4204.487], [15.15,-4149.035], [15.382,-3974.269], [15.589,-3955.612], [15.735,-3888.778], [15.942,-3758.221], [16.219,-3730.551], [16.522,-3728.962], [16.78,-3677.023], [17.03,-3605.006], [17.333,-3618.731], [17.723,-3620.313], [18.111,-3588.642], [18.507,-3645.753], [18.835,-3584.838], [19.238,-3480.506], [19.803,-3500.618], [20.429,-3489.421], [21.043,-3439.612], [21.66,-3398.009], [22.274,-3438.254], [22.967,-3438.026], [23.667,-3442.973], [24.367,-3499.912], [25.087,-3420.673], [25.911,-3368.711], [26.764,-3426.286], [27.61,-3468.203], [28.469,-3448.212], [29.316,-3352.306], [30.161,-3336.477], [31.077,-3393.436], [31.987,-3440.532], [32.871,-3491.23], [33.721,-3432.89], [34.593,-3393.32], [35.456,-3425.981], [36.298,-3487.22], [37.115,-3508.692], [37.809,-3375.236], [38.502,-3342.76], [39.256,-3397.23], [39.94,-3387.344], [40.551,-3421.552], [41.078,-3365.214], [41.606,-3300.955], [42.124,-3340.255], [42.598,-3304.887], [43.053,-3276.992], [43.491,-3247.673], [43.861,-3218.775], [44.204,-3199.074], [44.529,-3187.272], [44.818,-3259.493], [45.008,-3241.877], [45.174,-3169.097], [45.358,-3180.797], [45.53,-3152.304], [45.695,-3142.974], [45.835,-3115.725], [45.945,-3071.782], [46.048,-2995.923], [46.18,-2967.381], [46.296,-3044.686], [46.328,-2969.671], [46.374,-2862.842], [46.437,-2863.76], [46.491,-2876.354], [46.561,-2888.627], [46.63,-2893.73], [46.688,-2844.868]]
# Pumped Off Card
# downhole=[[46.62,-2712.68], [46.602,-2800.402], [46.534,-2764.056], [46.394,-2655.373], [46.263,-2651.785], [46.138,-2755.013], [45.999,-2767.18], [45.847,-2748.438], [45.736,-2776.021], [45.606,-2749.383], [45.465,-2784.358], [45.327,-2888.547], [45.14,-2896.921], [44.948,-2943.494], [44.79,-3047.353], [44.632,-3124.92], [44.491,-3203.635], [44.329,-3212.191], [44.211,-3351.46], [44.126,-3434.87], [43.893,-3402.475], [43.648,-3489.605], [43.373,-3496.714], [43.076,-3609.12], [42.726,-3652.814], [42.381,-3682.839], [42.109,-3868.039], [41.777,-4001.037], [41.381,-4092.478], [40.923,-4032.864], [40.407,-4011.32], [39.87,-4078.828], [39.252,-4021.814], [38.533,-4000.884], [37.709,-4023.979], [36.817,-4012.084], [35.884,-4119.401], [34.922,-4226.103], [33.985,-4364.747], [33.015,-4340.242], [31.772,-4084.583], [30.454,-4186.653], [29.164,-4334.347], [27.943,-4459.974], [26.647,-4724.885], [25.311,-4907.698], [24.035,-5196.977], [22.856,-5536.343], [21.915,-5988.342], [21.099,-6207.023], [20.393,-6277.558], [19.88,-6619.778], [19.636,-6877.075], [19.486,-7004.481], [19.361,-7169.644], [19.309,-7222.818], [19.293,-7321.001], [19.319,-7506.76], [19.38,-7669.473], [19.468,-7688.039], [19.452,-7580.956], [19.539,-7603.85], [19.69,-7499.871], [19.966,-7604.458], [20.234,-7987.768], [20.343,-8046.571], [20.515,-8010.688], [20.819,-8139.062], [21.135,-8352.702], [21.437,-8524.034], [21.635,-8747.591], [21.806,-9045.313], [21.887,-9210.366], [21.91,-9533.773], [21.765,-9970.918], [21.268,-10077.19], [20.656,-10106.954], [19.921,-10233.764], [18.956,-10184.094], [17.902,-10141.401], [16.742,-10103.894], [15.569,-9961.449], [14.364,-9788.658], [13.214,-9741.754], [11.959,-9742.078], [10.664,-9667.238], [9.451,-9661.859], [8.197,-9555.982], [6.951,-9387.272], [5.788,-9378.236], [4.736,-9395.63], [3.779,-9331.787], [2.846,-9178.237], [1.996,-9134.094], [1.157,-9067.718], [0.349,-8902.578], [-0.307,-8899.076], [-0.842,-8825.375], [-1.417,-8495.976], [-1.925,-8406.432], [-2.162,-8415.77], [-2.313,-8165.475], [-2.316,-7971.104], [-2.164,-7774.518], [-1.868,-7469.596], [-1.405,-7125.546], [-0.836,-6804.768], [-0.191,-6500.219], [0.427,-6154.017], [1.025,-5891.592], [1.71,-5692.756], [2.373,-5484.625], [2.975,-5384.557], [3.524,-5202.852], [4.052,-4905.002], [4.605,-4745.705], [5.159,-4676.503], [5.646,-4588.479], [6.087,-4447.826], [6.415,-4363.645], [6.781,-4308.298], [7.208,-4210.163], [7.607,-4341.792], [7.823,-4231.768], [8.1,-4013.293], [8.469,-4037.254], [8.784,-3968.269], [9.05,-3848.801], [9.317,-3704.935], [9.615,-3745.845], [9.999,-3745.517], [10.352,-3575.309], [10.728,-3533.071], [11.123,-3454.092], [11.655,-3307.476], [12.318,-3219.887], [13.053,-3125.011], [13.907,-3064.4], [14.821,-3024.716], [15.774,-3057.919], [16.851,-3077.195], [17.929,-3046.074], [19.11,-3149.958], [20.246,-3187.356], [21.4,-3081.013], [22.649,-3090.806], [23.927,-3123.975], [25.222,-3158.243], [26.47,-3109.859], [27.725,-3131.643], [29.074,-3250.88], [30.339,-3222.404], [31.573,-3276.256], [32.746,-3184.676], [33.961,-3054.106], [35.186,-3105.254], [36.363,-3140.104], [37.512,-3103.287], [38.66,-3028.344], [39.784,-3065.363], [40.878,-3106.046], [41.916,-3093.05], [42.889,-3138.815], [43.748,-3091.373], [44.615,-3086.79], [45.405,-3115.451], [46.112,-3065.278], [46.748,-3048.583], [47.3,-3038.282], [47.785,-3037.967], [48.197,-2976.641], [48.504,-2874.274], [48.737,-2905.508], [48.888,-2892.011], [49.067,-2823.676], [49.241,-2883.689], [49.346,-2879.874], [49.42,-2870.957], [49.467,-2926.496], [49.459,-2906.499]]
scores = {"fullPump": 0,
"tubingMovement": 0,
"fluidPound": 0,
"gasInterference": 0,
"pumpTappingTop": 0,
"pumpTappingBottom": 0,
"bentBarrel": 0,
"wornPlunger": 0,
"wornStandingBill": 0,
"wornBarrel": 0,
"fluidFriction": 0,
"dragFriction": 0,
"rodPart": 0}
def printScores():
print("Full Pump: {:.5f}".format(scores['fullPump']))
print("Tubing Movement: {:.5f}".format(scores['tubingMovement']))
print("Fluid Pound: {:.5f}".format(scores['fluidPound']))
print("Gas Interference: {:.5f}".format(scores['gasInterference']))
print("Pump Tapping - Top: {:.5f}".format(scores['pumpTappingTop']))
print("Pump Tapping - Bottom: {:.5f}".format(scores['pumpTappingBottom']))
print("Bent Barrel: {:.5f}".format(scores['bentBarrel']))
print("Worn Plunger: {:.5f}".format(scores['wornPlunger']))
print("Worn Standing Bill: {:.5f}".format(scores['wornStandingBill']))
print("Worn Barrel: {:.5f}".format(scores['wornBarrel']))
print("Fluid Friction: {:.5f}".format(scores['fluidFriction']))
print("Drag Friction: {:.5f}".format(scores['dragFriction']))
print("Rod Part: {:.5f}".format(scores['rodPart']))
# helper functions
def __find_incremental_load(target_position, downholeArray, lastResult):
up_point_greater = [0, 0]
up_point_lesser = [0, 0]
down_point_greater = [0, 0]
down_point_lesser = [0, 0]
up_point_found = False
down_point_found = False
for ind in range(1, len(downholeArray)):
# print(downholeArray[i][0])
if (downholeArray[ind][0] > target_position) and (downholeArray[ind - 1][0] <= target_position):
up_point_greater = [downholeArray[ind][0], downholeArray[ind][1]]
up_point_lesser = [downholeArray[ind - 1][0], downholeArray[ind - 1][1]]
up_point_found = True
if (downholeArray[ind][0] <= target_position) and (downholeArray[ind - 1][0] > target_position):
down_point_greater = [downholeArray[ind][0], downholeArray[ind][1]]
down_point_lesser = [downholeArray[ind - 1][0], downholeArray[ind - 1][1]]
down_point_found = True
if up_point_found & down_point_found:
m_up = (up_point_greater[1] - up_point_lesser[1]) / (up_point_greater[0] - up_point_lesser[0])
b_up = up_point_greater[1] - (m_up * up_point_greater[0])
up_middle = (m_up * target_position) + b_up
m_down = (down_point_greater[1] - down_point_lesser[1]) / (down_point_greater[0] - down_point_lesser[0])
b_down = down_point_greater[1] - (m_down * down_point_greater[0])
down_middle = (m_down * target_position) + b_down
return [up_middle - down_middle, up_middle, down_middle]
else:
return lastResult
def __find_nearest_point_to_load(direction, card_half, target_load, ptArray, minPos, maxPos):
left_ignore = minPos + (minPos + maxPos) * 0.75
right_ignore = minPos + (minPos + maxPos) * 0.25
if direction == "up":
for up_i in range(1, len(ptArray)):
if card_half == "right" and ptArray[up_i][0] >= right_ignore:
if (ptArray[up_i][1] <= target_load) & (ptArray[up_i - 1][1] > target_load):
return [ptArray[up_i][0], ptArray[up_i][1]]
elif card_half == "left" and ptArray[up_i][0] <= left_ignore:
if (ptArray[up_i][1] >= target_load) & (ptArray[up_i - 1][1] < target_load):
return [ptArray[up_i][0], ptArray[up_i][1]]
else:
for down_i in range(len(ptArray) - 1, 1, -1):
if card_half == "right" and ptArray[down_i][0] >= right_ignore:
if (ptArray[down_i][1] >= target_load) & (ptArray[down_i - 1][1] < target_load):
return [ptArray[down_i][0], ptArray[down_i][1]]
elif card_half == "left" and ptArray[down_i][0] <= left_ignore:
if (ptArray[down_i][1] <= target_load) & (ptArray[down_i - 1][1] > target_load):
return [ptArray[down_i][0], ptArray[down_i][1]]
def countPointsBetween(posLeft, posRight, dArray):
topPoints = 0
bottomPoints = 0
for l in range(1, len(dArray)):
if (dArray[l][0] > posLeft) and (dArray[l][0] <= posRight) and (dArray[l][0] < dArray[l - 1][0]):
topPoints += 1
if (dArray[l][0] <= posRight) and (dArray[l - 1][0] > posLeft) and (dArray[l][0] > dArray[l - 1][0]):
bottomPoints += 1
return [topPoints, bottomPoints]
def average(lis):
listsum = 0
for avg_i in range(0, len(lis)):
listsum += lis[avg_i]
listavg = listsum / len(lis)
return listavg
def percentDiff(m1, m2):
mean = (m1 + m2) / 2
dif = (m1 - m2) / mean
if dif < 0:
return -1 * dif
else:
return dif
def percentError(actual, expected):
err = (actual - expected) / expected
if err < 0:
return -1 * err
else:
return err
# find min & max position
minPosition = downhole[0][0]
minPositionPt = [0, 0]
minLoad = downhole[0][1]
maxPosition = downhole[0][0]
maxPositionPt = [0, 0]
maxLoad = downhole[0][1]
for i in range(1, len(downhole)):
if downhole[i][0] < minPosition:
minPosition = downhole[i][0]
minPositionPt = downhole[i]
if downhole[i][0] > maxPosition:
maxPosition = downhole[i][0]
maxPositionPt = downhole[i]
if downhole[i][1] < minLoad:
minLoad = downhole[i][1]
if downhole[i][1] > maxLoad:
maxLoad = downhole[i][1]
downholeLoadSpan = maxLoad - minLoad
# split cards into equal slices
sliceLength = (maxPosition - minPosition) / (slices + 1)
slicesAll = []
topSlices = []
topSlicesChange = []
bottomSlices = []
bottomSlicesChange = []
sliceDelta = []
sliceDeltaChange = []
topPointsBetween = []
bottomPointsBetween = []
for j in range(0, slices):
targetPosition = j * sliceLength + minPosition
nextTargetPosition = (j + 1) * sliceLength + minPosition
# measure points in each slice to look for fast/slow parts
ptb = countPointsBetween(targetPosition, nextTargetPosition, downhole)
topPointsBetween.append(ptb[0])
bottomPointsBetween.append(ptb[1])
# interpret mean point of each slice
if j > 0:
sliver = __find_incremental_load(targetPosition, downhole, slicesAll[j - 1])
else:
sliver = __find_incremental_load(targetPosition, downhole, [0, 0, 0])
slicesAll.append(sliver)
sliceDelta.append(sliver[0])
topSlices.append(sliver[1])
bottomSlices.append(sliver[2])
for k in range(1, slices):
topSlicesChange.append(topSlices[k] - topSlices[k - 1])
bottomSlicesChange.append(bottomSlices[k] - bottomSlices[k - 1])
sliceDeltaChange.append(sliceDelta[k] - sliceDelta[k - 1])
topSlicesAverage = average(topSlices)
bottomSlicesAverage = average(bottomSlices)
sliceDeltaAverage = average(sliceDelta)
# find Graph Corners
halfLoadLoad = minLoad + downholeLoadSpan / 2
halfLoad = __find_nearest_point_to_load("up", "left", halfLoadLoad, downhole, minPosition, maxPosition)
if minPosition < halfLoad[0]:
corner_bottomLeft = minPositionPt
corner_topLeft = __find_nearest_point_to_load("up", "left", maxLoad - downholeLoadSpan * (pctTop / 100), downhole,
minPosition, maxPosition)
else:
corner_bottomLeft = __find_nearest_point_to_load("up", "left", minLoad + downholeLoadSpan * (pctBottom / 100),
downhole, minPosition, maxPosition)
corner_topLeft = minPositionPt
corner_topRight = maxPositionPt
corner_fillage = __find_nearest_point_to_load("up", "right", minLoad + downholeLoadSpan * (pctBottom / 100), downhole,minPosition, maxPosition)
corner_fullFillage = [corner_bottomLeft[0] + corner_topRight[0] - corner_topLeft[0], corner_bottomLeft[1]]
topSlicesAboveAverage = []
for i in range(0, len(topSlices)):
if topSlices[i] > topSlicesAverage:
topSlicesAboveAverage.append(topSlices[i])
if len(topSlicesAboveAverage) == 0:
topSlicesAboveAverageAverage = topSlicesAverage
else:
topSlicesAboveAverageAverage = average(topSlicesAboveAverage)
bottomSlicesBelowAverage = []
for i in range(0, len(bottomSlices)):
if bottomSlices[i] < bottomSlicesAverage:
bottomSlicesBelowAverage.append(bottomSlices[i])
if len(bottomSlicesBelowAverage) == 0:
bottomSlicesBelowAverageAverage = bottomSlicesAverage
else:
bottomSlicesBelowAverageAverage = average(bottomSlicesBelowAverage)
# find equation of line between fillage point and the top right
# y=mx+b
incompletionLineM = (bottomSlices[-1] - corner_fillage[1]) / ((maxPosition-2*sliceLength) - corner_fillage[0])
incompletionLineB = bottomSlices[-1] - incompletionLineM * (maxPosition-2*sliceLength)
def poLine(pos):
return incompletionLineM * pos + incompletionLineB
# find slices in the pump-off part of the card
poSlicesTop = []
poSlicesBottom = []
poSlicePos = []
for i in range(0,len(topSlices)):
poSlicePosTest = i * sliceLength + minPosition
if poSlicePosTest > corner_fillage[0]:
poSlicesBottom.append(bottomSlices[i])
poSlicesTop.append(topSlices[i])
poSlicePos.append(poSlicePosTest)
# get score for each possible condition based on points. points (0-100) should reflect how closesly the pattern fits
# check Full pump
# ------------------------------------
scores['fullPump'] = round(
100 * ((corner_fillage[0] - corner_bottomLeft[0]) / (corner_fullFillage[0] - corner_bottomLeft[0])), 5)
if scores['fullPump'] > 100.0:
scores['fullPump'] = 100.0
# topPctError = percentDiff(topSlicesAverage,topSlicesAboveAverageAverage)
# print("topPctError:", topPctError)
# bottomPctError = percentDiff(bottomSlicesAverage,bottomSlicesBelowAverageAverage)
# print('bottomPctError:', bottomPctError)
# scores['fullPump'] = round(100*(percentDiff((topPctError - bottomPctError),0.01)),5)
# check tubing movement & drag friction
# ------------------------------------
leftCornerDiff = corner_topLeft[0] - corner_bottomLeft[0]
if leftCornerDiff > 0:
# indicates tubing movement
scores['dragFriction'] = 0.0
if leftCornerDiff < (maxPosition - minPosition) * (tubingMovementPctStroke / 100):
scores['tubingMovement'] = round(
100 * (1 - percentError(leftCornerDiff, (maxPosition - minPosition) * (tubingMovementPctStroke / 100))), 5)
else:
scores['tubingMovement'] = 100.0
else:
# indicates drag friction
scores["tubingMovement"] = 0.0
if abs(leftCornerDiff) < (maxPosition - minPosition) * (tubingMovementPctStroke / 100):
scores['dragFriction'] = round(100 * (
1 - percentError(abs(leftCornerDiff), (maxPosition - minPosition) * (tubingMovementPctStroke / 100))), 5)
else:
scores['dragFriction'] = 100.0
# Check Pump Tapping Top
# ------------------------------------
if topSlices[len(topSlices) - 1] > topSlicesAboveAverageAverage:
scores['pumpTappingTop'] = 100 * percentDiff(topSlices[len(topSlices) - 1], minLoad + downholeLoadSpan * (pumpTapPercent/100))
else:
scores['pumpTappingTop'] = 0.0
# Check Pump Tapping Bottom
# ------------------------------------
if bottomSlices[len(bottomSlices) - 1] < bottomSlicesBelowAverageAverage:
scores['pumpTappingBottom'] = 100 * percentDiff(bottomSlices[len(bottomSlices) - 1], minLoad - downholeLoadSpan * (pumpTapPercent/100))
else:
scores['pumpTappingBottom'] = 0.0
# check fluid pound & gas interference
# ------------------------------------
distFromPOLine = []
linear = []
for i in range(0,len(poSlicePos)):
distFromPOLine.append(poSlicesBottom[i] - poLine(poSlicePos[i]))
linear.append(poLine(poSlicePos[i]))
pRegC = np.polyfit(poSlicePos, poSlicesBottom, 3)
fitPOSlicesBottom = []
for i in range(0, len(poSlicePos)):
fitPOSlicesBottom.append(pRegC[0] * poSlicePos[i]**3 + pRegC[1] * poSlicePos[i]**2 + pRegC[2] * poSlicePos[i] + pRegC[3])
gradient1 = np.gradient(fitPOSlicesBottom)
gradient2 = np.gradient(gradient1)
c2 = np.polyfit(poSlicePos, poSlicesBottom, 2)
c4 = np.polyfit(poSlicePos, poSlicesBottom, 4)
c5 = np.polyfit(poSlicePos, poSlicesBottom, 5)
c6 = np.polyfit(poSlicePos, poSlicesBottom, 6)
c2g = []
c4g = []
c5g = []
c6g = []
for i in range(0, len(poSlicePos)):
ps = poSlicePos[i]
c2g.append(c2[0] * ps**2 + c2[1] * ps + c2[2])
c4g.append(c4[0] * ps**4 + c4[1] * ps**3 + c4[2] * ps**2 + c4[3] * ps + c4[4])
c5g.append(c5[0] * ps**5 + c5[1] * ps**4 + c5[2] * ps**3 + c5[3] * ps**2 + c5[4] * ps + c5[5])
c6g.append(c6[0] * ps**6 + c6[1] * ps**5 + c6[2] * ps**4 + c6[3] * ps**3 + c6[4] * ps**2 + c6[5] * ps + c6[6])
inflectionPoint = [0,0]
for i in range(len(gradient2)-1, 0, -1):
if (gradient2[i-1] < 0) & (gradient2[i] > 0):
inflectionPoint = [poSlicePos[i], poSlicesBottom[i], i]
if inflectionPoint == [0,0]:
inflectionPoint = [poSlicePos[-1], poSlicesBottom[-1], len(poSlicePos)-1]
inflectionLineM = (inflectionPoint[1] - corner_fillage[1]) / ((inflectionPoint[0]) - corner_fillage[0])
inflectionLineB = inflectionPoint[1] - inflectionLineM * (inflectionPoint[0])
def inflectionL(pos):
return inflectionLineM * pos + inflectionLineB
inflectionLine = []
for i in range(0,inflectionPoint[2]+1):
inflectionLine.append(inflectionL(poSlicePos[i]))
inflectionError = 0
for i in range(0,len(inflectionLine)):
inflectionError += (poSlicesBottom[i] - inflectionLine[i]) * sliceLength
inflectionArea = (1/2) * (inflectionPoint[1] - corner_fillage[1]) * (inflectionPoint[0] - corner_fillage[0])
inflectionGasInterferenceError = 1 - (inflectionError / inflectionArea)
linearError = 0
for i in range(0, len(distFromPOLine)):
linearError += distFromPOLine[i] * sliceLength
pumpOffArea = (1/2) * (corner_topRight[1] - corner_fillage[1]) * (corner_topRight[0] - corner_fillage[0])
gasInterferenceError = 1 - (linearError / pumpOffArea)
wellFriction = topSlicesAboveAverageAverage - inflectionPoint[1]
fluidLoad = downholeLoadSpan - wellFriction
print("Well Friction:", wellFriction)
print("Fluid Load:", fluidLoad)
scores['gasInterference'] = inflectionGasInterferenceError * 100
if scores['gasInterference'] > 100:
scores['gasInterference'] = 100.0
scores['fluidPound'] = 100 - scores['gasInterference']
# check worn plunger
# ------------------------------------
# check worn standing bill
# ------------------------------------
# check worn barrel
# ------------------------------------
# check fluid friction
# ------------------------------------
# check rod part
# ------------------------------------
if downholeLoadSpan < 1000:
scores['rodPart'] = 100
elif downholeLoadSpan < 1500:
scores['rodPart'] = 75
elif downholeLoadSpan < 1500:
scores['rodPart'] = 50
elif downholeLoadSpan < 2000:
scores['rodPart'] = 25
else:
scores['rodPart'] = 0
# compare scores
printScores()
# Plot Card on graph
tpltPos = []
tpltLod = []
bpltPos = []
bpltLod = []
for i in range(0, len(topSlices)):
tpltLod.append(topSlices[i])
tpltPos.append(minPosition + sliceLength * i)
for i in range(0, len(bottomSlices)):
bpltLod.append(bottomSlices[i])
bpltPos.append(minPosition + sliceLength * i)
fig = plt.figure(figsize=(12, 9))
fig.canvas.set_window_title('Downhole Card Analysis')
plt.plot(tpltPos, tpltLod, 'g') # plot top points
plt.plot(bpltPos, bpltLod, 'g') # plot bottom points
# using linear error
# plt.plot([corner_fillage[0], corner_fillage[0],poSlicePos[-1],corner_fillage[0]],[corner_fillage[1],bottomSlices[-1], bottomSlices[-1],corner_fillage[1]],'y')
# plt.plot(poSlicePos, linear)
# using inflection point error
plt.plot([corner_fillage[0], corner_fillage[0],inflectionPoint[0],corner_fillage[0]],[corner_fillage[1],inflectionPoint[1], inflectionPoint[1],corner_fillage[1]],'purple')
plt.plot(poSlicePos[0:len(inflectionLine)], inflectionLine, 'red')
# average load lines
# plt.axhline(y=topSlicesAverage, xmin=0, xmax=1)
# plt.axhline(y=bottomSlicesAverage, xmin=0, xmax=1)
# plt.axhline(y=topSlicesAboveAverageAverage, xmin=0, xmax=1)
# plt.axhline(y=bottomSlicesBelowAverageAverage, xmin=0, xmax=1)
# curve fit of pump-off
# plt.plot(poSlicePos, c2g, 'orange')
plt.plot(poSlicePos, fitPOSlicesBottom, 'b')
# plt.plot(poSlicePos, c4g, 'red')
# .plot(poSlicePos, c5g, 'brown')
# plt.plot(poSlicePos, c6g, 'purple')
plt.grid(True)
plt.show()

166
findCorners.py Normal file
View File

@@ -0,0 +1,166 @@
# Python program to analyze cards
import matplotlib.pyplot as plt
import readCardFile as rcf
import math
import os, sys
def main(sl = 100):
# Setup Data
slices = int(sl) # number of horizontal slices to evaluate
#downhole = rcf.readFile("{0}/{1}".format(os.getcwd(), "testCard.csv"))[1] # read in CSV file output from POConsole/POCloud
downhole = rcf.readFile()[1]
num_points = len(downhole)
dh_pos = list(map(lambda x: x[0], downhole))
dh_pos_max = max(dh_pos)
dh_pos_min = min(dh_pos)
dh_lod = list(map(lambda x: x[1], downhole))
dh_lod_max = max(dh_lod)
dh_lod_min = min(dh_lod)
max_p = (dh_pos_max, dh_lod[dh_pos.index(dh_pos_max)])
min_p = (dh_pos_min, dh_lod[dh_pos.index(dh_pos_min)])
def determine_d_pos(min, max, num_slices):
return (max - min) / num_slices
d_pos = determine_d_pos(dh_pos_min, dh_pos_max, slices)
def distribute_positions(min, max, num_slices, dp):
""" distributes positions equally between the max and min values. Returns a list of positions """
p_targ = []
for i in range(0, num_slices):
p_targ.append(min + i * dp)
return p_targ
position_targets = distribute_positions(dh_pos_min, dh_pos_max, slices, d_pos)
def lineresolve(x1,x2,y1,y2,targ):
m = ((y2-y1)/(x2-x1))
b = y1 - m * x1
return(m * targ + b)
def find_top_slices():
""" finds the top slices of a card. Returns a list of (position,load) tuples"""
t_slices = []
last_pos_index = 0
for i in range(0,slices):
targ = position_targets[i]
for j in range(last_pos_index, num_points -1):
if (dh_pos[j] <= targ and dh_pos[j+1] > targ):
found_i = j
next_i = j+1
fake_load = lineresolve(dh_pos[found_i], dh_pos[next_i], dh_lod[found_i], dh_lod[next_i], targ)
t_slices.append((targ, fake_load))
last_pos_index = found_i
break
return t_slices
top_slices = find_top_slices()
print("== TOP ==")
for i in top_slices:
print("{0} - {1}".format(i[0], i[1]))
def find_bot_slices():
""" finds the top slices of a card. Returns a list of (position,load) tuples"""
b_slices = []
last_pos_index = 0
for i in range(0,slices):
targ = position_targets[i]
for j in range(0, num_points -1):
if (dh_pos[j] > targ and dh_pos[j+1] <= targ):
found_i = j
next_i = j+1
fake_load = lineresolve(dh_pos[found_i], dh_pos[next_i], dh_lod[found_i], dh_lod[next_i], targ)
b_slices.append((targ, fake_load))
#last_pos_index = found_i
break
return b_slices
bot_slices = find_bot_slices()
print("== BOTTOM ==")
for i in bot_slices:
print("{0} - {1}".format(i[0], i[1]))
def distance_to_line(x0,y0):
""" Finds the perpendicular distance from a point to the line between max and min points"""
x1 = min_p[0]
x2 = max_p[0]
# y1 = min_p[1]
# y2 = max_p[1]
y1 = dh_lod_min
y2 = dh_lod_max
d = abs((y2-y1)*x0 - (x2-x1)*y0 + x2*y1 - y2*x1) / math.sqrt(math.pow(y2-y1,2) + math.pow(x2-x1,2))
return d
top_d = []
bot_d = []
# Here's where we get the distance from each point to the line
for i in range(1,slices):
try:
top_d.append(distance_to_line(top_slices[i][0], top_slices[i][1]))
except Exception:
print("Error - top_d, index: {0}".format(i))
try:
bot_d.append(distance_to_line(bot_slices[i][0], bot_slices[i][1]))
except Exception:
print("Error - bot_d, index: {0}".format(i))
top_cor_i = top_d.index(max(top_d))
bot_cor_i = bot_d.index(max(bot_d))
top_corner = top_slices[top_cor_i]
bot_corner = bot_slices[bot_cor_i]
tubing_movement = top_corner[0] - dh_pos_min
fillage = (bot_corner[0] - dh_pos_min)/(dh_pos_max - (dh_pos_min + tubing_movement)) * 100
print("=================================================")
print("Tubing Movement: {0} in.".format(round(tubing_movement,3)))
print("Fill Percent: {0}%".format(round(fillage, 3)))
#determine difference between gas interference and incomplete fill
po_area = 0.0
actual_area = 0.0
bot_last = bot_slices[-1]
gas_line = []
for i in range(bot_cor_i, len(bot_slices)):
gas_line_load = lineresolve(bot_corner[0], bot_last[0], bot_corner[1], bot_last[1], bot_slices[i][0])
gas_line.append((bot_slices[i][0], gas_line_load))
po_area = po_area + (bot_last[0] - gas_line_load) * d_pos
actual_area = actual_area + abs(gas_line_load - bot_slices[i][1]) * d_pos
area_ratio = actual_area / po_area
print ("\nFull Area: {0}\nActual Area: {1}".format(po_area, actual_area))
print("\nIncomplete Fillage Score:{0}%\nGas Interference Score:{1}%".format(round(area_ratio*100,3), round((1-area_ratio)*100,3)))
print("=================================================")
plt.figure()
plt.subplot(211)
plt.plot(list(map(lambda x: x[0], downhole)), list(map(lambda x: x[1], downhole)) ,'r')
plt.plot(list(map(lambda x: x[0], top_slices)), list(map(lambda x: x[1], top_slices)) ,'b')
plt.plot(list(map(lambda x: x[0], bot_slices)), list(map(lambda x: x[1], bot_slices)) ,'g')
plt.plot(list(map(lambda x: x[0], gas_line)), list(map(lambda x: x[1], gas_line)) ,'m')
plt.subplot(212)
plt.plot(list(map(lambda x: x[0], top_slices))[1:], top_d ,'r')
plt.plot(list(map(lambda x: x[0], bot_slices))[1:], bot_d ,'y')
#ax2.axvline(x=top_corner[0])
#ax2.axvline(x=bot_corner[0])
plt.grid(True)
plt.show()
if __name__ == "__main__":
if len(sys.argv) > 1:
main(sys.argv[1])
else:
main()

35
readCardFile.py Normal file
View File

@@ -0,0 +1,35 @@
__author__ = 'patrickjmcd'
import Tkinter as tk
import tkFileDialog as fd
def readFile(file=None):
surface = []
downhole = []
if not file:
tk.Tk().withdraw()
file_path = fd.askopenfilename()
else:
file_path = file
storeSurface = False
storeDownhole = False
import csv
with open(file_path, 'r') as csvfile:
dataReader = csv.reader(csvfile)
for row in dataReader:
if storeDownhole:
downhole.append((float(row[0]),float(row[1])))
if row[0]=="d_pos":
storeSurface = False
storeDownhole = True
if storeSurface:
surface.append((float(row[0]),float(row[1])))
if row[0]=="s_pos":
storeSurface = True
storeDownhole = False
return [surface, downhole]
# if __name__ == "__main__":
# readFile()

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

227
testCard.csv Normal file
View File

@@ -0,0 +1,227 @@
"localtime","2015-11-04 12:15:09.439141"
"utctime","2015-11-04 18:15:09.439141"
"Card_ID","6372"
"Num_Tapers","3"
"Num_Points","99"
"Card_Type","0"
"Well_Name","Denise1601"
"Tubing_Head_Pressure","50.0"
"Fluid_Gradient","0.44999998807907104"
"Stuffing_Box_Friction","100.0"
"dt","0.07500000298023224"
"Downhole_Max_Load","-526.87939453125"
"Downhole_Min_Load","-7897.5439453125"
"Downhole_Max_Position","60.587005615234375"
"Downhole_Min_Position","-24.125038146972656"
"Downhole_Gross_Stroke","84.71204376220703"
"Downhole_Adjusted_Gross_Stroke","84.7914047241211"
"Downhole_Net_Stroke","55.0130615234375"
"Downhole_Fluid_Load","4686.138671875"
"Surface_Max_Load","19870.0"
"Surface_Min_Load","14372.0"
"Surface_Max_Position","102.35242462158203"
"Surface_Min_Position","-0.04880121350288391"
"Tubing_Movement","-0.07936454564332962"
"Surface_Stroke_Length","102.4012222290039"
"Fillage_Percent","64.3893814086914"
"Polished_Rod_HP","3.1364829540252686"
"Pump_HP","2.222397804260254"
"SPM","8.080738067626953"
"Fluid_Above_Pump","6301.8017578125"
"Stroke_Production","0.02783350832760334"
"s_pos","s_load"
"93.398","17086.0"
"91.515","17048.0"
"89.589","16972.0"
"87.589","16841.0"
"85.512","16707.0"
"83.053","16561.0"
"80.681","16466.0"
"78.327","16409.0"
"75.429","16390.0"
"72.627","16374.001"
"70.131","16332.0"
"66.977","16227.0"
"63.972","16076.0"
"61.077","15845.0"
"57.669","15613.0"
"54.186","15379.0"
"50.876","15128.0"
"47.587","14885.0"
"44.252","14653.0"
"40.975","14337.0"
"37.813","14001.0"
"34.284","13556.0"
"30.98","13136.0"
"27.847","12673.999"
"24.425","12333.0"
"21.17","12051.0"
"18.27","11903.0"
"15.414","11819.0"
"12.557","11795.0"
"10.132","11799.0"
"7.927","11820.0"
"5.754","11865.999"
"4.089","11937.999"
"2.545","12075.0"
"1.339","12260.0"
"0.472","12556.0"
"-0.074","12889.0"
"-0.368","13345.999"
"-0.25","13801.0"
"-0.049","14372.0"
"0.426","14897.0"
"1.341","15501.0"
"2.357","16015.0"
"3.497","16577.0"
"5.109","17047.0"
"6.8","17569.0"
"8.502","18011.0"
"10.679","18480.0"
"12.965","18832.0"
"15.086","19136.0"
"17.612","19302.0"
"20.242","19378.0"
"22.824","19364.0"
"25.506","19282.0"
"28.503","19190.0"
"31.475","19116.0"
"33.923","19127.0"
"36.863","19247.0"
"39.621","19427.0"
"41.982","19650.0"
"44.881","19800.0"
"47.613","19870.0"
"50.177","19835.0"
"52.751","19720.0"
"55.53","19604.0"
"58.111","19511.0"
"60.527","19486.0"
"63.239","19514.0"
"65.704","19561.0"
"68.063","19602.0"
"70.593","19597.0"
"73.05","19517.0"
"75.196","19378.0"
"77.563","19163.0"
"79.977","18972.0"
"82.256","18803.0"
"84.429","18727.0"
"86.889","18717.0"
"89.117","18746.0"
"91.097","18771.0"
"93.252","18745.0"
"95.093","18637.0"
"96.677","18484.0"
"98.182","18282.0"
"99.385","18119.0"
"100.338","17983.0"
"101.113","17919.0"
"101.72","17908.0"
"102.111","17931.0"
"102.352","17957.0"
"102.351","17941.0"
"101.965","17849.0"
"101.524","17704.0"
"100.899","17496.0"
"100.143","17314.0"
"99.199","17151.0"
"98.041","17066.0"
"d_pos","d_load"
"60.986","-1421.341"
"61.18","-1630.285"
"61.098","-1723.069"
"60.894","-1816.997"
"60.518","-1893.947"
"59.96","-1743.353"
"59.262","-1684.411"
"58.597","-1797.25"
"57.767","-1847.692"
"56.769","-2028.492"
"55.666","-2365.939"
"54.4","-2577.627"
"52.854","-2681.227"
"51.205","-2890.279"
"49.477","-2904.455"
"47.627","-2769.189"
"45.85","-3007.649"
"44.143","-3272.492"
"42.433","-3451.081"
"40.817","-4005.708"
"39.223","-4469.438"
"37.615","-4626.933"
"36.149","-5001.764"
"34.751","-5299.257"
"33.517","-5367.123"
"32.486","-5578.117"
"31.658","-5912.868"
"31.018","-6186.276"
"30.5","-6477.536"
"29.881","-6812.0"
"29.256","-6948.168"
"28.537","-6880.609"
"27.816","-6962.176"
"27.003","-7007.687"
"26.076","-6916.81"
"25.058","-7059.85"
"23.881","-7302.985"
"22.482","-7429.931"
"20.864","-7667.682"
"18.99","-7897.544"
"16.687","-7720.645"
"14.287","-7572.63"
"11.679","-7466.455"
"8.855","-7031.728"
"5.906","-6759.008"
"2.991","-6597.28"
"-0.217","-6196.185"
"-3.22","-6081.894"
"-6.359","-5920.985"
"-9.479","-5484.665"
"-12.556","-5238.389"
"-15.253","-5103.293"
"-17.768","-4894.909"
"-19.836","-4836.033"
"-21.658","-4788.491"
"-22.939","-4528.13"
"-23.794","-4188.902"
"-24.125","-3951.927"
"-23.994","-3569.314"
"-23.434","-3062.452"
"-22.585","-2650.886"
"-21.336","-2287.333"
"-19.872","-1719.896"
"-18.173","-1279.187"
"-16.214","-1101.919"
"-14.06","-748.781"
"-11.811","-526.879"
"-9.409","-646.94"
"-6.948","-617.908"
"-4.416","-720.337"
"-1.873","-1075.932"
"0.549","-1190.441"
"2.945","-1081.959"
"5.33","-1000.862"
"7.835","-898.726"
"10.543","-717.542"
"13.399","-720.939"
"16.366","-904.753"
"19.423","-969.946"
"22.449","-1055.779"
"25.41","-1216.705"
"28.249","-1172.759"
"31.03","-1007.448"
"33.73","-931.535"
"36.425","-849.579"
"39.053","-669.859"
"41.666","-690.598"
"44.192","-843.798"
"46.608","-885.599"
"48.878","-1064.131"
"50.934","-1207.103"
"52.612","-991.171"
"54.205","-885.51"
"55.582","-811.091"
"56.797","-643.467"
"57.951","-725.744"
"58.99","-867.17"
1 localtime 2015-11-04 12:15:09.439141
2 utctime 2015-11-04 18:15:09.439141
3 Card_ID 6372
4 Num_Tapers 3
5 Num_Points 99
6 Card_Type 0
7 Well_Name Denise1601
8 Tubing_Head_Pressure 50.0
9 Fluid_Gradient 0.44999998807907104
10 Stuffing_Box_Friction 100.0
11 dt 0.07500000298023224
12 Downhole_Max_Load -526.87939453125
13 Downhole_Min_Load -7897.5439453125
14 Downhole_Max_Position 60.587005615234375
15 Downhole_Min_Position -24.125038146972656
16 Downhole_Gross_Stroke 84.71204376220703
17 Downhole_Adjusted_Gross_Stroke 84.7914047241211
18 Downhole_Net_Stroke 55.0130615234375
19 Downhole_Fluid_Load 4686.138671875
20 Surface_Max_Load 19870.0
21 Surface_Min_Load 14372.0
22 Surface_Max_Position 102.35242462158203
23 Surface_Min_Position -0.04880121350288391
24 Tubing_Movement -0.07936454564332962
25 Surface_Stroke_Length 102.4012222290039
26 Fillage_Percent 64.3893814086914
27 Polished_Rod_HP 3.1364829540252686
28 Pump_HP 2.222397804260254
29 SPM 8.080738067626953
30 Fluid_Above_Pump 6301.8017578125
31 Stroke_Production 0.02783350832760334
32 s_pos s_load
33 93.398 17086.0
34 91.515 17048.0
35 89.589 16972.0
36 87.589 16841.0
37 85.512 16707.0
38 83.053 16561.0
39 80.681 16466.0
40 78.327 16409.0
41 75.429 16390.0
42 72.627 16374.001
43 70.131 16332.0
44 66.977 16227.0
45 63.972 16076.0
46 61.077 15845.0
47 57.669 15613.0
48 54.186 15379.0
49 50.876 15128.0
50 47.587 14885.0
51 44.252 14653.0
52 40.975 14337.0
53 37.813 14001.0
54 34.284 13556.0
55 30.98 13136.0
56 27.847 12673.999
57 24.425 12333.0
58 21.17 12051.0
59 18.27 11903.0
60 15.414 11819.0
61 12.557 11795.0
62 10.132 11799.0
63 7.927 11820.0
64 5.754 11865.999
65 4.089 11937.999
66 2.545 12075.0
67 1.339 12260.0
68 0.472 12556.0
69 -0.074 12889.0
70 -0.368 13345.999
71 -0.25 13801.0
72 -0.049 14372.0
73 0.426 14897.0
74 1.341 15501.0
75 2.357 16015.0
76 3.497 16577.0
77 5.109 17047.0
78 6.8 17569.0
79 8.502 18011.0
80 10.679 18480.0
81 12.965 18832.0
82 15.086 19136.0
83 17.612 19302.0
84 20.242 19378.0
85 22.824 19364.0
86 25.506 19282.0
87 28.503 19190.0
88 31.475 19116.0
89 33.923 19127.0
90 36.863 19247.0
91 39.621 19427.0
92 41.982 19650.0
93 44.881 19800.0
94 47.613 19870.0
95 50.177 19835.0
96 52.751 19720.0
97 55.53 19604.0
98 58.111 19511.0
99 60.527 19486.0
100 63.239 19514.0
101 65.704 19561.0
102 68.063 19602.0
103 70.593 19597.0
104 73.05 19517.0
105 75.196 19378.0
106 77.563 19163.0
107 79.977 18972.0
108 82.256 18803.0
109 84.429 18727.0
110 86.889 18717.0
111 89.117 18746.0
112 91.097 18771.0
113 93.252 18745.0
114 95.093 18637.0
115 96.677 18484.0
116 98.182 18282.0
117 99.385 18119.0
118 100.338 17983.0
119 101.113 17919.0
120 101.72 17908.0
121 102.111 17931.0
122 102.352 17957.0
123 102.351 17941.0
124 101.965 17849.0
125 101.524 17704.0
126 100.899 17496.0
127 100.143 17314.0
128 99.199 17151.0
129 98.041 17066.0
130 d_pos d_load
131 60.986 -1421.341
132 61.18 -1630.285
133 61.098 -1723.069
134 60.894 -1816.997
135 60.518 -1893.947
136 59.96 -1743.353
137 59.262 -1684.411
138 58.597 -1797.25
139 57.767 -1847.692
140 56.769 -2028.492
141 55.666 -2365.939
142 54.4 -2577.627
143 52.854 -2681.227
144 51.205 -2890.279
145 49.477 -2904.455
146 47.627 -2769.189
147 45.85 -3007.649
148 44.143 -3272.492
149 42.433 -3451.081
150 40.817 -4005.708
151 39.223 -4469.438
152 37.615 -4626.933
153 36.149 -5001.764
154 34.751 -5299.257
155 33.517 -5367.123
156 32.486 -5578.117
157 31.658 -5912.868
158 31.018 -6186.276
159 30.5 -6477.536
160 29.881 -6812.0
161 29.256 -6948.168
162 28.537 -6880.609
163 27.816 -6962.176
164 27.003 -7007.687
165 26.076 -6916.81
166 25.058 -7059.85
167 23.881 -7302.985
168 22.482 -7429.931
169 20.864 -7667.682
170 18.99 -7897.544
171 16.687 -7720.645
172 14.287 -7572.63
173 11.679 -7466.455
174 8.855 -7031.728
175 5.906 -6759.008
176 2.991 -6597.28
177 -0.217 -6196.185
178 -3.22 -6081.894
179 -6.359 -5920.985
180 -9.479 -5484.665
181 -12.556 -5238.389
182 -15.253 -5103.293
183 -17.768 -4894.909
184 -19.836 -4836.033
185 -21.658 -4788.491
186 -22.939 -4528.13
187 -23.794 -4188.902
188 -24.125 -3951.927
189 -23.994 -3569.314
190 -23.434 -3062.452
191 -22.585 -2650.886
192 -21.336 -2287.333
193 -19.872 -1719.896
194 -18.173 -1279.187
195 -16.214 -1101.919
196 -14.06 -748.781
197 -11.811 -526.879
198 -9.409 -646.94
199 -6.948 -617.908
200 -4.416 -720.337
201 -1.873 -1075.932
202 0.549 -1190.441
203 2.945 -1081.959
204 5.33 -1000.862
205 7.835 -898.726
206 10.543 -717.542
207 13.399 -720.939
208 16.366 -904.753
209 19.423 -969.946
210 22.449 -1055.779
211 25.41 -1216.705
212 28.249 -1172.759
213 31.03 -1007.448
214 33.73 -931.535
215 36.425 -849.579
216 39.053 -669.859
217 41.666 -690.598
218 44.192 -843.798
219 46.608 -885.599
220 48.878 -1064.131
221 50.934 -1207.103
222 52.612 -991.171
223 54.205 -885.51
224 55.582 -811.091
225 56.797 -643.467
226 57.951 -725.744
227 58.99 -867.17

35
upstrokeDownstroke.py Normal file
View File

@@ -0,0 +1,35 @@
import readCardFile as rcf
import matplotlib.pyplot as plt
downhole = rcf.readFile()[1]
upstroke = []
downstroke = []
mUp = False
for i in range (2,len(downhole)-1):
if downhole[i][0] > downhole[i-1][0]:
upstroke.append(downhole[i])
mUp = True
elif downhole[i][0] < downhole[i-1][0]:
downstroke.append(downhole[i])
mUp = False
else:
if mUp:
upstroke.append(downhole[i])
else:
downstroke.append(downhole[i])
p,l = zip(*downhole)
uP, uL = zip(*upstroke)
dP,dL = zip(*downstroke)
fig = plt.figure(figsize=(12, 9))
fig.canvas.set_window_title('Downhole Card Analysis')
plt.plot(p,l,'g')
plt.plot(uP, uL, 'b')
plt.plot(dP, dL, 'r')
plt.grid(True)
plt.show()

21
wellInflow.py Normal file
View File

@@ -0,0 +1,21 @@
'''Well Inflow Calculator'''
import math
def annulusCrossSectionalArea(id, od):
'''Calculates cross-sectional area of an annulus'''
return math.pi/4*(math.pow(od,2)-math.pow(id,2))
bblPerIn3 = 0.00010307
casingID = 5.0
tubingOD = 2.375
dailyProduction = 13.36 #BBL
fluidLevelChange = -23.0 #ft
fluidLevelChangeInches = fluidLevelChange * 12.0
casingAnnulusArea = annulusCrossSectionalArea(tubingOD, casingID)
wellInflowBBL = fluidLevelChangeInches * casingAnnulusArea * bblPerIn3 + dailyProduction
print ("Inflow:",wellInflowBBL, "BBL")
wellInflowRate = wellInflowBBL / 24.0
print ("Inflow Rate:", wellInflowRate, "BBL/HR")

165
wholeCardRegression.py Normal file
View File

@@ -0,0 +1,165 @@
# Python program to analyze cards
import matplotlib.pyplot as plt
import numpy as np
import readCardFile as rcf
import math
# Setup Data
slices = 250 # number of horizontal slices to evaluate
regN = 10 # regression level
downhole = rcf.readFile()[1] # read in CSV file output from POConsole/POCloud
# helper functions
def __find_incremental_load(target_position, downholeArray, lastResult):
up_point_greater = [0, 0]
up_point_lesser = [0, 0]
down_point_greater = [0, 0]
down_point_lesser = [0, 0]
up_point_found = False
down_point_found = False
for ind in range(1, len(downholeArray)):
# print(downholeArray[i][0])
if (downholeArray[ind][0] > target_position) and (downholeArray[ind - 1][0] <= target_position):
up_point_greater = [downholeArray[ind][0], downholeArray[ind][1]]
up_point_lesser = [downholeArray[ind - 1][0], downholeArray[ind - 1][1]]
up_point_found = True
if (downholeArray[ind][0] <= target_position) and (downholeArray[ind - 1][0] > target_position):
down_point_greater = [downholeArray[ind][0], downholeArray[ind][1]]
down_point_lesser = [downholeArray[ind - 1][0], downholeArray[ind - 1][1]]
down_point_found = True
if up_point_found & down_point_found:
m_up = (up_point_greater[1] - up_point_lesser[1]) / (up_point_greater[0] - up_point_lesser[0])
b_up = up_point_greater[1] - (m_up * up_point_greater[0])
up_middle = (m_up * target_position) + b_up
m_down = (down_point_greater[1] - down_point_lesser[1]) / (down_point_greater[0] - down_point_lesser[0])
b_down = down_point_greater[1] - (m_down * down_point_greater[0])
down_middle = (m_down * target_position) + b_down
return [up_middle - down_middle, up_middle, down_middle]
else:
return lastResult
def findLine(x1,y1,x2,y2): # finds the slope and intercept of a line between two points
m = (y2-y1)/(x2-x1)
b = y1 - m*x1
return(m,b)
def vectorDist(x1,y1,x2,y2):
return math.sqrt((x2-x1)**2 + (y2-y1)**2)
def perpDist(x,y,m,b):
# line as mx+b
return abs(m*x + (-1) * y + b) / math.sqrt( m**2 + (-1)**2)
# find min & max position
minPosition = min(downhole, key = lambda x:x[0])
minLoad = min(downhole, key = lambda x:x[1])
maxPosition = max(downhole, key = lambda x:x[0])
maxLoad = max(downhole, key = lambda x:x[1])
downholeLoadSpan = maxLoad[1] - minLoad[1]
# split cards into equal slices
sliceLength = (maxPosition[0] - minPosition[0]) / (slices + 1)
slicesAll = []
topSlices = []
bottomSlices = []
sliceDelta = []
posSlices = []
for j in range(0, slices):
targetPosition = j * sliceLength + minPosition[0]
nextTargetPosition = (j + 1) * sliceLength + minPosition[0]
# interpret mean point of each slice
if j > 0:
sliver = __find_incremental_load(targetPosition, downhole, slicesAll[j - 1])
else:
sliver = __find_incremental_load(targetPosition, downhole, [0, 0, 0])
slicesAll.append(sliver)
sliceDelta.append(sliver[0])
topSlices.append(sliver[1])
bottomSlices.append(sliver[2])
posSlices.append(targetPosition)
topC = np.polyfit(posSlices, topSlices, regN)
botC = np.polyfit(posSlices, bottomSlices, regN)
topReg = []
botReg = []
for i in range(0,len(posSlices)):
x = posSlices[i]
tr = 0
br = 0
for j in range(0,regN+1):
tr += topC[j] * x**(regN-j)
br += botC[j] * x**(regN-j)
topReg.append(tr)
botReg.append(br)
p,l = zip(*downhole)
(tm,tb) = findLine(posSlices[0], topSlices[0], posSlices[-1], topSlices[-1])
(bm,bb) = findLine(posSlices[0], bottomSlices[0], posSlices[-1], bottomSlices[-1])
#(tm,tb) = findLine(minPosition[0], minPosition[1], maxPosition[0], maxPosition[1])
#(bm,bb) = findLine(minPosition[0], minPosition[1], maxPosition[0], maxPosition[1])
linePos = np.linspace(posSlices[0], posSlices[-1], len(posSlices))
topDist = []
bottomDist = []
tLine = []
bLine = []
corner_topLeft = (0, 0)
corner_fillage = (0, 0)
maxTopDist = 0.0
maxBotDist = 0.0
for i in range(0, len(posSlices)):
tLineY = linePos[i] * tm + tb
#td = vectorDist(posSlices[i], topSlices[i], linePos[i], tLineY)
td = perpDist(posSlices[i], topSlices[i], tm, tb)
topDist.append(td)
tLine.append(tLineY)
if td > maxTopDist:
maxTopDist = td
corner_topLeft = (posSlices[i], topSlices[i])
tLine.append(tLineY)
bLineY = linePos[i] * bm + bb
#bd = vectorDist(posSlices[i], bottomSlices[i], linePos[i], bLineY)
bd = perpDist(posSlices[i], bottomSlices[i], bm, bb)
bLine.append(bLineY)
bottomDist.append(bd)
if bd > maxBotDist:
maxBotDist = bd
corner_fillage = (posSlices[i], bottomSlices[i])
fillPercent = (corner_fillage[0] - minPosition[0])/(maxPosition[0] - corner_topLeft[0]) * 100
print("Fill:", fillPercent)
fig = plt.figure(figsize=(12, 9))
fig.canvas.set_window_title('Downhole Card Analysis')
# plt.plot(p, l, 'g') # plot actual card
plt.plot(posSlices, topSlices, 'r') # plot bottom points
plt.plot(posSlices, bottomSlices, 'r') # plot bottom points
# plt.plot(posSlices, topReg, 'b')
# plt.plot(posSlices, botReg, 'b')
# plt.plot(posSlices, topDist, 'y')
# plt.plot(posSlices, bottomDist, 'g')
plt.axvline(x=corner_topLeft[0])
plt.axvline(x=corner_fillage[0])
# plt.plot(linePos, tLine, 'orange')
# plt.plot(linePos, bLine, 'purple')
plt.grid(True)
plt.show()