7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#!/usr/bin/ksh93
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# or http://www.opensolaris.org/os/licensing.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# mandelbrotset1 - a simple mandelbrot set generation and
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# parallel execution demo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Make sure all math stuff runs in the "C" locale to avoid problems
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# with alternative # radix point representations (e.g. ',' instead of
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# '.' in de_DE.*-locales). This needs to be set _before_ any
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# floating-point constants are defined in this script).
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinif [[ "${LC_ALL}" != "" ]] ; then
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin export \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_MONETARY="${LC_ALL}" \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_MESSAGES="${LC_ALL}" \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_COLLATE="${LC_ALL}" \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin LC_CTYPE="${LC_ALL}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unset LC_ALL
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfi
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexport LC_NUMERIC=C
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction printmsg
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 "$*"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction fatal_error
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 "${progname}: $*"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Get terminal size and put values into a compound variable with the integer
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# members "columns" and "lines"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction get_term_size
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref rect=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rect.columns=${ tput cols ; } || return 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin rect.lines=${ tput lines ; } || return 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction mandelbrot
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin nameref result=$1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float x=$2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float y=$3
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float xx
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float yy
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float x1=$4
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float y1=$5
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer iteration=$6
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer max_iteration=$7
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin float mag
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( mag=0 ; mag < max_mag && iteration < max_iteration ; iteration++ )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ((
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin xx=x*x ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin yy=y*y ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mag=xx+yy ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin y=x*y*2+y1 ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x=xx-yy+x1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( result=iteration ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# build mandelbrot image serially
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction loop_serial
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer value
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset line=""
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( y=y_min ; y < y_max ; y+=stepwidth )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( x=x_min ; x < x_max ; x+=stepwidth )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mandelbrot value ${x} ${y} ${x} ${y} 1 ${symbollistlen}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz line+="${symbollist:value:1}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz line+=$'\n'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -r -- "${line}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# build mandelbrot image using parallel worker jobs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction loop_parallel
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer numjobs=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # the following calculation suffers from rounding errors
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer lines_per_job=$(( ((m_height+(numcpus-1)) / numcpus) ))
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset tmpjobdir
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printmsg $"# lines_per_job=${lines_per_job}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printmsg $"# numcpus=${numcpus}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # "renice" worker jobs
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin set -o bgnice
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz tmpjobdir="$(mktemp --default=/tmp --directory "mandelbrotset1${PPID}_$$_XXXXXX")" || fatal_error $"Could not create temporary directory."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz trap "rm -r ${tmpjobdir}" EXIT # cleanup
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin # try to generate a job identifer prefix which is unique across multiple hosts
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin jobident="job_host_$(uname -n)pid_$$_ppid${PPID}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printmsg $"## prepare..."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( y=y_min ; y < y_max ; y+=(stepwidth*lines_per_job) )) ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz rm -f "${tmpjobdir}/${jobident}_child_$y.joboutput"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (( numjobs++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printmsg $"## running ${numjobs} children..."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( y=y_min ; y < y_max ; y+=(stepwidth*lines_per_job) )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer value
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset line=""
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # save file name since we're going to modify "y"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz typeset filename="${tmpjobdir}/${jobident}_child_$y.joboutput"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( ; y < y_max && lines_per_job-- > 0 ; y+=stepwidth )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( x=x_min ; x < x_max ; x+=stepwidth )) ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin mandelbrot value ${x} ${y} ${x} ${y} 1 ${symbollistlen}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz line+="${symbollist:value:1}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz line+=$'\n'
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz done
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -r -- "${line}" >"${filename}"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz exit 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin ) &
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printmsg $"## waiting for ${numjobs} children..."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin wait
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin printmsg $"## output:"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for (( y=y_min ; y < y_max ; y+=(stepwidth*lines_per_job) )) ; do
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz print -r -- "$( < "${tmpjobdir}/${jobident}_child_$y.joboutput")"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz # EXIT trap will cleanup temporary files
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction usage
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin OPTIND=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin getopts -a "${progname}" "${mandelbrotset1_usage}" OPT '-?'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin exit 2
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# main
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin basename
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin cat
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin rm
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinbuiltin uname # loop_parallel needs the ksh93 builtin version to generate unique job file names
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzbuiltin mktemp
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o noglob
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o nounset
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset progname="${ basename "${0}" ; }"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat x_max
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat x_min
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat y_max
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat y_min
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat m_width
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat m_height
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat max_mag
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfloat stepwidth
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger numcpus
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# terminal size rect
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcompound termsize=(
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer columns=-1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin integer lines=-1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinget_term_size termsize || fatal_error $"Could not get terminal size."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset symbollist=' .:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%#'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset symbollistlen=$(( ${#symbollist} - 1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset mode="parallel"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner(( max_mag=400 ))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner(( stepwidth=0.1 ))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# calculate number of worker CPUs and use 3 as fallback
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner(( numcpus=$(getconf NPROCESSORS_ONLN || print "3") ))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner(( numcpus=numcpus*4 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(( m_width=termsize.columns-1 , m_height=termsize.lines-2 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset -r mandelbrotset1_usage=$'+
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner[-?\n@(#)\$Id: mandelbrotset1 (Roland Mainz) 2010-03-31 \$\n]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[-author?Roland Mainz <roland.mainz@nrubsig.org>]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+NAME?mandelbrotset1 - generate mandelbrot set fractals with ksh93]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+DESCRIPTION?\bmandelbrotset1\b mandelbrot set fractal generator
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin which runs either in serial or parallel mode (using multiple worker jobs).]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[w:width?Width of fractal.]:[width]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[h:height?Height of fractal.]:[height]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[s:symbols?Symbols to build the fractal from.]:[symbolstring]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[m:mag?Magnification level.]:[magnificationlevel]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[p:stepwidth?Width per step.]:[widthperstep]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[S:serial?Run in serial mode.]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[P:parallel?Run in parallel mode.]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[M:mode?Execution mode.]:[mode]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[C:numcpus?Number of processors used for parallel execution.]:[numcpus]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin[+SEE ALSO?\bjuliaset1\b(1), \bksh93\b(1)]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinwhile getopts -a "${progname}" "${mandelbrotset1_usage}" OPT ; do
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case ${OPT} in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin w) m_width="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin h) m_height="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin s) symbollist="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin m) max_mag="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin p) stepwidth="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin S) mode="serial" ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz +S) mode="parallel" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin P) mode="parallel" ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz +P) mode="serial" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin M) mode="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin C) numcpus="${OPTARG}" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) usage ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chindone
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinshift $((OPTIND-1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintmsg "# width=${m_width}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintmsg "# height=${m_height}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintmsg "# max_mag=${max_mag}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintmsg "# stepwidth=${stepwidth}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintmsg "# symbollist='${symbollist}'"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinprintmsg "# mode=${mode}"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(( symbollistlen=${#symbollist}-1 ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin((
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x_max=m_width*stepwidth/2. ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin x_min=-x_max ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin y_max=m_height*stepwidth/2. ,
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin y_min=-y_max
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincase "${mode}" in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin parallel) loop_parallel ; exit $? ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin serial) loop_serial ; exit $? ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin *) fatal_error $"Unknown mode \"${mode}\"." ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinesac
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfatal_error "not reached."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# EOF.