From 68c9a6041da5b96ceab340394f70260a44af1798 Mon Sep 17 00:00:00 2001 From: changliao1025 Date: Wed, 27 Sep 2023 21:30:20 -0700 Subject: [PATCH] update for debug filenames --- notebooks/mpas_example.ipynb | 928 ++++++++++++++++++++++++++++++++--- 1 file changed, 862 insertions(+), 66 deletions(-) diff --git a/notebooks/mpas_example.ipynb b/notebooks/mpas_example.ipynb index ae62ca6..f692783 100644 --- a/notebooks/mpas_example.ipynb +++ b/notebooks/mpas_example.ipynb @@ -241,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "25e0e653", "metadata": {}, "outputs": [], @@ -255,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "394d0745", "metadata": {}, "outputs": [ @@ -337,7 +337,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "52820d49", "metadata": {}, "outputs": [], @@ -351,23 +351,10 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 13, "id": "69f442ec", "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "list indices must be integers or slices, not str", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mc:\\workspace\\python\\pyflowline-main\\notebooks\\mpas_example.ipynb Cell 21\u001b[0m line \u001b[0;36m1\n\u001b[0;32m 7\u001b[0m change_json_key_value(sFilename_configuration_in, \u001b[39m'\u001b[39m\u001b[39msFilename_basins\u001b[39m\u001b[39m'\u001b[39m, sFilename_basins)\n\u001b[0;32m 9\u001b[0m sFilename_flowline \u001b[39m=\u001b[39m realpath( os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39mjoin(sFolder_input, \u001b[39m'\u001b[39m\u001b[39mflowline.geojson\u001b[39m\u001b[39m'\u001b[39m) )\n\u001b[1;32m---> 10\u001b[0m change_json_key_value(sFilename_basins, \u001b[39m'\u001b[39;49m\u001b[39msFilename_flowline_filter\u001b[39;49m\u001b[39m'\u001b[39;49m, sFilename_flowline)\n", - "File \u001b[1;32mC:\\workspace\\python\\pyflowline-main\\pyflowline\\change_json_key_value.py:9\u001b[0m, in \u001b[0;36mchange_json_key_value\u001b[1;34m(sFilename_json_in, sKey, new_value)\u001b[0m\n\u001b[0;32m 6\u001b[0m data \u001b[39m=\u001b[39m json\u001b[39m.\u001b[39mload(file)\n\u001b[0;32m 8\u001b[0m \u001b[39m# Update the value associated with the specified sKey\u001b[39;00m\n\u001b[1;32m----> 9\u001b[0m data[sKey] \u001b[39m=\u001b[39m new_value\n\u001b[0;32m 11\u001b[0m \u001b[39m# Write the updated data back to the JSON file\u001b[39;00m\n\u001b[0;32m 12\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mopen\u001b[39m(sFilename_json_in, \u001b[39m'\u001b[39m\u001b[39mw\u001b[39m\u001b[39m'\u001b[39m) \u001b[39mas\u001b[39;00m file:\n", - "\u001b[1;31mTypeError\u001b[0m: list indices must be integers or slices, not str" - ] - } - ], + "outputs": [], "source": [ "#we need to update a few parameters in the configuration file before we can create the flowline object\n", "sFilename_basins = realpath( os.path.join(sFolder_input , 'pyflowline_susquehanna_basins.json' ))\n", @@ -378,7 +365,9 @@ "change_json_key_value(sFilename_configuration_in, 'sFilename_basins', sFilename_basins)\n", "\n", "sFilename_flowline = realpath( os.path.join(sFolder_input, 'flowline.geojson') )\n", - "change_json_key_value(sFilename_basins, 'sFilename_flowline_filter', sFilename_flowline, iFlag_basin_in=1)" + "change_json_key_value(sFilename_basins, 'sFilename_flowline_filter', sFilename_flowline, iFlag_basin_in=1)\n", + "sWorkspace_output = os.path.join(sFolder_data_susquehanna, 'output')\n", + "change_json_key_value(sFilename_configuration_in, 'sWorkspace_output', sWorkspace_output)" ] }, { @@ -392,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 14, "id": "2a221825", "metadata": {}, "outputs": [ @@ -400,22 +389,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "/compyfs/liao313/04model/pyflowline/susquehanna\n", - "The filtered flowline file does not exist!\n" - ] - }, - { - "ename": "NameError", - "evalue": "name 'exit' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mc:\\workspace\\python\\pyflowline-main\\notebooks\\mpas_example.ipynb Cell 23\u001b[0m line \u001b[0;36m6\n\u001b[0;32m 1\u001b[0m \u001b[39m#the read function accepts several keyword arguments that can be used to change the default parameters.\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[39m#the normal keyword arguments are:\u001b[39;00m\n\u001b[0;32m 3\u001b[0m \u001b[39m#iCase_index_in: this is an ID to identify the simulation case\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[39m#sMesh_type_in: this specifies the mesh type ('mpas' in this example)\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[39m#sDate_in: this specifies the date of the simulation, the final output folder will have a pattern such as 'pyflowline20230901001', where pyflowline is model, 20230901 is the date, and 001 is the case index.\u001b[39;00m\n\u001b[1;32m----> 6\u001b[0m oPyflowline \u001b[39m=\u001b[39m pyflowline_read_model_configuration_file(sFilename_configuration_in, iCase_index_in\u001b[39m=\u001b[39;49miCase_index, \n\u001b[0;32m 7\u001b[0m sMesh_type_in\u001b[39m=\u001b[39;49m sMesh_type, sDate_in\u001b[39m=\u001b[39;49msDate)\n", - "File \u001b[1;32mC:\\workspace\\python\\pyflowline-main\\pyflowline\\pyflowline_read_model_configuration_file.py:130\u001b[0m, in \u001b[0;36mpyflowline_read_model_configuration_file\u001b[1;34m(sFilename_configuration_in, iFlag_standalone_in, iFlag_use_mesh_dem_in, iCase_index_in, dResolution_degree_in, dResolution_meter_in, sMesh_type_in, sModel_in, sDate_in, sWorkspace_output_in)\u001b[0m\n\u001b[0;32m 116\u001b[0m aConfig[\u001b[39m\"\u001b[39m\u001b[39msFilename_model_configuration\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m sFilename_configuration_in\n\u001b[0;32m 120\u001b[0m \u001b[39m#based on global variable, a few variables are calculate once\u001b[39;00m\n\u001b[0;32m 121\u001b[0m \u001b[39m#calculate the modflow simulation period\u001b[39;00m\n\u001b[0;32m 122\u001b[0m \u001b[39m#https://docs.python.org/3/library/datetime.html#datetime-objects\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 127\u001b[0m \n\u001b[0;32m 128\u001b[0m \u001b[39m#simulation\u001b[39;00m\n\u001b[1;32m--> 130\u001b[0m oPyflowline \u001b[39m=\u001b[39m flowlinecase(aConfig)\n\u001b[0;32m 133\u001b[0m \u001b[39mreturn\u001b[39;00m oPyflowline\n", - "File \u001b[1;32mC:\\workspace\\python\\pyflowline-main\\pyflowline\\classes\\pycase.py:439\u001b[0m, in \u001b[0;36mflowlinecase.__init__\u001b[1;34m(self, aConfig_in, iFlag_standalone_in, sModel_in, sDate_in, sWorkspace_output_in)\u001b[0m\n\u001b[0;32m 437\u001b[0m dummy_basin \u001b[39m=\u001b[39m dummy_data[i]\n\u001b[0;32m 438\u001b[0m dummy_basin[\u001b[39m'\u001b[39m\u001b[39msWorkspace_output_basin\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m=\u001b[39m \u001b[39mstr\u001b[39m(Path(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39msWorkspace_output) \u001b[39m/\u001b[39m sBasin )\n\u001b[1;32m--> 439\u001b[0m pBasin \u001b[39m=\u001b[39m pybasin(dummy_basin)\n\u001b[0;32m 440\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maBasin\u001b[39m.\u001b[39mappend(pBasin)\n\u001b[0;32m 441\u001b[0m \u001b[39melse\u001b[39;00m:\n", - "File \u001b[1;32mC:\\workspace\\python\\pyflowline-main\\pyflowline\\classes\\basin.py:288\u001b[0m, in \u001b[0;36mpybasin.__init__\u001b[1;34m(self, aParameter)\u001b[0m\n\u001b[0;32m 286\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39misfile(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39msFilename_flowline_filter):\n\u001b[0;32m 287\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mThe filtered flowline file does not exist!\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m--> 288\u001b[0m exit\n\u001b[0;32m 289\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39miFlag_dam\u001b[39m==\u001b[39m\u001b[39m1\u001b[39m:\n\u001b[0;32m 290\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m os\u001b[39m.\u001b[39mpath\u001b[39m.\u001b[39misfile(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39msFilename_flowline_raw):\n", - "\u001b[1;31mNameError\u001b[0m: name 'exit' is not defined" + "/compyfs/liao313/04model/pyflowline/susquehanna\n" ] } ], @@ -431,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "17e011b8", "metadata": {}, "outputs": [], @@ -468,10 +442,59 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "4e96d31d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"dLatitude_bot\": 39.2,\n", + " \"dLatitude_top\": 42.8,\n", + " \"dLongitude_left\": -79.0,\n", + " \"dLongitude_right\": -74.5,\n", + " \"dResolution_degree\": 5000.0,\n", + " \"dResolution_meter\": 5000.0,\n", + " \"iCase_index\": 1,\n", + " \"iFlag_break_by_distance\": 0,\n", + " \"iFlag_create_mesh\": 1,\n", + " \"iFlag_dggrid\": 0,\n", + " \"iFlag_flowline\": 1,\n", + " \"iFlag_global\": 0,\n", + " \"iFlag_intersect\": 1,\n", + " \"iFlag_mesh_boundary\": 1,\n", + " \"iFlag_multiple_outlet\": 0,\n", + " \"iFlag_rotation\": 0,\n", + " \"iFlag_save_mesh\": 1,\n", + " \"iFlag_simplification\": 1,\n", + " \"iFlag_standalone\": 1,\n", + " \"iFlag_use_mesh_dem\": 1,\n", + " \"iMesh_type\": 4,\n", + " \"iResolution_index\": 10,\n", + " \"sCase\": \"pyflowline20230101001\",\n", + " \"sDate\": \"20230101\",\n", + " \"sDggrid_type\": \"ISEA3H\",\n", + " \"sFilename_basins\": \"C:\\\\workspace\\\\python\\\\pyflowline-main\\\\data\\\\susquehanna\\\\input\\\\pyflowline_susquehanna_basins.json\",\n", + " \"sFilename_dem\": \"/qfs/people/liao313/workspace/python/pyhexwatershed_icom/data/susquehanna/input/dem_buff_ext.tif\",\n", + " \"sFilename_mesh\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\mpas.geojson\",\n", + " \"sFilename_mesh_boundary\": \"C:\\\\workspace\\\\python\\\\pyflowline-main\\\\data\\\\susquehanna\\\\input\\\\boundary_wgs.geojson\",\n", + " \"sFilename_mesh_info\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\mpas_mesh_info.json\",\n", + " \"sFilename_mesh_kml\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\mpas.kml\",\n", + " \"sFilename_mesh_netcdf\": \"C:\\\\workspace\\\\python\\\\pyflowline-main\\\\data\\\\susquehanna\\\\input\\\\mpas_mesh.nc\",\n", + " \"sFilename_model_configuration\": \"C:\\\\workspace\\\\python\\\\pyflowline-main\\\\data\\\\susquehanna\\\\input\\\\pyflowline_susquehanna_mpas.json\",\n", + " \"sFilename_spatial_reference\": \"/qfs/people/liao313/workspace/python/pyhexwatershed_icom/data/susquehanna/input/boundary_proj_buff.shp\",\n", + " \"sJob\": \"hex\",\n", + " \"sMesh_type\": \"mpas\",\n", + " \"sModel\": \"pyflowline\",\n", + " \"sRegion\": \"susquehanna\",\n", + " \"sWorkspace_bin\": \"/people/liao313/bin\",\n", + " \"sWorkspace_output\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\"\n", + "}\n" + ] + } + ], "source": [ "print(oPyflowline.tojson())" ] @@ -487,7 +510,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "8c4e6526", "metadata": {}, "outputs": [], @@ -510,10 +533,63 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "edd17e3e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"dAccumulation_threshold\": 100000.0,\n", + " \"dLatitude_outlet_degree\": 39.462,\n", + " \"dLongitude_outlet_degree\": -76.0093,\n", + " \"dThreshold_small_river\": 10000.0,\n", + " \"iFlag_dam\": 0,\n", + " \"iFlag_debug\": 1,\n", + " \"iFlag_disconnected\": 0,\n", + " \"iFlag_remove_low_order_river\": 0,\n", + " \"iFlag_remove_small_river\": 0,\n", + " \"iMesh_type\": 1,\n", + " \"lBasinID\": 1,\n", + " \"lCellID_outlet\": -1,\n", + " \"sBasinID\": \"00000001\",\n", + " \"sFilename_area_of_difference\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\area_of_difference.geojson\",\n", + " \"sFilename_basin_info\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\basin_info.json\",\n", + " \"sFilename_confluence_conceptual_info\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\confluence_conceptual_info.json\",\n", + " \"sFilename_confluence_simplified_info\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\confluence_simplified_info.json\",\n", + " \"sFilename_dam\": \"/qfs/people/liao313/data/hexwatershed/susquehanna/auxiliary/ICoM_dams.csv\",\n", + " \"sFilename_distance_to_outlet\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\distance_to_outlet.geojson\",\n", + " \"sFilename_drainage_area\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\drainage_area.geojson\",\n", + " \"sFilename_elevation\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\elevation.geojson\",\n", + " \"sFilename_flow_direction\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flow_direction.geojson\",\n", + " \"sFilename_flowline_conceptual\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_conceptual.geojson\",\n", + " \"sFilename_flowline_conceptual_info\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_conceptual_info.json\",\n", + " \"sFilename_flowline_conceptual_kml\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_conceptual.kml\",\n", + " \"sFilename_flowline_edge\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_edge.geojson\",\n", + " \"sFilename_flowline_filter\": \"C:\\\\workspace\\\\python\\\\pyflowline-main\\\\data\\\\susquehanna\\\\input\\\\flowline.geojson\",\n", + " \"sFilename_flowline_filter_geojson\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_filter.geojson\",\n", + " \"sFilename_flowline_intersect\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_intersect_mesh.geojson\",\n", + " \"sFilename_flowline_raw\": \"/qfs/people/liao313/data/hexwatershed/susquehanna/vector/hydrology/allflowline.shp\",\n", + " \"sFilename_flowline_segment_index_before_intersect\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_segment_index_before_intersect.geojson\",\n", + " \"sFilename_flowline_simplified\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_simplified.geojson\",\n", + " \"sFilename_flowline_simplified_info\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_simplified_info.json\",\n", + " \"sFilename_flowline_split\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\flowline_split.geojson\",\n", + " \"sFilename_flowline_topo\": \"/qfs/people/liao313/data/hexwatershed/susquehanna/auxiliary/flowline.csv\",\n", + " \"sFilename_slope\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\slope.geojson\",\n", + " \"sFilename_stream_edge\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\stream_edge.geojson\",\n", + " \"sFilename_stream_edge_json\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\stream_edge.json\",\n", + " \"sFilename_stream_segment\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\stream_segment.geojson\",\n", + " \"sFilename_variable_polygon\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\variable_polygon.geojson\",\n", + " \"sFilename_variable_polyline\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\variable_polyline.geojson\",\n", + " \"sFilename_watershed_json\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\\\\watershed.json\",\n", + " \"sMesh_type\": \"hexagon\",\n", + " \"sWorkspace_output_basin\": \"\\\\compyfs\\\\liao313\\\\04model\\\\pyflowline\\\\susquehanna\\\\pyflowline20230101001\\\\00000001\"\n", + "}\n" + ] + } + ], "source": [ "print(oPyflowline.aBasin[0].tojson())" ] @@ -529,10 +605,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "8d74fbfc", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Basin 00000001: initial flowline: C:\\workspace\\python\\pyflowline-main\\data\\susquehanna\\input\\flowline.geojson\n" + ] + } + ], "source": [ "#setup the model \n", "oPyflowline.setup()" @@ -555,14 +639,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "05c38d7f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "\n", "\n", - "if iFlag_geopandas == 1:\n", + "if iFlag_geopandas is not None:\n", " import geopandas as gpd\n", " import matplotlib.pyplot as plt\n", " #use the geopanda package\n", @@ -588,7 +683,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "b6d5e2e0", "metadata": {}, "outputs": [], @@ -619,10 +714,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "689984cb", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start flowline simplification: 00000001\n", + "Basin 00000001 has no dam\n", + "Basin 00000001 find flowline vertex\n", + "Elapsed time: 0.0032 seconds\n", + "Basin 00000001 split flowline\n", + "Elapsed time: 7.4150 seconds\n", + "Basin 00000001 started correction flow direction\n", + "Elapsed time: 2.4126 seconds\n", + "Basin 00000001 started loop removal\n", + "Elapsed time: 0.6283 seconds\n", + "Basin 00000001 started update stream order initial\n", + "Elapsed time: 1.0745 seconds\n", + "Basin 00000001 find flowline confluence\n", + "Elapsed time: 0.0508 seconds\n", + "Basin 00000001 started stream segment definition\n", + "Elapsed time: 0.0002 seconds\n", + "Basin 00000001 started confluence definition\n", + "Elapsed time: 0.0200 seconds\n", + "Basin 00000001 started stream topology definition\n", + "Elapsed time: 0.0003 seconds\n", + "Basin 00000001 started stream order definition\n", + "Elapsed time: 0.1069 seconds\n", + "Finish flowline simplification: 00000001\n" + ] + } + ], "source": [ "#run step 1\n", "oPyflowline.flowline_simplification();" @@ -639,12 +764,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "d77190a1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'pybasin' object has no attribute 'sFilename_flowline_simplified_geojson'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\workspace\\python\\pyflowline-main\\notebooks\\mpas_example.ipynb Cell 41\u001b[0m line \u001b[0;36m1\n\u001b[1;32m----> 1\u001b[0m sFilename_geojson \u001b[39m=\u001b[39m oPyflowline\u001b[39m.\u001b[39;49maBasin[\u001b[39m0\u001b[39;49m]\u001b[39m.\u001b[39;49msFilename_flowline_simplified_geojson\n\u001b[0;32m 2\u001b[0m gdf \u001b[39m=\u001b[39m gpd\u001b[39m.\u001b[39mread_file(sFilename_geojson)\n\u001b[0;32m 3\u001b[0m gdf\u001b[39m.\u001b[39mplot()\n", + "\u001b[1;31mAttributeError\u001b[0m: 'pybasin' object has no attribute 'sFilename_flowline_simplified_geojson'" + ] + } + ], "source": [ - "sFilename_geojson = oPyflowline.aBasin[0].sFilename_flowline_simplified_geojson\n", + "sFilename_geojson = oPyflowline.aBasin[0].sFilename_flowline_simplified\n", "gdf = gpd.read_file(sFilename_geojson)\n", "gdf.plot()\n", "plt.show()\n", @@ -671,10 +808,614 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "e898bc82", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start mesh generation.\n", + "80896\n", + "Warning: nNeighbor != nVertex\n", + "80919\n", + "Warning: nNeighbor != nVertex\n", + "87614\n", + "Warning: nNeighbor != nVertex\n", + "128884\n", + "Warning: nNeighbor != nVertex\n", + "128886\n", + "Warning: nNeighbor != nVertex\n", + "128887\n", + "Warning: nNeighbor != nVertex\n", + "150813\n", + "Warning: nNeighbor != nVertex\n", + "151026\n", + "Warning: nNeighbor != nVertex\n", + "151148\n", + "Warning: nNeighbor != nVertex\n", + "151150\n", + "Warning: nNeighbor != nVertex\n", + "151197\n", + "Warning: nNeighbor != nVertex\n", + "151227\n", + "Warning: nNeighbor != nVertex\n", + "151410\n", + "Warning: nNeighbor != nVertex\n", + "151477\n", + "Warning: nNeighbor != nVertex\n", + "151495\n", + "Warning: nNeighbor != nVertex\n", + "151514\n", + "Warning: nNeighbor != nVertex\n", + "151598\n", + "Warning: nNeighbor != nVertex\n", + "151649\n", + "Warning: nNeighbor != nVertex\n", + "151696\n", + "Warning: nNeighbor != nVertex\n", + "151742\n", + "Warning: nNeighbor != nVertex\n", + "151871\n", + "Warning: nNeighbor != nVertex\n", + "151885\n", + "Warning: nNeighbor != nVertex\n", + "151888\n", + "Warning: nNeighbor != nVertex\n", + "151889\n", + "Warning: nNeighbor != nVertex\n", + "151902\n", + "Warning: nNeighbor != nVertex\n", + "151909\n", + "Warning: nNeighbor != nVertex\n", + "151940\n", + "Warning: nNeighbor != nVertex\n", + "151947\n", + "Warning: nNeighbor != nVertex\n", + "151948\n", + "Warning: nNeighbor != nVertex\n", + "151953\n", + "Warning: nNeighbor != nVertex\n", + "151957\n", + "Warning: nNeighbor != nVertex\n", + "151960\n", + "Warning: nNeighbor != nVertex\n", + "151961\n", + "Warning: nNeighbor != nVertex\n", + "151963\n", + "Warning: nNeighbor != nVertex\n", + "151996\n", + "Warning: nNeighbor != nVertex\n", + "152014\n", + "Warning: nNeighbor != nVertex\n", + "152059\n", + "Warning: nNeighbor != nVertex\n", + "152524\n", + "Warning: nNeighbor != nVertex\n", + "152539\n", + "Warning: nNeighbor != nVertex\n", + "152542\n", + "Warning: nNeighbor != nVertex\n", + "152543\n", + "Warning: nNeighbor != nVertex\n", + "152544\n", + "Warning: nNeighbor != nVertex\n", + "152545\n", + "Warning: nNeighbor != nVertex\n", + "152546\n", + "Warning: nNeighbor != nVertex\n", + "152547\n", + "Warning: nNeighbor != nVertex\n", + "152549\n", + "Warning: nNeighbor != nVertex\n", + "152550\n", + "Warning: nNeighbor != nVertex\n", + "152551\n", + "Warning: nNeighbor != nVertex\n", + "152552\n", + "Warning: nNeighbor != nVertex\n", + "152553\n", + "Warning: nNeighbor != nVertex\n", + "152554\n", + "Warning: nNeighbor != nVertex\n", + "152556\n", + "Warning: nNeighbor != nVertex\n", + "152557\n", + "Warning: nNeighbor != nVertex\n", + "152559\n", + "Warning: nNeighbor != nVertex\n", + "152561\n", + "Warning: nNeighbor != nVertex\n", + "152562\n", + "Warning: nNeighbor != nVertex\n", + "152563\n", + "Warning: nNeighbor != nVertex\n", + "152564\n", + "Warning: nNeighbor != nVertex\n", + "152566\n", + "Warning: nNeighbor != nVertex\n", + "152568\n", + "Warning: nNeighbor != nVertex\n", + "152569\n", + "Warning: nNeighbor != nVertex\n", + "152659\n", + "Warning: nNeighbor != nVertex\n", + "152661\n", + "Warning: nNeighbor != nVertex\n", + "152667\n", + "Warning: nNeighbor != nVertex\n", + "152685\n", + "Warning: nNeighbor != nVertex\n", + "152692\n", + "Warning: nNeighbor != nVertex\n", + "152693\n", + "Warning: nNeighbor != nVertex\n", + "152697\n", + "Warning: nNeighbor != nVertex\n", + "152698\n", + "Warning: nNeighbor != nVertex\n", + "152754\n", + "Warning: nNeighbor != nVertex\n", + "152765\n", + "Warning: nNeighbor != nVertex\n", + "152768\n", + "Warning: nNeighbor != nVertex\n", + "152771\n", + "Warning: nNeighbor != nVertex\n", + "152800\n", + "Warning: nNeighbor != nVertex\n", + "152953\n", + "Warning: nNeighbor != nVertex\n", + "153155\n", + "Warning: nNeighbor != nVertex\n", + "153581\n", + "Warning: nNeighbor != nVertex\n", + "153779\n", + "Warning: nNeighbor != nVertex\n", + "153863\n", + "Warning: nNeighbor != nVertex\n", + "153864\n", + "Warning: nNeighbor != nVertex\n", + "153865\n", + "Warning: nNeighbor != nVertex\n", + "153879\n", + "Warning: nNeighbor != nVertex\n", + "153904\n", + "Warning: nNeighbor != nVertex\n", + "153927\n", + "Warning: nNeighbor != nVertex\n", + "153928\n", + "Warning: nNeighbor != nVertex\n", + "154090\n", + "Warning: nNeighbor != nVertex\n", + "154103\n", + "Warning: nNeighbor != nVertex\n", + "154121\n", + "Warning: nNeighbor != nVertex\n", + "154391\n", + "Warning: nNeighbor != nVertex\n", + "154510\n", + "Warning: nNeighbor != nVertex\n", + "154554\n", + "Warning: nNeighbor != nVertex\n", + "154641\n", + "Warning: nNeighbor != nVertex\n", + "154889\n", + "Warning: nNeighbor != nVertex\n", + "155059\n", + "Warning: nNeighbor != nVertex\n", + "155389\n", + "Warning: nNeighbor != nVertex\n", + "155420\n", + "Warning: nNeighbor != nVertex\n", + "155539\n", + "Warning: nNeighbor != nVertex\n", + "156032\n", + "Warning: nNeighbor != nVertex\n", + "156059\n", + "Warning: nNeighbor != nVertex\n", + "156446\n", + "Warning: nNeighbor != nVertex\n", + "156447\n", + "Warning: nNeighbor != nVertex\n", + "156460\n", + "Warning: nNeighbor != nVertex\n", + "156461\n", + "Warning: nNeighbor != nVertex\n", + "156583\n", + "Warning: nNeighbor != nVertex\n", + "156586\n", + "Warning: nNeighbor != nVertex\n", + "156587\n", + "Warning: nNeighbor != nVertex\n", + "156588\n", + "Warning: nNeighbor != nVertex\n", + "156589\n", + "Warning: nNeighbor != nVertex\n", + "156711\n", + "Warning: nNeighbor != nVertex\n", + "156783\n", + "Warning: nNeighbor != nVertex\n", + "156871\n", + "Warning: nNeighbor != nVertex\n", + "157007\n", + "Warning: nNeighbor != nVertex\n", + "157348\n", + "Warning: nNeighbor != nVertex\n", + "157392\n", + "Warning: nNeighbor != nVertex\n", + "157619\n", + "Warning: nNeighbor != nVertex\n", + "157620\n", + "Warning: nNeighbor != nVertex\n", + "157674\n", + "Warning: nNeighbor != nVertex\n", + "157842\n", + "Warning: nNeighbor != nVertex\n", + "157993\n", + "Warning: nNeighbor != nVertex\n", + "157994\n", + "Warning: nNeighbor != nVertex\n", + "158048\n", + "Warning: nNeighbor != nVertex\n", + "158049\n", + "Warning: nNeighbor != nVertex\n", + "158051\n", + "Warning: nNeighbor != nVertex\n", + "158204\n", + "Warning: nNeighbor != nVertex\n", + "158205\n", + "Warning: nNeighbor != nVertex\n", + "158278\n", + "Warning: nNeighbor != nVertex\n", + "158420\n", + "Warning: nNeighbor != nVertex\n", + "158572\n", + "Warning: nNeighbor != nVertex\n", + "158693\n", + "Warning: nNeighbor != nVertex\n", + "158694\n", + "Warning: nNeighbor != nVertex\n", + "158871\n", + "Warning: nNeighbor != nVertex\n", + "158942\n", + "Warning: nNeighbor != nVertex\n", + "159043\n", + "Warning: nNeighbor != nVertex\n", + "159278\n", + "Warning: nNeighbor != nVertex\n", + "159280\n", + "Warning: nNeighbor != nVertex\n", + "159281\n", + "Warning: nNeighbor != nVertex\n", + "159307\n", + "Warning: nNeighbor != nVertex\n", + "159481\n", + "Warning: nNeighbor != nVertex\n", + "159731\n", + "Warning: nNeighbor != nVertex\n", + "159732\n", + "Warning: nNeighbor != nVertex\n", + "159862\n", + "Warning: nNeighbor != nVertex\n", + "159889\n", + "Warning: nNeighbor != nVertex\n", + "159905\n", + "Warning: nNeighbor != nVertex\n", + "159906\n", + "Warning: nNeighbor != nVertex\n", + "159965\n", + "Warning: nNeighbor != nVertex\n", + "159988\n", + "Warning: nNeighbor != nVertex\n", + "160146\n", + "Warning: nNeighbor != nVertex\n", + "160260\n", + "Warning: nNeighbor != nVertex\n", + "160435\n", + "Warning: nNeighbor != nVertex\n", + "161700\n", + "Warning: nNeighbor != nVertex\n", + "161925\n", + "Warning: nNeighbor != nVertex\n", + "161961\n", + "Warning: nNeighbor != nVertex\n", + "161962\n", + "Warning: nNeighbor != nVertex\n", + "162142\n", + "Warning: nNeighbor != nVertex\n", + "162217\n", + "Warning: nNeighbor != nVertex\n", + "162280\n", + "Warning: nNeighbor != nVertex\n", + "162611\n", + "Warning: nNeighbor != nVertex\n", + "162683\n", + "Warning: nNeighbor != nVertex\n", + "162975\n", + "Warning: nNeighbor != nVertex\n", + "162977\n", + "Warning: nNeighbor != nVertex\n", + "163138\n", + "Warning: nNeighbor != nVertex\n", + "163409\n", + "Warning: nNeighbor != nVertex\n", + "163505\n", + "Warning: nNeighbor != nVertex\n", + "163561\n", + "Warning: nNeighbor != nVertex\n", + "163593\n", + "Warning: nNeighbor != nVertex\n", + "163860\n", + "Warning: nNeighbor != nVertex\n", + "163861\n", + "Warning: nNeighbor != nVertex\n", + "164119\n", + "Warning: nNeighbor != nVertex\n", + "164179\n", + "Warning: nNeighbor != nVertex\n", + "164234\n", + "Warning: nNeighbor != nVertex\n", + "164371\n", + "Warning: nNeighbor != nVertex\n", + "164459\n", + "Warning: nNeighbor != nVertex\n", + "164555\n", + "Warning: nNeighbor != nVertex\n", + "164585\n", + "Warning: nNeighbor != nVertex\n", + "164670\n", + "Warning: nNeighbor != nVertex\n", + "164672\n", + "Warning: nNeighbor != nVertex\n", + "164690\n", + "Warning: nNeighbor != nVertex\n", + "164711\n", + "Warning: nNeighbor != nVertex\n", + "164712\n", + "Warning: nNeighbor != nVertex\n", + "164732\n", + "Warning: nNeighbor != nVertex\n", + "164759\n", + "Warning: nNeighbor != nVertex\n", + "164764\n", + "Warning: nNeighbor != nVertex\n", + "164771\n", + "Warning: nNeighbor != nVertex\n", + "164804\n", + "Warning: nNeighbor != nVertex\n", + "164853\n", + "Warning: nNeighbor != nVertex\n", + "164854\n", + "Warning: nNeighbor != nVertex\n", + "164899\n", + "Warning: nNeighbor != nVertex\n", + "164924\n", + "Warning: nNeighbor != nVertex\n", + "165002\n", + "Warning: nNeighbor != nVertex\n", + "165007\n", + "Warning: nNeighbor != nVertex\n", + "165010\n", + "Warning: nNeighbor != nVertex\n", + "165037\n", + "Warning: nNeighbor != nVertex\n", + "165052\n", + "Warning: nNeighbor != nVertex\n", + "165055\n", + "Warning: nNeighbor != nVertex\n", + "165070\n", + "Warning: nNeighbor != nVertex\n", + "165085\n", + "Warning: nNeighbor != nVertex\n", + "165122\n", + "Warning: nNeighbor != nVertex\n", + "165126\n", + "Warning: nNeighbor != nVertex\n", + "165132\n", + "Warning: nNeighbor != nVertex\n", + "165158\n", + "Warning: nNeighbor != nVertex\n", + "165159\n", + "Warning: nNeighbor != nVertex\n", + "165161\n", + "Warning: nNeighbor != nVertex\n", + "165177\n", + "Warning: nNeighbor != nVertex\n", + "165216\n", + "Warning: nNeighbor != nVertex\n", + "165222\n", + "Warning: nNeighbor != nVertex\n", + "165223\n", + "Warning: nNeighbor != nVertex\n", + "165233\n", + "Warning: nNeighbor != nVertex\n", + "165235\n", + "Warning: nNeighbor != nVertex\n", + "165236\n", + "Warning: nNeighbor != nVertex\n", + "165245\n", + "Warning: nNeighbor != nVertex\n", + "165279\n", + "Warning: nNeighbor != nVertex\n", + "165293\n", + "Warning: nNeighbor != nVertex\n", + "165305\n", + "Warning: nNeighbor != nVertex\n", + "165317\n", + "Warning: nNeighbor != nVertex\n", + "165345\n", + "Warning: nNeighbor != nVertex\n", + "165360\n", + "Warning: nNeighbor != nVertex\n", + "165394\n", + "Warning: nNeighbor != nVertex\n", + "165397\n", + "Warning: nNeighbor != nVertex\n", + "165404\n", + "Warning: nNeighbor != nVertex\n", + "165405\n", + "Warning: nNeighbor != nVertex\n", + "165416\n", + "Warning: nNeighbor != nVertex\n", + "165454\n", + "Warning: nNeighbor != nVertex\n", + "165458\n", + "Warning: nNeighbor != nVertex\n", + "165465\n", + "Warning: nNeighbor != nVertex\n", + "165470\n", + "Warning: nNeighbor != nVertex\n", + "165477\n", + "Warning: nNeighbor != nVertex\n", + "165493\n", + "Warning: nNeighbor != nVertex\n", + "165504\n", + "Warning: nNeighbor != nVertex\n", + "165508\n", + "Warning: nNeighbor != nVertex\n", + "165513\n", + "Warning: nNeighbor != nVertex\n", + "165516\n", + "Warning: nNeighbor != nVertex\n", + "165543\n", + "Warning: nNeighbor != nVertex\n", + "165545\n", + "Warning: nNeighbor != nVertex\n", + "165548\n", + "Warning: nNeighbor != nVertex\n", + "165551\n", + "Warning: nNeighbor != nVertex\n", + "165561\n", + "Warning: nNeighbor != nVertex\n", + "165580\n", + "Warning: nNeighbor != nVertex\n", + "165598\n", + "Warning: nNeighbor != nVertex\n", + "165603\n", + "Warning: nNeighbor != nVertex\n", + "165616\n", + "Warning: nNeighbor != nVertex\n", + "165620\n", + "Warning: nNeighbor != nVertex\n", + "165629\n", + "Warning: nNeighbor != nVertex\n", + "165634\n", + "Warning: nNeighbor != nVertex\n", + "165636\n", + "Warning: nNeighbor != nVertex\n", + "165645\n", + "Warning: nNeighbor != nVertex\n", + "165677\n", + "Warning: nNeighbor != nVertex\n", + "165685\n", + "Warning: nNeighbor != nVertex\n", + "165736\n", + "Warning: nNeighbor != nVertex\n", + "165772\n", + "Warning: nNeighbor != nVertex\n", + "165788\n", + "Warning: nNeighbor != nVertex\n", + "165831\n", + "Warning: nNeighbor != nVertex\n", + "165841\n", + "Warning: nNeighbor != nVertex\n", + "165875\n", + "Warning: nNeighbor != nVertex\n", + "165876\n", + "Warning: nNeighbor != nVertex\n", + "165881\n", + "Warning: nNeighbor != nVertex\n", + "165892\n", + "Warning: nNeighbor != nVertex\n", + "165894\n", + "Warning: nNeighbor != nVertex\n", + "165922\n", + "Warning: nNeighbor != nVertex\n", + "165962\n", + "Warning: nNeighbor != nVertex\n", + "165964\n", + "Warning: nNeighbor != nVertex\n", + "165986\n", + "Warning: nNeighbor != nVertex\n", + "165987\n", + "Warning: nNeighbor != nVertex\n", + "165990\n", + "Warning: nNeighbor != nVertex\n", + "165995\n", + "Warning: nNeighbor != nVertex\n", + "166048\n", + "Warning: nNeighbor != nVertex\n", + "166078\n", + "Warning: nNeighbor != nVertex\n", + "166087\n", + "Warning: nNeighbor != nVertex\n", + "166101\n", + "Warning: nNeighbor != nVertex\n", + "166102\n", + "Warning: nNeighbor != nVertex\n", + "166111\n", + "Warning: nNeighbor != nVertex\n", + "166112\n", + "Warning: nNeighbor != nVertex\n", + "166113\n", + "Warning: nNeighbor != nVertex\n", + "166116\n", + "Warning: nNeighbor != nVertex\n", + "166123\n", + "Warning: nNeighbor != nVertex\n", + "166128\n", + "Warning: nNeighbor != nVertex\n", + "166141\n", + "Warning: nNeighbor != nVertex\n", + "166170\n", + "Warning: nNeighbor != nVertex\n", + "166182\n", + "Warning: nNeighbor != nVertex\n", + "166188\n", + "Warning: nNeighbor != nVertex\n", + "166193\n", + "Warning: nNeighbor != nVertex\n", + "166195\n", + "Warning: nNeighbor != nVertex\n", + "166202\n", + "Warning: nNeighbor != nVertex\n", + "166205\n", + "Warning: nNeighbor != nVertex\n", + "166219\n", + "Warning: nNeighbor != nVertex\n", + "166224\n", + "Warning: nNeighbor != nVertex\n", + "166245\n", + "Warning: nNeighbor != nVertex\n", + "166246\n", + "Warning: nNeighbor != nVertex\n", + "166248\n", + "Warning: nNeighbor != nVertex\n", + "166249\n", + "Warning: nNeighbor != nVertex\n", + "166256\n", + "Warning: nNeighbor != nVertex\n", + "166261\n", + "Warning: nNeighbor != nVertex\n", + "166266\n", + "Warning: nNeighbor != nVertex\n", + "166303\n", + "Warning: nNeighbor != nVertex\n", + "80895\n", + "Warning: nNeighbor != nVertex\n", + "165654\n", + "Warning: nNeighbor != nVertex\n", + "160337\n", + "Warning: nNeighbor != nVertex\n", + "165209\n", + "Warning: nNeighbor != nVertex\n", + "165497\n", + "Warning: nNeighbor != nVertex\n" + ] + } + ], "source": [ "#run step 2\n", "#we can either use a rectangle boundary\n", @@ -689,15 +1430,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "20d90d3b", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'flowlinecase' object has no attribute 'sFilename_mesh_geojson'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\workspace\\python\\pyflowline-main\\notebooks\\mpas_example.ipynb Cell 45\u001b[0m line \u001b[0;36m3\n\u001b[0;32m 1\u001b[0m \u001b[39m#use the geopanda package\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[39m#the raw/original geojson file \u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m sFilename_geojson \u001b[39m=\u001b[39m oPyflowline\u001b[39m.\u001b[39;49msFilename_mesh_geojson\n\u001b[0;32m 4\u001b[0m gdf \u001b[39m=\u001b[39m gpd\u001b[39m.\u001b[39mread_file(sFilename_geojson)\n\u001b[0;32m 5\u001b[0m gdf\u001b[39m.\u001b[39mplot()\n", + "\u001b[1;31mAttributeError\u001b[0m: 'flowlinecase' object has no attribute 'sFilename_mesh_geojson'" + ] + } + ], "source": [ "\n", "#use the geopanda package\n", "#the raw/original geojson file \n", - "sFilename_geojson = oPyflowline.aBasin[0].sFilename_mesh_geojson\n", + "sFilename_geojson = oPyflowline.sFilename_mesh\n", "gdf = gpd.read_file(sFilename_geojson)\n", "gdf.plot()\n", "plt.show()\n", @@ -748,13 +1501,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "5f7c76d8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start topology reconstruction.\n", + "Basin 00000001 Start topology reconstruction\n", + "Basin 00000001 Start flowline and mesh intersection\n", + "Elapsed time: 511.0053 seconds\n", + "Basin 00000001 Start return flowline removal\n", + "Elapsed time: 0.8706 seconds\n", + "Basin 00000001 Start split flowline to edge\n", + "Elapsed time: 0.0025 seconds\n", + "Basin 00000001 Start remove duplicate flowline\n", + "Elapsed time: 0.0526 seconds\n", + "Basin 00000001 Start flowline direction correction\n", + "Elapsed time: 0.0528 seconds\n", + "Basin 00000001 Start flowline direction correction\n", + "Elapsed time: 0.0227 seconds\n", + "Basin 00000001 Start find flowline confluence\n", + "Elapsed time: 0.0436 seconds\n", + "Basin 00000001 Start merge flowline\n", + "Elapsed time: 0.1086 seconds\n", + "Basin 00000001 Start find flowline confluence\n", + "Elapsed time: 0.0006 seconds\n", + "Basin 00000001 started stream topology definition\n", + "Elapsed time: 0.0000 seconds\n", + "Finish topology reconstruction: 00000001\n", + "Finish topology reconstruction.\n" + ] + } + ], "source": [ "#runs step 3\n", - "oPyflowline.reconstruct_topological_relationship(aCell);" + "oPyflowline.reconstruct_topological_relationship();" ] }, { @@ -776,8 +1560,8 @@ "\n", "\n", " #\n", - "file1_path = oPyflowline.aBasin[0].sFilename_mesh_geojson\n", - "file2_path = oPyflowline.aBasin[0].sFilename_flowline_conceptual_geojson\n", + "file1_path = oPyflowline.sFilename_mesh\n", + "file2_path = oPyflowline.aBasin[0].sFilename_flowline_conceptual\n", "gdf1 = gpd.read_file(file1_path)\n", "gdf2 = gpd.read_file(file2_path)\n", "fig, ax = plt.subplots()\n", @@ -815,7 +1599,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "e8efab4e", "metadata": {}, "outputs": [], @@ -835,10 +1619,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "eb34bcee", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\workspace\\python\\pyflowline-main\\notebooks\\mpas_example.ipynb Cell 58\u001b[0m line \u001b[0;36m3\n\u001b[0;32m 1\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mopen\u001b[39m(oPyflowline\u001b[39m.\u001b[39msFilename_mesh_info, \u001b[39m'\u001b[39m\u001b[39mr\u001b[39m\u001b[39m'\u001b[39m) \u001b[39mas\u001b[39;00m pJSON:\n\u001b[0;32m 2\u001b[0m parsed \u001b[39m=\u001b[39m json\u001b[39m.\u001b[39mload(pJSON)\n\u001b[1;32m----> 3\u001b[0m \u001b[39mprint\u001b[39m(json\u001b[39m.\u001b[39mdumps(parsed[\u001b[39m0\u001b[39;49m], indent\u001b[39m=\u001b[39m\u001b[39m4\u001b[39m))\n", + "\u001b[1;31mIndexError\u001b[0m: list index out of range" + ] + } + ], "source": [ "with open(oPyflowline.sFilename_mesh_info, 'r') as pJSON:\n", " parsed = json.load(pJSON)\n",