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])