[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