[yt-svn] commit/yt: 2 new changesets

Bitbucket commits-noreply at bitbucket.org
Tue Jan 17 02:22:49 PST 2012


2 new commits in yt:


https://bitbucket.org/yt_analysis/yt/changeset/bedc1f9cdbb5/
changeset:   bedc1f9cdbb5
branch:      yt
user:        samskillman
date:        2012-01-17 01:15:37
summary:     Implementing a MosaicFisheyeCamera that can decompose the image plane for large image creation.  Uses workgroups with MPI sub-communicators.
affected #:  3 files

diff -r 4afeef8b095e8271c8412d65931cdded98462ee2 -r bedc1f9cdbb5e5ab2aa4879f5a7ef702b9f7d23e yt/utilities/_amr_utils/VolumeIntegrator.pyx
--- a/yt/utilities/_amr_utils/VolumeIntegrator.pyx
+++ b/yt/utilities/_amr_utils/VolumeIntegrator.pyx
@@ -241,7 +241,8 @@
         tr[i] = ipnest
     return tr
 
-def arr_fisheye_vectors(int resolution, np.float64_t fov):
+def arr_fisheye_vectors(int resolution, np.float64_t fov, int nimx=1, int
+        nimy=1, int nimi=0, int nimj=0):
     # We now follow figures 4-7 of:
     # http://paulbourke.net/miscellaneous/domefisheye/fisheye/
     # ...but all in Cython.
@@ -250,11 +251,13 @@
     cdef np.float64_t r, phi, theta, px, py
     cdef np.float64_t pi = 3.1415926
     cdef np.float64_t fov_rad = fov * pi / 180.0
-    vp = np.zeros((resolution, resolution, 3), dtype="float64")
-    for i in range(resolution):
-        px = 2.0 * i / (resolution) - 1.0
-        for j in range(resolution):
-            py = 2.0 * j / (resolution) - 1.0
+    cdef int nx = resolution/nimx
+    cdef int ny = resolution/nimy
+    vp = np.zeros((nx,ny, 3), dtype="float64")
+    for i in range(nx):
+        px = 2.0 * (nimi*nx + i) / (resolution) - 1.0
+        for j in range(ny):
+            py = 2.0 * (nimj*ny + j) / (resolution) - 1.0
             r = (px*px + py*py)**0.5
             if r == 0.0:
                 phi = 0.0


diff -r 4afeef8b095e8271c8412d65931cdded98462ee2 -r bedc1f9cdbb5e5ab2aa4879f5a7ef702b9f7d23e yt/visualization/volume_rendering/api.py
--- a/yt/visualization/volume_rendering/api.py
+++ b/yt/visualization/volume_rendering/api.py
@@ -40,4 +40,4 @@
 from image_handling import export_rgba, import_rgba, \
                            plot_channel, plot_rgb
 from camera import Camera, PerspectiveCamera, StereoPairCamera, \
-    off_axis_projection
+    off_axis_projection, FisheyeCamera, MosaicFisheyeCamera


diff -r 4afeef8b095e8271c8412d65931cdded98462ee2 -r bedc1f9cdbb5e5ab2aa4879f5a7ef702b9f7d23e yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -36,7 +36,7 @@
 from yt.visualization.image_writer import write_bitmap
 from yt.data_objects.data_containers import data_object_registry
 from yt.utilities.parallel_tools.parallel_analysis_interface import \
-    ParallelAnalysisInterface
+    ParallelAnalysisInterface, ProcessorPool
 from yt.utilities.amr_kdtree.api import AMRKDTree
 from numpy import pi
 
@@ -845,6 +845,118 @@
         image.shape = (self.resolution, self.resolution, 3)
         return image
 
+class MosaicFisheyeCamera(Camera):
+    def __init__(self, center, radius, fov, resolution,
+                 transfer_function = None, fields = None,
+                 sub_samples = 5, log_fields = None, volume = None,
+                 pf = None, no_ghost=False,nimx=1, nimy=1, procs_per_wg=None,
+                 preload=True, reduce_images=True):
+
+        ParallelAnalysisInterface.__init__(self)
+        PP = ProcessorPool()
+        if procs_per_wg is None:
+            procs_per_wg = PP.size
+        for j in range(nimy):
+            for i in range(nimx):
+                PP.add_workgroup(size=procs_per_wg, name='%04i_%04i'%(i,j))
+                
+        for wg in PP.workgroups:
+            if self.comm.rank in wg.ranks:
+                my_wg = wg
+        
+        self.global_comm = self.comm
+        self.comm = my_wg.comm
+        self.wg = my_wg
+        self.imi = int(self.wg.name[0:4])
+        self.imj = int(self.wg.name[5:9])
+        print 'My new communicator has the name %s' % self.wg.name
+
+        if pf is not None: self.pf = pf
+    
+        if iterable(resolution):
+            raise RuntimeError("Resolution must be a single int")
+        self.resolution = resolution
+        self.nimx = nimx
+        self.nimy = nimy
+        self.center = na.array(center, dtype='float64')
+        self.radius = radius
+        self.fov = fov
+        if transfer_function is None:
+            transfer_function = ProjectionTransferFunction()
+        self.transfer_function = transfer_function
+        if fields is None: fields = ["Density"]
+        self.fields = fields
+        self.sub_samples = sub_samples
+        self.log_fields = log_fields
+        if volume is None:
+            volume = AMRKDTree(self.pf, fields=self.fields, no_ghost=no_ghost,
+                               log_fields=log_fields)
+        self.volume = volume
+
+    def snapshot(self):
+        # We now follow figures 4-7 of:
+        # http://paulbourke.net/miscellaneous/domefisheye/fisheye/
+        # ...but all in Cython.
+
+        vp = arr_fisheye_vectors(self.resolution, self.fov, self.nimx,
+                self.nimy, self.imi, self.imj)
+
+        nx, ny = vp.shape[0], vp.shape[1]
+        vp.shape = (nx*ny,1,3)
+        image = na.zeros((nx*ny,1,3), dtype='float64', order='C')
+        uv = na.ones(3, dtype='float64')
+        positions = na.ones((nx*ny, 1, 3), dtype='float64') * self.center
+        vector_plane = VectorPlane(positions, vp, self.center,
+                        (0.0, 1.0, 0.0, 1.0), image, uv, uv)
+        tfp = TransferFunctionProxy(self.transfer_function)
+        tfp.ns = self.sub_samples
+        self.volume.initialize_source()
+        mylog.info("Rendering fisheye of %s^2", self.resolution)
+        pbar = get_pbar("Ray casting",
+                        (self.volume.brick_dimensions + 1).prod(axis=-1).sum())
+
+        total_cells = 0
+        for brick in self.volume.traverse(None, self.center, image):
+            brick.cast_plane(tfp, vector_plane)
+            total_cells += na.prod(brick.my_data[0].shape)
+            pbar.update(total_cells)
+        pbar.finish()
+        image.shape = (nx, ny, 3)
+
+        self.image = image
+       
+        return image
+
+    def save_image(self, fn):
+        if '.png' not in fn:
+            fn = fn + '.png'
+        
+        try:
+            image = self.image
+        except:
+            mylog.error('You must first take a snapshot')
+            raise(UserWarning)
+        
+        image = self.image
+        nx,ny = self.resolution/self.nimx, self.resolution/self.nimy
+
+        if self.comm.rank == 0:
+            if self.global_comm.rank == 0:
+                final_image = na.empty((nx*self.nimx, 
+                    ny*self.nimy, 3),
+                    dtype='float64',order='C')
+                final_image[:nx, :ny, :] = image
+                for j in range(self.nimy):
+                    for i in range(self.nimx):
+                        if i==0 and j==0: continue
+                        arr = self.global_comm.recv_array((self.wg.size)*(j*self.nimx + i), tag = (self.wg.size)*(j*self.nimx + i))
+
+                        final_image[i*nx:(i+1)*nx, j*ny:(j+1)*ny,:] = arr
+                        del arr
+                write_bitmap(final_image, fn)
+            else:
+                self.global_comm.send_array(image, 0, tag = self.global_comm.rank)
+        return
 
 def off_axis_projection(pf, center, normal_vector, width, resolution,
                         field, weight = None, volume = None, no_ghost = True):



https://bitbucket.org/yt_analysis/yt/changeset/41c8861062bc/
changeset:   41c8861062bc
branch:      yt
user:        samskillman
date:        2012-01-17 01:21:49
summary:     Merging, and adding the rotation to the MosaicFisheyeCamera to mimic FisheyeCamera
affected #:  1 file

diff -r bedc1f9cdbb5e5ab2aa4879f5a7ef702b9f7d23e -r 41c8861062bc480793340593ab21aa06adf6df08 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -797,8 +797,10 @@
     def __init__(self, center, radius, fov, resolution,
                  transfer_function = None, fields = None,
                  sub_samples = 5, log_fields = None, volume = None,
-                 pf = None, no_ghost=False):
+                 pf = None, no_ghost=False, rotation = None):
         ParallelAnalysisInterface.__init__(self)
+        if rotation is None: rotation = na.eye(3)
+        self.rotation = rotation
         if pf is not None: self.pf = pf
         self.center = na.array(center, dtype='float64')
         self.radius = radius
@@ -825,6 +827,10 @@
         # ...but all in Cython.
         vp = arr_fisheye_vectors(self.resolution, self.fov)
         vp.shape = (self.resolution**2,1,3)
+        vp2 = vp.copy()
+        for i in range(3):
+            vp[:,:,i] = (vp2 * self.rotation[:,i]).sum(axis=2)
+        del vp2
         uv = na.ones(3, dtype='float64')
         positions = na.ones((self.resolution**2, 1, 3), dtype='float64') * self.center
         vector_plane = VectorPlane(positions, vp, self.center,
@@ -850,7 +856,7 @@
                  transfer_function = None, fields = None,
                  sub_samples = 5, log_fields = None, volume = None,
                  pf = None, no_ghost=False,nimx=1, nimy=1, procs_per_wg=None,
-                 preload=True, reduce_images=True):
+                 rotation=None):
 
         ParallelAnalysisInterface.__init__(self)
         PP = ProcessorPool()
@@ -873,6 +879,9 @@
 
         if pf is not None: self.pf = pf
     
+        if rotation is None: rotation = na.eye(3)
+        self.rotation = rotation
+
         if iterable(resolution):
             raise RuntimeError("Resolution must be a single int")
         self.resolution = resolution
@@ -900,7 +909,11 @@
 
         vp = arr_fisheye_vectors(self.resolution, self.fov, self.nimx,
                 self.nimy, self.imi, self.imj)
-
+        vp2 = vp.copy()
+        for i in range(3):
+            vp[:,:,i] = (vp2 * self.rotation[:,i]).sum(axis=2)
+        del vp2
+ 
         nx, ny = vp.shape[0], vp.shape[1]
         vp.shape = (nx*ny,1,3)
         image = na.zeros((nx*ny,1,3), dtype='float64', order='C')

Repository URL: https://bitbucket.org/yt_analysis/yt/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the yt-svn mailing list