#!/bin/ksh93 # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright 2006 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)mandelbrot1.ksh 1.1 06/03/24 SMI" # export PATH=/bin:/usr/bin:/usr/X11R6/bin:/usr/openwin/bin function printmsg { print "$@" >&2 } function fatal_error { print "${progname}: $@" >&2 } function print_color { print -n "${symbollist:${1}:1}" } function mandelbrot { float x=$1 float y=$2 float xx float yy float x1=$3 float y1=$4 integer iteration=$5 integer max_iteration=$6 float mag for (( mag=0 ; mag < max_mag && iteration < max_iteration ; iteration++ )) ; do (( xx=x*x )) (( yy=y*y )) (( mag=xx+yy )) (( y=x*y*2+y1 )) (( x=xx-yy+x1 )) done print $iteration return 0 } function loop_serial { for (( y=y_min ; y < y_max ; y+=stepwidth )) ; do for (( x=x_min ; x < x_max ; x+=stepwidth )) ; do print_color $(mandelbrot ${x} ${y} ${x} ${y} 1 ${symbollistlen}) done print done } function loop_parallel { integer numjobs=0 # "renice" worker jobs set -o bgnice # try to generate a job identifer prefix which is unique across multiple hosts jobident="job_host_$(uname -n)pid_$$_ppid${PPID}" printmsg "## prepare..." for (( y=y_min ; y < y_max ; y+=stepwidth )) ; do rm -f "/tmp/mandelbrot_${jobident}_child_$y.joboutput" let numjobs++ done printmsg "## running ${numjobs} children..." for (( y=y_min ; y < y_max ; y+=stepwidth )) ; do ( for (( x=x_min ; x < x_max ; x+=stepwidth )) ; do print_color $(mandelbrot ${x} ${y} ${x} ${y} 1 ${symbollistlen}) done >"/tmp/mandelbrot_${jobident}_child_$y.joboutput" ) & done printmsg "## waiting for ${numjobs} children..." wait printmsg "## output:" for (( y=y_min ; y < y_max ; y+=stepwidth )) ; do print "$(cat "/tmp/mandelbrot_${jobident}_child_$y.joboutput")" rm "/tmp/mandelbrot_${jobident}_child_$y.joboutput" done } # main builtin printf builtin cat builtin rm builtin sleep builtin uname # loop_parallel needs the ksh93 builtin version to generate unique job file names float x_max float x_min float y_max float y_min float m_width float m_height float max_mag float stepwidth # make sure ${COLUMN} and ${LINES} are set eval $(resize) symbollist=" .0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#" symbollistlen=$(( ${#symbollist} - 1)) mode="parallel" progname="${0}" max_mag=400 stepwidth=0.1 let m_width=COLUMNS-1 m_height=LINES-2 while [ $# -gt 1 ] ; do case "${1}" in -w | -width) shift ; m_width=$1 ;; -h | -height) shift ; m_height=$1 ;; -symbols) shift ; symbollist=$1 ;; -mag) shift ; max_mag=$1 ;; -stepwidth) shift ; stepwidth=$1 ;; -serial) mode="serial" ;; -parallel) mode="parallel" ;; -mode) shift ; mode=$1 ;; *) fatal_error "Unknown option '${1}'." esac shift done printmsg "# width=${m_width}" printmsg "# height=${m_height}" printmsg "# max_mag=${max_mag}" printmsg "# stepwidth=${stepwidth}" printmsg "# symbollist='${symbollist}'" printmsg "# mode=${mode}" symbollistlen=$(( ${#symbollist} - 1)) let x_max=m_width*stepwidth/2. x_min=-x_max let y_max=m_height*stepwidth/2. y_min=-y_max case "${mode}" in parallel) loop_parallel ;; serial) loop_serial ;; *) fatal_error "Unknown mode '${mode}'." esac # EOF.