diff --git a/.gitignore b/.gitignore index bb6a50992da01174356ab7c15a1eac1f75b8459b..90cae47ba0778a56d40dda1e502709b43a081bcc 100644 --- a/.gitignore +++ b/.gitignore @@ -125,4 +125,7 @@ cython_debug/ .vscode/ # auto_examples -docs/source/auto_examples/ \ No newline at end of file +docs/source/auto_examples/ + +tests/temp_ravaflow_results/ +tests/temp_run_ravaflow/ \ No newline at end of file diff --git a/tests/test_ravaflow24.py b/tests/test_ravaflow24.py deleted file mode 100644 index cc04fe8283d575c0298a20c0a6fa4aecf1167838..0000000000000000000000000000000000000000 --- a/tests/test_ravaflow24.py +++ /dev/null @@ -1,118 +0,0 @@ -import os -import pytest -import numpy as np -from psimpy.simulator import Ravaflow24Mixture - -@pytest.mark.parametrize( - "dir_sim, conversion_control, curvature_control, surface_control, \ - entrainment_control, stopping_control", - [ - (os.path.abspath(os.path.join(__file__, '../not_exist_dir')), - '0', '0', '0', '0', '0'), - (os.path.abspath(os.path.join(__file__, '../data/synthetic_rel.tif')), - '0', '0', '0', '0', '0'), - (os.path.abspath(os.path.join(__file__, '../data')), - '2', '0', '0', '0', '0'), - (os.path.abspath(os.path.join(__file__, '../data')), - '0', '3', '0', '0', '0'), - (os.path.abspath(os.path.join(__file__, '../data')), - '0', '0', '2', '0', '0'), - (os.path.abspath(os.path.join(__file__, '../data')), - '0', '0', '0', '5', '0'), - (os.path.abspath(os.path.join(__file__, '../data')), - '0', '0', '0', '0', '4') - ] -) -def test_ravaflow24_mixture_init_ValueError(dir_sim, conversion_control, - curvature_control, surface_control, entrainment_control, stopping_control): - with pytest.raises(ValueError): - _ = Ravaflow24Mixture( - dir_sim=dir_sim, - conversion_control=conversion_control, - curvature_control=curvature_control, - surface_control=surface_control, - entrainment_control=entrainment_control, - stopping_control=stopping_control) - - -@pytest.mark.parametrize( - "prefix, elevation, hrelease", - [ - ('sim', - os.path.abspath(os.path.join(__file__, '../data/synthetic_topo.tif')), - os.path.abspath(os.path.join(__file__, '../data/synthetic_rel.tif')) - ), - ('sim_new', - os.path.abspath(os.path.join(__file__, '../data/syn_topo.tif')), - os.path.abspath(os.path.join(__file__, '../data/synthetic_rel.tif')) - ), - ('sim_new', - os.path.abspath(os.path.join(__file__, '../data/synthetic_topo.tif')), - os.path.abspath(os.path.join(__file__, '../data/syn_rel.tif')) - ) - ] -) -def test_ravaflow24_mixture_preprocess_ValueError(prefix, elevation, hrelease): - dir_test = os.path.abspath(os.path.join(__file__, '../')) - os.chdir(dir_test) - if not os.path.exists('temp_ravaflow_1'): - os.mkdir('temp_ravaflow_1') - os.chdir('temp_ravaflow_1') - dir_sim = os.path.join(dir_test, 'temp_ravaflow_1') - if not os.path.exists('sim_results'): - os.mkdir('sim_results') - - rflow24_mixture = Ravaflow24Mixture(dir_sim=dir_sim) - with pytest.raises(ValueError): - rflow24_mixture.preprocess( - prefix=prefix, elevation=elevation, hrelease=hrelease) - - -def test_ravaflow24_mixture_run_and_extract_output(): - dir_test = os.path.abspath(os.path.join(__file__, '../')) - os.chdir(dir_test) - if not os.path.exists('temp_ravaflow_2'): - os.mkdir('temp_ravaflow_2') - dir_sim = os.path.join(dir_test, 'temp_ravaflow_2') - - rflow24_mixture = Ravaflow24Mixture(dir_sim=dir_sim, time_end=100) - - elevation = os.path.join(dir_test, 'data/synthetic_topo.tif') - hrelease = os.path.join(dir_test, 'data/synthetic_rel.tif') - prefix = 'test' - - grass_location, sh_file = rflow24_mixture.preprocess( - prefix=prefix, elevation=elevation, hrelease=hrelease, EPSG='2326') - - rflow24_mixture.run(grass_location, sh_file) - - assert os.path.exists(os.path.join(dir_sim, f'{prefix}_results')) - - impact_area = rflow24_mixture.extract_impact_area(prefix) - print(f"impact_area: {impact_area}") - assert isinstance(impact_area, float) - assert impact_area > 0 - - overall_max_velocity = rflow24_mixture.extract_qoi_max(prefix, 'v') - print(f"overall_max_velocity: {overall_max_velocity}") - assert isinstance(overall_max_velocity, float) - assert overall_max_velocity > 0 - - raster_max_velocity = rflow24_mixture.extract_qoi_max(prefix, 'v', - aggregate=False) - assert isinstance(raster_max_velocity, np.ndarray) - assert np.max(raster_max_velocity) == overall_max_velocity - - loc = np.array([[500, 2000], [600, 2000], [700, 2500]]) - loc_max_pressure = rflow24_mixture.extract_qoi_max_loc(prefix, loc, 'p') - print(f"loc_max_pressure: {loc_max_pressure}") - assert isinstance(loc_max_pressure, np.ndarray) - assert loc_max_pressure.ndim == 1 - assert len(loc_max_pressure) == len(loc) - - loc = np.array([[500, 2000]]) - loc_max_energy = rflow24_mixture.extract_qoi_max_loc(prefix, loc, 't') - print(f"loc_max_energy: {loc_max_energy}") - assert isinstance(loc_max_energy, np.ndarray) - assert loc_max_energy.ndim == 1 - assert len(loc_max_energy) == len(loc) diff --git a/tests/test_ravaflow3G.py b/tests/test_ravaflow3G.py new file mode 100644 index 0000000000000000000000000000000000000000..d7274376de563fcaeb03ca4cd2bfdb37363644cd --- /dev/null +++ b/tests/test_ravaflow3G.py @@ -0,0 +1,139 @@ +import os +import pytest +import numpy as np +from psimpy.simulator import Ravaflow3GMixture + + +@pytest.mark.parametrize( + "dir_sim, diffusion_control, curvature_control, surface_control, \ + entrainment_control, stopping_control", + [ + ( + os.path.abspath(os.path.join(__file__, "../not_exist_dir")), + "0", + "0", + "0", + "0", + "0", + ), + ( + os.path.abspath(os.path.join(__file__, "../data/synthetic_rel.tif")), + "0", + "0", + "0", + "0", + "0", + ), + (os.path.abspath(os.path.join(__file__, "../data")), "2", "0", "0", "0", "0"), + (os.path.abspath(os.path.join(__file__, "../data")), "0", "3", "0", "0", "0"), + (os.path.abspath(os.path.join(__file__, "../data")), "0", "0", "2", "0", "0"), + (os.path.abspath(os.path.join(__file__, "../data")), "0", "0", "0", "5", "0"), + (os.path.abspath(os.path.join(__file__, "../data")), "0", "0", "0", "0", "4"), + ], +) +def test_ravaflow24_mixture_init_ValueError( + dir_sim, + diffusion_control, + curvature_control, + surface_control, + entrainment_control, + stopping_control, +): + with pytest.raises(ValueError): + _ = Ravaflow3GMixture( + dir_sim=dir_sim, + diffusion_control=diffusion_control, + curvature_control=curvature_control, + surface_control=surface_control, + entrainment_control=entrainment_control, + stopping_control=stopping_control, + ) + + +@pytest.mark.parametrize( + "prefix, elevation, hrelease", + [ + ( + "sim", + os.path.abspath(os.path.join(__file__, "../data/synthetic_topo.tif")), + os.path.abspath(os.path.join(__file__, "../data/synthetic_rel.tif")), + ), + ( + "sim_new", + os.path.abspath(os.path.join(__file__, "../data/syn_topo.tif")), + os.path.abspath(os.path.join(__file__, "../data/synthetic_rel.tif")), + ), + ( + "sim_new", + os.path.abspath(os.path.join(__file__, "../data/synthetic_topo.tif")), + os.path.abspath(os.path.join(__file__, "../data/syn_rel.tif")), + ), + ], +) +def test_ravaflow24_mixture_preprocess_ValueError(prefix, elevation, hrelease): + dir_test = os.path.abspath(os.path.join(__file__, "../")) + os.chdir(dir_test) + if not os.path.exists("temp_ravaflow_1"): + os.mkdir("temp_ravaflow_1") + os.chdir("temp_ravaflow_1") + dir_sim = os.path.join(dir_test, "temp_ravaflow_1") + if not os.path.exists("sim_results"): + os.mkdir("sim_results") + + ravaflow3G_mixture = Ravaflow3GMixture(dir_sim=dir_sim) + with pytest.raises(ValueError): + ravaflow3G_mixture.preprocess( + prefix=prefix, elevation=elevation, hrelease=hrelease + ) + + +def test_ravaflow24_mixture_run_and_extract_output(): + dir_test = os.path.abspath(os.path.join(__file__, "../")) + os.chdir(dir_test) + if not os.path.exists("temp_ravaflow_2"): + os.mkdir("temp_ravaflow_2") + dir_sim = os.path.join(dir_test, "temp_ravaflow_2") + + ravaflow3G_mixture = Ravaflow3GMixture(dir_sim=dir_sim, time_end=100) + + elevation = os.path.join(dir_test, "data/synthetic_topo.tif") + hrelease = os.path.join(dir_test, "data/synthetic_rel.tif") + prefix = "test" + + grass_location, sh_file = ravaflow3G_mixture.preprocess( + prefix=prefix, elevation=elevation, hrelease=hrelease, EPSG="2326" + ) + + ravaflow3G_mixture.run(grass_location, sh_file) + + assert os.path.exists(os.path.join(dir_sim, f"{prefix}_results")) + + impact_area = ravaflow3G_mixture.extract_impact_area(prefix) + print(f"impact_area: {impact_area}") + assert isinstance(impact_area, float) + assert impact_area > 0 + + overall_max_velocity = ravaflow3G_mixture.extract_qoi_max(prefix, "v") + print(f"overall_max_velocity: {overall_max_velocity}") + assert isinstance(overall_max_velocity, float) + assert overall_max_velocity > 0 + + raster_max_velocity = ravaflow3G_mixture.extract_qoi_max( + prefix, "v", aggregate=False + ) + assert isinstance(raster_max_velocity, np.ndarray) + assert np.max(raster_max_velocity) == overall_max_velocity + + loc = np.array([[500, 2000], [600, 2000], [700, 2500]]) + loc_max_pressure = ravaflow3G_mixture.extract_qoi_max_loc(prefix, loc, "p") + print(f"loc_max_pressure: {loc_max_pressure}") + assert isinstance(loc_max_pressure, np.ndarray) + assert loc_max_pressure.ndim == 1 + assert len(loc_max_pressure) == len(loc) + + loc = np.array([[500, 2000]]) + loc_max_energy = ravaflow3G_mixture.extract_qoi_max_loc(prefix, loc, "t") + print(f"loc_max_energy: {loc_max_energy}") + assert isinstance(loc_max_energy, np.ndarray) + assert loc_max_energy.ndim == 1 + assert len(loc_max_energy) == len(loc) diff --git a/tests/test_run_ravaflow24.py b/tests/test_run_ravaflow24.py deleted file mode 100644 index 940630cc01760fa79aa8502da82f89c4446953cd..0000000000000000000000000000000000000000 --- a/tests/test_run_ravaflow24.py +++ /dev/null @@ -1,93 +0,0 @@ -import os -import time -import itertools -import numpy as np -from psimpy.simulator import RunSimulator -from psimpy.simulator import Ravaflow24Mixture - -dir_test = os.path.abspath(os.path.join(__file__, '../')) - -os.chdir(dir_test) -if not os.path.exists('temp_run_ravaflow'): - os.mkdir('temp_run_ravaflow') -dir_out = os.path.join(dir_test, 'temp_run_ravaflow') - -if not os.path.exists('temp_ravaflow_results'): - os.mkdir('temp_ravaflow_results') -dir_sim = os.path.join(dir_test, 'temp_ravaflow_results') - -elevation = os.path.join(dir_test, 'data/synthetic_topo.tif') -hrelease = os.path.join(dir_test, 'data/synthetic_rel.tif') -loc = np.array([[500, 2000], [600, 2000], [700, 2500]]) - -rflow24_mixture = Ravaflow24Mixture(dir_sim=dir_sim, time_end=100) - -# define simulator -def simulator(prefix, elevation, hrelease, basal_friction, - turbulent_friction, EPSG, qoi, loc): - - grass_location, sh_file = rflow24_mixture.preprocess( - prefix=prefix, elevation=elevation, hrelease=hrelease, - basal_friction=basal_friction, - turbulent_friction=turbulent_friction, EPSG=EPSG) - - rflow24_mixture.run(grass_location, sh_file) - - impact_area = rflow24_mixture.extract_impact_area(prefix) - overall_max_qoi = rflow24_mixture.extract_qoi_max(prefix, qoi) - loc_max_qoi = rflow24_mixture.extract_qoi_max_loc(prefix, loc, qoi) - - output = np.zeros(len(loc_max_qoi)+2) - output[0] = impact_area - output[1] = overall_max_qoi - output[2:] = loc_max_qoi - - return output - -def test_run_ravaflow24(): - var_inp_parameter = ['basal_friction', 'turbulent_friction'] - fix_inp = {'elevation': elevation, 'hrelease': hrelease, 'qoi': 'v', - 'loc': loc, 'EPSG': '2326'} - o_parameter = 'prefix' - - run_ravaflow24 = RunSimulator( - simulator=simulator, var_inp_parameter=var_inp_parameter, - fix_inp=fix_inp, o_parameter=o_parameter, dir_out=dir_out, - save_out=True) - - basal_friction = [20] - turbulent_friction = [3, 4] - var_samples = np.array( - [x for x in itertools.product(basal_friction, turbulent_friction)]) - - serial_prefixes = ["serial"+str(i) for i in range(len(var_samples))] - - start = time.time() - run_ravaflow24.serial_run(var_samples=var_samples, prefixes=serial_prefixes) - serial_time = time.time() - start - serial_output = run_ravaflow24.outputs - print(f"serial_output: {serial_output}") - assert len(serial_output) == len(var_samples) - - for i in range(len(var_samples)): - assert isinstance(serial_output[i], np.ndarray) - assert len(serial_output[i]) == len(loc) + 2 - - parallel_prefixes = ["parallel"+str(i) for i in range(len(var_samples))] - - start = time.time() - run_ravaflow24.parallel_run(var_samples, prefixes=parallel_prefixes, - max_workers=2, append=True) - parallel_time = time.time() - start - - assert len(run_ravaflow24.outputs) == 2 * len(var_samples) - parallel_output = run_ravaflow24.outputs[len(var_samples):] - print(f"parallel_output: {parallel_output}") - assert len(parallel_output) == len(var_samples) - - print("Serial run time: ", serial_time) - print("Parallel run time: ", parallel_time) - assert serial_time > parallel_time - - for i in range(len(var_samples)): - assert np.array_equal(serial_output[i], parallel_output[i]) \ No newline at end of file diff --git a/tests/test_run_ravaflow3G.py b/tests/test_run_ravaflow3G.py new file mode 100644 index 0000000000000000000000000000000000000000..52ba9f8029315742f5ff3b05b16bdb1c1a0b7f00 --- /dev/null +++ b/tests/test_run_ravaflow3G.py @@ -0,0 +1,110 @@ +import os +import time +import itertools +import numpy as np +from psimpy.simulator import RunSimulator +from psimpy.simulator import Ravaflow3GMixture + +dir_test = os.path.abspath(os.path.join(__file__, "../")) + +os.chdir(dir_test) +if not os.path.exists("temp_run_ravaflow"): + os.mkdir("temp_run_ravaflow") +dir_out = os.path.join(dir_test, "temp_run_ravaflow") + +if not os.path.exists("temp_ravaflow_results"): + os.mkdir("temp_ravaflow_results") +dir_sim = os.path.join(dir_test, "temp_ravaflow_results") + +elevation = os.path.join(dir_test, "data/synthetic_topo.tif") +hrelease = os.path.join(dir_test, "data/synthetic_rel.tif") +loc = np.array([[500, 2000], [600, 2000], [700, 2500]]) + +ravaflow3G_mixture = Ravaflow3GMixture(dir_sim=dir_sim, time_end=100) + + +# define simulator +def simulator( + prefix, elevation, hrelease, basal_friction, turbulent_friction, EPSG, qoi, loc +): + grass_location, sh_file = ravaflow3G_mixture.preprocess( + prefix=prefix, + elevation=elevation, + hrelease=hrelease, + basal_friction=basal_friction, + turbulent_friction=turbulent_friction, + EPSG=EPSG, + ) + + ravaflow3G_mixture.run(grass_location, sh_file) + + impact_area = ravaflow3G_mixture.extract_impact_area(prefix) + overall_max_qoi = ravaflow3G_mixture.extract_qoi_max(prefix, qoi) + loc_max_qoi = ravaflow3G_mixture.extract_qoi_max_loc(prefix, loc, qoi) + + output = np.zeros(len(loc_max_qoi) + 2) + output[0] = impact_area + output[1] = overall_max_qoi + output[2:] = loc_max_qoi + + return output + + +def test_run_ravaflow3G(): + var_inp_parameter = ["basal_friction", "turbulent_friction"] + fix_inp = { + "elevation": elevation, + "hrelease": hrelease, + "qoi": "v", + "loc": loc, + "EPSG": "2326", + } + o_parameter = "prefix" + + run_ravaflow3G = RunSimulator( + simulator=simulator, + var_inp_parameter=var_inp_parameter, + fix_inp=fix_inp, + o_parameter=o_parameter, + dir_out=dir_out, + save_out=True, + ) + + basal_friction = [20] + turbulent_friction = [3, 4] + var_samples = np.array( + [x for x in itertools.product(basal_friction, turbulent_friction)] + ) + + serial_prefixes = ["serial" + str(i) for i in range(len(var_samples))] + + start = time.time() + run_ravaflow3G.serial_run(var_samples=var_samples, prefixes=serial_prefixes) + serial_time = time.time() - start + serial_output = run_ravaflow3G.outputs + print(f"serial_output: {serial_output}") + assert len(serial_output) == len(var_samples) + + for i in range(len(var_samples)): + assert isinstance(serial_output[i], np.ndarray) + assert len(serial_output[i]) == len(loc) + 2 + + parallel_prefixes = ["parallel" + str(i) for i in range(len(var_samples))] + + start = time.time() + run_ravaflow3G.parallel_run( + var_samples, prefixes=parallel_prefixes, max_workers=2, append=True + ) + parallel_time = time.time() - start + + assert len(run_ravaflow3G.outputs) == 2 * len(var_samples) + parallel_output = run_ravaflow3G.outputs[len(var_samples) :] + print(f"parallel_output: {parallel_output}") + assert len(parallel_output) == len(var_samples) + + print("Serial run time: ", serial_time) + print("Parallel run time: ", parallel_time) + assert serial_time > parallel_time + + for i in range(len(var_samples)): + assert np.array_equal(serial_output[i], parallel_output[i])