Procházet zdrojové kódy

temporal modules: Enabled raster region specific parallel processing by using the MultiModule class

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@69509 15284696-431f-4ddb-bdfa-cd5b030d7da7
Soeren Gebbert před 8 roky
rodič
revize
ba91608f5b

+ 33 - 2
temporal/t.rast.neighbors/t.rast.neighbors.py

@@ -83,6 +83,13 @@
 #% key: n
 #% description: Register Null maps
 #%end
+
+
+#%flag
+#% key: r
+#% description: Ignore the current region settings and use the raster map regions
+#%end
+
 from __future__ import print_function
 
 import copy
@@ -102,6 +109,7 @@ def main():
     size = options["size"]
     base = options["basename"]
     register_null = flags["n"]
+    use_raster_region = flags["r"]
     method = options["method"]
     nprocs = options["nprocs"]
     time_suffix = options["suffix"]
@@ -131,6 +139,9 @@ def main():
                                    method=method, overwrite=overwrite,
                                    quiet=True)
 
+    gregion_module =  pymod.Module("g.region", raster="dummy", run_=False,
+                                   finish_=False,)
+
     # The module queue for parallel execution
     process_queue = pymod.ParallelModuleQueue(int(nprocs))
 
@@ -158,11 +169,31 @@ def main():
 
         mod = copy.deepcopy(neighbor_module)
         mod(input=map.get_id(), output=new_map.get_id())
-        print(mod.get_bash())
-        process_queue.put(mod)
+
+        if use_raster_region is True:
+            reg = copy.deepcopy(gregion_module)
+            reg(raster=map.get_id())
+            print(reg.get_bash())
+            print(mod.get_bash())
+            mm = pymod.MultiModule([reg, mod], sync=False, set_temp_region=True)
+            process_queue.put(mm)
+        else:
+            print(mod.get_bash())
+            process_queue.put(mod)
 
     # Wait for unfinished processes
     process_queue.wait()
+    proc_list = process_queue.get_finished_modules()
+
+    # Check return status of all finished modules
+    error = 0
+    for proc in proc_list:
+        if proc.popen.returncode != 0:
+            grass.error(_("Error running module: %\n    stderr: %s") %(proc.get_bash(), proc.outputs.stderr))
+            error += 1
+
+    if error > 0:
+        grass.fatal(_("Error running modules."))
 
     # Open the new space time raster dataset
     ttype, stype, title, descr = sp.get_initial_values()

+ 11 - 1
temporal/t.rast.neighbors/testsuite/test_neighbors.py

@@ -55,7 +55,7 @@ class TestAggregationAbsolute(TestCase):
         self.assertRasterExists('b_2001_01')
         self.assertRasterMinMax('b_2001_02', 1, 10)
         self.assertRasterDoesNotExist('b_2001_03')
-        
+
     def test_simple(self):
         """Test simple t.rast.neighbors"""
         trast_list = SimpleModule("t.rast.neighbors", quiet=True, input="A",
@@ -81,6 +81,16 @@ class TestAggregationAbsolute(TestCase):
         self.assertModule(trast_list)
         self.assertRasterExists('b_001')
 
+    def test_num_region(self):
+        """Test t.rast.neighbors with parallel region processes"""
+        trast_list = SimpleModule("t.rast.neighbors", quiet=True, input="A",
+                                  output="B", size="5", basename='b', nprocs=2,
+                                  suffix="num%03", flags="r", overwrite=True)
+        self.assertModule(trast_list)
+        self.assertRasterExists('b_001')
+        self.assertRasterExists('b_002')
+        self.assertRasterExists('b_003')
+
 if __name__ == '__main__':
     from grass.gunittest.main import test
     test()