|
15 | 15 | "outputs": [], |
16 | 16 | "source": [ |
17 | 17 | "import os\n", |
18 | | - "import shutil\n", |
19 | | - "import numpy as np\n", |
20 | 18 | "from pathlib import Path\n", |
21 | 19 | "import subprocess\n", |
22 | | - "import time" |
| 20 | + "import PyStemmusScope" |
23 | 21 | ] |
24 | 22 | }, |
25 | 23 | { |
|
38 | 36 | "outputs": [], |
39 | 37 | "source": [ |
40 | 38 | "# path to model repository\n", |
41 | | - "path_to_model = Path(\"path_to_STEMMUS_SCOPE_repository\")" |
| 39 | + "path_to_model = \"path_to_STEMMUS_SCOPE_repository\"" |
42 | 40 | ] |
43 | 41 | }, |
44 | 42 | { |
|
57 | 55 | "name": "stdout", |
58 | 56 | "output_type": "stream", |
59 | 57 | "text": [ |
60 | | - "Already on 'name_of_your_branch'\n", |
61 | | - "On branch name_of_your_branch\n", |
| 58 | + "Already on 'python-compliant'\n", |
| 59 | + "Your branch is up to date with 'origin/python-compliant'.\n", |
| 60 | + "On branch python-compliant\n", |
| 61 | + "Your branch is up to date with 'origin/python-compliant'.\n", |
| 62 | + "\n", |
62 | 63 | "Untracked files:\n", |
63 | 64 | " (use \"git add <file>...\" to include in what will be committed)\n", |
| 65 | + "\t\u001b[31m.ipynb_checkpoints/\u001b[m\n", |
64 | 66 | "\t\u001b[31mexe/mccExcludedFiles.log\u001b[m\n", |
65 | 67 | "\t\u001b[31mexe/readme.txt\u001b[m\n", |
66 | 68 | "\t\u001b[31mexe/requiredMCRProducts.txt\u001b[m\n", |
67 | 69 | "\t\u001b[31mexe/run_STEMMUS_SCOPE.sh\u001b[m\n", |
68 | 70 | "\t\u001b[31mexe/unresolvedSymbols.txt\u001b[m\n", |
69 | | - "\t\u001b[31mjava.log.42488\u001b[m\n", |
70 | | - "\t\u001b[31mslurm/\u001b[m\n", |
71 | | - "\t\u001b[31mslurm_901092.out\u001b[m\n", |
72 | | - "\t\u001b[31mslurm_901245.out\u001b[m\n", |
73 | | - "\t\u001b[31mslurm_901391.out\u001b[m\n", |
74 | | - "\t\u001b[31mslurm_901417.out\u001b[m\n", |
75 | | - "\t\u001b[31mslurm_901577.out\u001b[m\n", |
76 | | - "\t\u001b[31mslurm_902191.out\u001b[m\n", |
77 | | - "\t\u001b[31mslurm_908852.out\u001b[m\n", |
78 | | - "\t\u001b[31mtest_run_stemmus_scope_snellius.sh\u001b[m\n", |
| 71 | + "\t\u001b[31mtest_config.txt\u001b[m\n", |
79 | 72 | "\t\u001b[31mutils/csv_to_nc/__pycache__/\u001b[m\n", |
80 | | - "\t\u001b[31mutils/get_info_stemmus_scope_snellius.sh\u001b[m\n", |
81 | 73 | "\n", |
82 | 74 | "nothing added to commit but untracked files present (use \"git add\" to track)\n" |
83 | 75 | ] |
|
104 | 96 | "source": [ |
105 | 97 | "# the user must provide the correct path\n", |
106 | 98 | "# path to config file\n", |
107 | | - "config_file_path = path_to_model / \"config_file_snellius.txt\"\n", |
108 | | - "# create an empty dict\n", |
109 | | - "config = {}\n", |
110 | | - "with open(config_file_path, \"r\") as f:\n", |
111 | | - " for line in f:\n", |
112 | | - " (key, val) = line.split(\"=\")\n", |
113 | | - " config[key] = val.rstrip('\\n')" |
| 99 | + "path_to_config_file = \"path_to_config_file\"\n", |
| 100 | + "# Instantiate working directories handler from PyStemmusScope\n", |
| 101 | + "config = PyStemmusScope.read_config(path_to_config_file)" |
114 | 102 | ] |
115 | 103 | }, |
116 | 104 | { |
|
121 | 109 | { |
122 | 110 | "data": { |
123 | 111 | "text/plain": [ |
124 | | - "{'SoilPropertyPath': '/projects/0/einf2480/model_parameters/soil_property/',\n", |
125 | | - " 'InputPath': '/scratch-shared/ecoextreml/stemmus_scope/input/',\n", |
126 | | - " 'OutputPath': '/scratch-shared/ecoextreml/stemmus_scope/output/',\n", |
| 112 | + "{'WorkDir': '/scratch-shared/ecoextreml/stemmus_scope/',\n", |
| 113 | + " 'SoilPropertyPath': '/projects/0/einf2480/model_parameters/soil_property/',\n", |
127 | 114 | " 'ForcingPath': '/projects/0/einf2480/forcing/plumber2_data/',\n", |
128 | 115 | " 'ForcingFileName': 'FI-Hyy_1996-2014_FLUXNET2015_Met.nc',\n", |
129 | | - " 'VegetationPropertyPath': '/projects/0/einf2480/model_parameters/vegetation_property/',\n", |
130 | | - " 'DurationSize': '17520'}" |
| 116 | + " 'directional': '/projects/0/einf2480/model_parameters/vegetation_property/directional/',\n", |
| 117 | + " 'fluspect_parameters': '/projects/0/einf2480/model_parameters/vegetation_property/fluspect_parameters/',\n", |
| 118 | + " 'leafangles': '/projects/0/einf2480/model_parameters/vegetation_property/leafangles/',\n", |
| 119 | + " 'radiationdata': '/projects/0/einf2480/model_parameters/vegetation_property/radiationdata/',\n", |
| 120 | + " 'soil_spectrum': '/projects/0/einf2480/model_parameters/vegetation_property/soil_spectrum/',\n", |
| 121 | + " 'input_data': '/projects/0/einf2480/model_parameters/vegetation_property/input_data.xlsx',\n", |
| 122 | + " 'InitialConditionPath': '/projects/0/einf2480/soil_initialcondition/',\n", |
| 123 | + " 'NumberOfTimeSteps': '17520',\n", |
| 124 | + " 'InputPath': '/scratch-shared/ecoextreml/stemmus_scope/input/FI-Hyy_2022-05-11-1705/',\n", |
| 125 | + " 'OutputPath': '/scratch-shared/ecoextreml/stemmus_scope/output/FI-Hyy_2022-05-11-1705/'}" |
131 | 126 | ] |
132 | 127 | }, |
133 | 128 | "execution_count": 5, |
|
147 | 142 | { |
148 | 143 | "data": { |
149 | 144 | "text/plain": [ |
150 | | - "{'SoilPropertyPath': '/projects/0/einf2480/model_parameters/soil_property/',\n", |
151 | | - " 'InputPath': '/scratch-shared/ecoextreml/stemmus_scope/input/',\n", |
152 | | - " 'OutputPath': '/scratch-shared/ecoextreml/stemmus_scope/output/',\n", |
| 145 | + "{'WorkDir': '/scratch-shared/ecoextreml/stemmus_scope/',\n", |
| 146 | + " 'SoilPropertyPath': '/projects/0/einf2480/model_parameters/soil_property/',\n", |
153 | 147 | " 'ForcingPath': '/projects/0/einf2480/forcing/plumber2_data/',\n", |
154 | 148 | " 'ForcingFileName': 'FI-Hyy_1996-2014_FLUXNET2015_Met.nc',\n", |
155 | | - " 'VegetationPropertyPath': '/projects/0/einf2480/model_parameters/vegetation_property/',\n", |
156 | | - " 'DurationSize': '5'}" |
| 149 | + " 'directional': '/projects/0/einf2480/model_parameters/vegetation_property/directional/',\n", |
| 150 | + " 'fluspect_parameters': '/projects/0/einf2480/model_parameters/vegetation_property/fluspect_parameters/',\n", |
| 151 | + " 'leafangles': '/projects/0/einf2480/model_parameters/vegetation_property/leafangles/',\n", |
| 152 | + " 'radiationdata': '/projects/0/einf2480/model_parameters/vegetation_property/radiationdata/',\n", |
| 153 | + " 'soil_spectrum': '/projects/0/einf2480/model_parameters/vegetation_property/soil_spectrum/',\n", |
| 154 | + " 'input_data': '/projects/0/einf2480/model_parameters/vegetation_property/input_data.xlsx',\n", |
| 155 | + " 'InitialConditionPath': '/projects/0/einf2480/soil_initialcondition/',\n", |
| 156 | + " 'NumberOfTimeSteps': '5',\n", |
| 157 | + " 'InputPath': '/scratch-shared/ecoextreml/stemmus_scope/input/FI-Hyy_2022-05-11-1705/',\n", |
| 158 | + " 'OutputPath': '/scratch-shared/ecoextreml/stemmus_scope/output/FI-Hyy_2022-05-11-1705/'}" |
157 | 159 | ] |
158 | 160 | }, |
159 | 161 | "execution_count": 6, |
|
163 | 165 | ], |
164 | 166 | "source": [ |
165 | 167 | "# edit config\n", |
166 | | - "config[\"DurationSize\"] = \"5\"\n", |
| 168 | + "config[\"NumberOfTimeSteps\"] = \"5\"\n", |
167 | 169 | "config" |
168 | 170 | ] |
169 | 171 | }, |
|
178 | 180 | "cell_type": "code", |
179 | 181 | "execution_count": 7, |
180 | 182 | "metadata": {}, |
181 | | - "outputs": [], |
182 | | - "source": [ |
183 | | - "def input_dir(ncfile, config):\n", |
184 | | - " \"\"\"Create input directory and prepare input files\n", |
185 | | - " \"\"\"\n", |
186 | | - " # get start time with the format Y-M-D-HM\n", |
187 | | - " timestamp = time.strftime('%Y%m%d_%H%M')\n", |
188 | | - " station_name = ncfile.split('_')[0]\n", |
189 | | - " # create input directory\n", |
190 | | - " work_dir = Path(f\"{config['InputPath']}{station_name}_{timestamp}\")\n", |
191 | | - " Path(work_dir).mkdir(parents=True, exist_ok=True)\n", |
192 | | - " print(f\"Prepare work directory {work_dir} for the station: {station_name}\")\n", |
193 | | - " # copy model parameters to work directory\n", |
194 | | - " shutil.copytree(config[\"VegetationPropertyPath\"], work_dir, dirs_exist_ok=True)\n", |
195 | | - " # update config file for ForcingFileName and InputPath\n", |
196 | | - " config_file_path = Path(work_dir, f\"{station_name}_{timestamp}_config.txt\")\n", |
197 | | - " with open(config_file_path, 'w') as f:\n", |
198 | | - " for i in config.keys():\n", |
199 | | - " if i == \"ForcingFileName\":\n", |
200 | | - " f.write(i + \"=\" + ncfile + \"\\n\")\n", |
201 | | - " elif i == \"InputPath\":\n", |
202 | | - " f.write(i + \"=\" + str(work_dir) + \"/\" + \"\\n\")\n", |
203 | | - " else:\n", |
204 | | - " f.write(i + \"=\" + config[i] + \"\\n\")\n", |
205 | | - "\n", |
206 | | - " return work_dir, config_file_path\n", |
207 | | - " " |
208 | | - ] |
209 | | - }, |
210 | | - { |
211 | | - "cell_type": "code", |
212 | | - "execution_count": 8, |
213 | | - "metadata": {}, |
214 | 183 | "outputs": [ |
215 | 184 | { |
216 | 185 | "name": "stdout", |
217 | 186 | "output_type": "stream", |
218 | 187 | "text": [ |
219 | | - "Prepare work directory /scratch-shared/ecoextreml/stemmus_scope/input/NL-Hor_20220517_1757 for the station: NL-Hor\n", |
220 | | - "Prepare work directory /scratch-shared/ecoextreml/stemmus_scope/input/ZA-Kru_20220517_1757 for the station: ZA-Kru\n" |
| 188 | + "/scratch-shared/ecoextreml/stemmus_scope/input/FI-Hyy_20220621_1415 /scratch-shared/ecoextreml/stemmus_scope/output/FI-Hyy_20220621_1415 /scratch-shared/ecoextreml/stemmus_scope/input/FI-Hyy_20220621_1415/FI-Hyy_20220621_1415_config.txt\n" |
221 | 189 | ] |
222 | 190 | } |
223 | 191 | ], |
224 | 192 | "source": [ |
225 | 193 | "# specify the forcing filename\n", |
226 | 194 | "forcing_filename = config[\"ForcingFileName\"]\n", |
227 | | - "work_dir, config_path = input_dir(forcing_filename, config)" |
| 195 | + "input_dir, output_dir, config_path = PyStemmusScope.create_io_dir(forcing_filename, config)\n", |
| 196 | + "print(input_dir, output_dir, config_path)" |
228 | 197 | ] |
229 | 198 | }, |
230 | 199 | { |
|
236 | 205 | }, |
237 | 206 | { |
238 | 207 | "cell_type": "code", |
239 | | - "execution_count": 9, |
| 208 | + "execution_count": 8, |
240 | 209 | "metadata": {}, |
241 | 210 | "outputs": [ |
242 | 211 | { |
243 | 212 | "name": "stdout", |
244 | 213 | "output_type": "stream", |
245 | 214 | "text": [ |
246 | | - "Run STEMMUS-SCOPE with the forcing: NL-Hor_2008-2011_FLUXNET2015_Met.nc\n", |
247 | 215 | "MATLAB is selecting SOFTWARE OPENGL rendering.\n", |
248 | | - "Opening log file: /scratch-shared/ecoextreml/stemmus_scope/input/NL-Hor_20220517_1757/java.log.43865\n", |
| 216 | + "Opening log file: /scratch-shared/ecoextreml/stemmus_scope/input/FI-Hyy_20220621_1415/java.log.45704\n", |
249 | 217 | "\n", |
250 | 218 | " < M A T L A B (R) >\n", |
251 | 219 | " Copyright 1984-2021 The MathWorks, Inc.\n", |
|
256 | 224 | "To get started, type doc.\n", |
257 | 225 | "For product information, visit www.mathworks.com.\n", |
258 | 226 | " \n", |
259 | | - "Reading config from /scratch-shared/ecoextreml/stemmus_scope/input/NL-Hor_20220517_1757/NL-Hor_20220517_1757_config.txt\n", |
260 | | - "\n", |
261 | | - " The calculations start now \n", |
262 | | - "Run STEMMUS-SCOPE with the forcing: ZA-Kru_2000-2002_FLUXNET2015_Met.nc\n", |
263 | | - "MATLAB is selecting SOFTWARE OPENGL rendering.\n", |
264 | | - "Opening log file: /scratch-shared/ecoextreml/stemmus_scope/input/ZA-Kru_20220517_1757/java.log.44704\n", |
265 | | - "\n", |
266 | | - " < M A T L A B (R) >\n", |
267 | | - " Copyright 1984-2021 The MathWorks, Inc.\n", |
268 | | - " R2021a Update 3 (9.10.0.1684407) 64-bit (glnxa64)\n", |
269 | | - " May 27, 2021\n", |
270 | | - "\n", |
271 | | - " \n", |
272 | | - "To get started, type doc.\n", |
273 | | - "For product information, visit www.mathworks.com.\n", |
274 | | - " \n", |
275 | | - "Reading config from /scratch-shared/ecoextreml/stemmus_scope/input/ZA-Kru_20220517_1757/ZA-Kru_20220517_1757_config.txt\n", |
| 227 | + "Reading config from /scratch-shared/ecoextreml/stemmus_scope/input/FI-Hyy_20220621_1415/FI-Hyy_20220621_1415_config.txt\n", |
276 | 228 | "\n", |
277 | 229 | " The calculations start now \n", |
278 | 230 | " The calculations end now \r" |
|
281 | 233 | ], |
282 | 234 | "source": [ |
283 | 235 | "# generate a text file\n", |
284 | | - "path_to_code = path_to_model / \"src\"\n", |
| 236 | + "path_to_code = \"path_to_model_src\"\n", |
285 | 237 | "\n", |
286 | 238 | "# set matlab log dir to slurm, otherwise java.log files are created in user home dir\n", |
287 | | - "os.environ['MATLAB_LOG_DIR'] = str(work_dir)\n", |
| 239 | + "os.environ['MATLAB_LOG_DIR'] = str(input_dir)\n", |
288 | 240 | "\n", |
289 | 241 | "# set matlab arguments\n", |
290 | 242 | "path_to_config = f\"'{config_path}'\"\n", |
|
312 | 264 | "name": "stdout", |
313 | 265 | "output_type": "stream", |
314 | 266 | "text": [ |
315 | | - "/scratch-shared/ecoextreml/stemmus_scope/output/NL-Hor_2022-05-17-1758/ECdata.csv\n", |
316 | | - "Reading variable metadata from /home/alidoost/STEMMUS_SCOPE/utils/csv_to_nc/Variables_will_be_in_NetCDF_file.csv\n", |
317 | | - "Creating /scratch-shared/ecoextreml/stemmus_scope/output/NL-Hor_2022-05-17-1758/NL-Hor_2022-05-17-1758_STEMMUS_SCOPE.nc \n", |
318 | | - "Reading data from file: radiation.csv\n", |
319 | | - "Reading data from file: fluxes.csv\n", |
320 | | - "Reading data from file: surftemp.csv\n", |
321 | | - "Reading data from file: Sim_Temp.csv\n", |
322 | | - "Reading data from file: Sim_Theta.csv\n", |
323 | | - "Reading data from file: aerodyn.csv\n", |
324 | | - "Reading data from file: ECdata.csv\n", |
325 | | - "Done writing /scratch-shared/ecoextreml/stemmus_scope/output/NL-Hor_2022-05-17-1758/NL-Hor_2022-05-17-1758_STEMMUS_SCOPE.nc\n", |
326 | | - "/scratch-shared/ecoextreml/stemmus_scope/output/ZA-Kru_2022-05-17-1758/ECdata.csv\n", |
327 | | - "Reading variable metadata from /home/alidoost/STEMMUS_SCOPE/utils/csv_to_nc/Variables_will_be_in_NetCDF_file.csv\n", |
328 | | - "Creating /scratch-shared/ecoextreml/stemmus_scope/output/ZA-Kru_2022-05-17-1758/ZA-Kru_2022-05-17-1758_STEMMUS_SCOPE.nc \n", |
| 267 | + "/scratch-shared/ecoextreml/stemmus_scope/output/FI-Hyy_20220621_1415/ECdata.csv\n", |
| 268 | + "Reading variable metadata from /home/yangl/STEMMUS_SCOPE/utils/csv_to_nc/Variables_will_be_in_NetCDF_file.csv\n", |
| 269 | + "Creating /scratch-shared/ecoextreml/stemmus_scope/output/FI-Hyy_20220621_1415/FI-Hyy_20220621_1415_STEMMUS_SCOPE.nc \n", |
329 | 270 | "Reading data from file: radiation.csv\n", |
330 | 271 | "Reading data from file: fluxes.csv\n", |
331 | 272 | "Reading data from file: surftemp.csv\n", |
332 | 273 | "Reading data from file: Sim_Temp.csv\n", |
333 | 274 | "Reading data from file: Sim_Theta.csv\n", |
334 | 275 | "Reading data from file: aerodyn.csv\n", |
335 | 276 | "Reading data from file: ECdata.csv\n", |
336 | | - "Done writing /scratch-shared/ecoextreml/stemmus_scope/output/ZA-Kru_2022-05-17-1758/ZA-Kru_2022-05-17-1758_STEMMUS_SCOPE.nc\n" |
| 277 | + "Done writing /scratch-shared/ecoextreml/stemmus_scope/output/FI-Hyy_20220621_1415/FI-Hyy_20220621_1415_STEMMUS_SCOPE.nc\n" |
337 | 278 | ] |
338 | 279 | } |
339 | 280 | ], |
340 | 281 | "source": [ |
341 | 282 | "# convert csv files to nc files\n", |
342 | | - "path_to_utils = Path(path_to_model, \"utils/csv_to_nc\")\n", |
343 | | - "result = subprocess.run([\"python\", Path(path_to_utils, \"generate_netcdf_files.py\"),\n", |
| 283 | + "path_to_generate_netcdf_script = \"path_to_generate_netcdf_script\"\n", |
| 284 | + "path_to_Variables_will_be_in_NetCDF_file = \"path_to_Variables_will_be_in_NetCDF_file\"\n", |
| 285 | + "result = subprocess.run([\"python\", path_to_generate_netcdf_script,\n", |
344 | 286 | " \"--config_file\", config_path, \"--variable_file\",\n", |
345 | | - " Path(path_to_utils, \"Variables_will_be_in_NetCDF_file.csv\")])\n", |
| 287 | + " path_to_Variables_will_be_in_NetCDF_file])\n", |
346 | 288 | "result.check_returncode()" |
347 | 289 | ] |
348 | 290 | }, |
|
362 | 304 | "name": "stdout", |
363 | 305 | "output_type": "stream", |
364 | 306 | "text": [ |
365 | | - "Opening log file: ./java.log.45777\n" |
| 307 | + "Opening log file: ./java.log.52377\n" |
366 | 308 | ] |
367 | 309 | } |
368 | 310 | ], |
|
389 | 331 | "name": "stdout", |
390 | 332 | "output_type": "stream", |
391 | 333 | "text": [ |
392 | | - "On branch name_of_your_branch\n", |
| 334 | + "On branch python-compliant\n", |
| 335 | + "Your branch is up to date with 'origin/python-compliant'.\n", |
| 336 | + "\n", |
393 | 337 | "Changes not staged for commit:\n", |
394 | 338 | " (use \"git add <file>...\" to update what will be committed)\n", |
395 | 339 | " (use \"git restore <file>...\" to discard changes in working directory)\n", |
396 | 340 | "\t\u001b[31mmodified: exe/STEMMUS_SCOPE\u001b[m\n", |
397 | 341 | "\n", |
398 | 342 | "Untracked files:\n", |
399 | 343 | " (use \"git add <file>...\" to include in what will be committed)\n", |
| 344 | + "\t\u001b[31m.ipynb_checkpoints/\u001b[m\n", |
400 | 345 | "\t\u001b[31mexe/mccExcludedFiles.log\u001b[m\n", |
401 | 346 | "\t\u001b[31mexe/readme.txt\u001b[m\n", |
402 | 347 | "\t\u001b[31mexe/requiredMCRProducts.txt\u001b[m\n", |
403 | 348 | "\t\u001b[31mexe/run_STEMMUS_SCOPE.sh\u001b[m\n", |
404 | 349 | "\t\u001b[31mexe/unresolvedSymbols.txt\u001b[m\n", |
405 | | - "\t\u001b[31mjava.log.42488\u001b[m\n", |
406 | | - "\t\u001b[31mjava.log.45777\u001b[m\n", |
407 | | - "\t\u001b[31mslurm/\u001b[m\n", |
408 | | - "\t\u001b[31mslurm_901092.out\u001b[m\n", |
409 | | - "\t\u001b[31mslurm_901245.out\u001b[m\n", |
410 | | - "\t\u001b[31mslurm_901391.out\u001b[m\n", |
411 | | - "\t\u001b[31mslurm_901417.out\u001b[m\n", |
412 | | - "\t\u001b[31mslurm_901577.out\u001b[m\n", |
413 | | - "\t\u001b[31mslurm_902191.out\u001b[m\n", |
414 | | - "\t\u001b[31mslurm_908852.out\u001b[m\n", |
415 | | - "\t\u001b[31mtest_run_stemmus_scope_snellius.sh\u001b[m\n", |
| 350 | + "\t\u001b[31mjava.log.52377\u001b[m\n", |
| 351 | + "\t\u001b[31mtest_config.txt\u001b[m\n", |
416 | 352 | "\t\u001b[31mutils/csv_to_nc/__pycache__/\u001b[m\n", |
417 | | - "\t\u001b[31mutils/get_info_stemmus_scope_snellius.sh\u001b[m\n", |
418 | 353 | "\n", |
419 | 354 | "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" |
420 | 355 | ] |
|
423 | 358 | "source": [ |
424 | 359 | "!git -C {path_to_model} status" |
425 | 360 | ] |
426 | | - }, |
427 | | - { |
428 | | - "cell_type": "code", |
429 | | - "execution_count": null, |
430 | | - "metadata": {}, |
431 | | - "outputs": [], |
432 | | - "source": [] |
433 | 361 | } |
434 | 362 | ], |
435 | 363 | "metadata": { |
436 | 364 | "interpreter": { |
437 | 365 | "hash": "28b136f154b3384fcb2854e5626613232692c304dbc5315064ef4c9363104a2c" |
438 | 366 | }, |
439 | 367 | "kernelspec": { |
440 | | - "display_name": "Python 3.7.6 64-bit ('esmvaltool': conda)", |
| 368 | + "display_name": "Python 3 (ipykernel)", |
441 | 369 | "language": "python", |
442 | | - "name": "python37664bitesmvaltoolconda8248b33b29dd45388bf12a38f96e3b70" |
| 370 | + "name": "python3" |
443 | 371 | }, |
444 | 372 | "language_info": { |
| 373 | + "codemirror_mode": { |
| 374 | + "name": "ipython", |
| 375 | + "version": 3 |
| 376 | + }, |
| 377 | + "file_extension": ".py", |
| 378 | + "mimetype": "text/x-python", |
445 | 379 | "name": "python", |
446 | | - "version": "" |
| 380 | + "nbconvert_exporter": "python", |
| 381 | + "pygments_lexer": "ipython3", |
| 382 | + "version": "3.9.12" |
447 | 383 | }, |
448 | 384 | "metadata": { |
449 | 385 | "interpreter": { |
|
0 commit comments