跳转至内容

分形/mightymandel

来自 Wikibooks,开放世界中的开放书籍

mightymandel 是由 Claude Heiland-Allen 创建的 Mandelbrot 集合探索器。这里可以找到关于它的非官方文档

  • 绘制具有 Mandelbrot 集合边界的复二次多项式的参数平面
  • 许可证 GPL3+ [1]
  • 使用级数逼近的扰动技术。 [2]
  • 基于 OpenGL 4 的 GPGPU [3] (“我的 GPU 比我的 CPU 快得多”)
  • 使用 C(C99)编写,提供完整的源代码 [4]
  • 多精度

平面描述

[编辑 | 编辑源代码]

Claude Heiland-Allen [4] 使用中心和半径来 描述参数平面

半径定义为“中心和轴对齐的视图矩形的顶部之间的虚坐标差”。

因此平面由 3 个数字描述

  • center_re
  • center_im
  • radius

其中 center = center_re + center_im * i

  • opengl 用于 GPGPU
    • 版本 4.1(支持 3.3 作为没有扰动的备用方案,但会极大地限制缩放深度)
    • 库:gl、glew、[5] glfw3、[6]
  • 多精度(库 MPFR [7]
  • rt [8]
  • 程序
    • gcc
    • make
    • bash
    • sed
    • git
    • pkg-config
    • ts(用于测试套件,请参阅 /src/test.sh)在 Ubunty 中使用:sudo apt-get install moreutils
    • doxygen(用于文档)
    • 用于视频
      • AVConv - 自动视频转换器
      • FFmpeg

可以使用 ldd 检查它

 ldd -d -v ./src/mightymandel

或者查看 /src/Makefile

-lGLEW -lGL -lrt -lmpfr -lm

Debian 包

[编辑 | 编辑源代码]

Debian Jessie 上,这足以安装编译所需的一切:[9]

sudo aptitude install \
        build-essential \
        git \
        libglew-dev \
        libglfw3-dev \
        libmpfr-dev \
        pkg-config

获取源代码

[编辑 | 编辑源代码]

首次

 git clone https://gitorious.org/maximus/mightymandel.git

要更新源代码,请运行(从程序目录)

git pull

然后可以 构建程序

远程仓库

[编辑 | 编辑源代码]
 git remote show origin

结果

* remote origin
  Fetch URL: https://gitorious.org/maximus/mightymandel.git
  Push  URL: https://gitorious.org/maximus/mightymandel.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)
 git describe

示例输出

 v14-164-g9cd6fc7

进入 mightymandel 目录

cd ~/mightymandel

然后 make


make -C src clean
make -C src

或者,如果遇到问题:[10]

make -C src EXTRA_LINK_FLAGS="-lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi"

或者编辑 Makefile 并添加额外的标志,但之后更新源代码就会遇到问题。

还可以构建并运行 测试套件

Package glfw3 was not found in the pkg-config search path.

下载并安装 glfw:[11]


cd glfw-3.0.4
hash -r
cmake -G "Unix Makefiles"
make
sudo make install

Ubuntu 14.10 (utopic) 有 glfw3 的软件包 [12](但 CUDA 软件包仅适用于 Ubuntu 的 LTS 版本,现在是 13.04)

下一个错误

LINK    mightymandel
/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_clipboard.c.o): undefined reference to symbol 'XConvertSelection'
/usr/lib/x86_64-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line

在 makefile 中添加(在 Ubuntu 13.10 64 位上)

	-lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi \
file  ./mightymandel
./mightymandel: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x2a424b6dcad8de5e29e3f0b17524dbf34de18aaa, not stripped

转到程序目录并

./src/mightymandel
 ./src/mightymandel—version

示例结果

v16-10-gd079448+2015-01-20-16-40-55

可以使用以下方法运行(从程序目录)示例参数文件 fp32.mm:

./src/mightymandel ./examples/mm/fp32.mm


现在 mightymandel 无法加载原生 fractint par 文件。它们需要被转换为 ppar 文件。

如何预处理 Fractint par 文件

  • 将 txt 文件(包含多个图像的参数)拆分为单个图像文件(包含原始文件 7 行内容)
  • 将包含多个参数的行拆分为每行一个参数的行(将空格替换为换行符)
  • 添加 ppar 扩展名:[13]
  • 删除所有不包含以下内容的 par 文件:
    • "type=mandel"(mightymandel 只能绘制曼德勃罗集合)
    • "corners=" 或 "center-mag="
#!/usr/bin/env bash
# chmod +x s.sh
# ./s.sh
for f in *.txt; 
do 	
 echo " found "$f " file ";
 #split -l 7 $f; 
 awk '/{/{n++}{print > n".p" }' $f
 echo $f "- split when { is found  and add p extension " ;
 rm $f;
 echo " input file " $f " is removed " ;
done

for f in *.p; 	
do
 echo " in "$f " file replace space with newline and add ppar extension"
 # tr '{}' '()' < infile > outfile
 tr ' ' '\n' < $f >$f"par"
 rm $f;
done

for f in *.ppar; 	
do
 echo "remove blank= empty lines"
 sed -i '/^$/d' $f
done

评论: "预处理脚本会移除输入文件而不提示,这有点粗鲁!而且它不支持合并以 \ 结尾的行" Claude

以下是 Claude 编写的 split2ppar.sh 脚本

#!/bin/bash
tmp="$(mktemp -d --tmpdir=. split2ppar.XXXXXXXX)"
for file in "${@}"
do
  name="$(basename "${file}")"
  file="$(readlink -e "${file}")"
  pushd "${tmp}"
  awk "/{/{n++}{print > \"${name}_\"n\".par\" }" "${file}"
  popd
done
pushd "${tmp}"
for file in *.par
do
  ident="$(head -n 1 "${file}" | sed 's/ .*$//')"
  mv "${file}" "${ident}.par"       # rename input
  cat < "${ident}.par" |            # read input
  sed 's/;.*$//' |                  # delete ; comments
  tr '\n' ' ' |                     # join on one line with spaces
  sed 's/\\ *//g' |                 # merge lines ended with '\'
  tr -s ' ' |                       # compress multiple ' ' to single ' '
  sed 's/^.*{\([^}]*\)}.*$/\1/' |   # extract the part between { }
  tr ' ' '\n' |                     # split into separate lines
  cat > "${ident}.ppar"             # write output
done
popd
ls "${tmp}/"*

预处理后的 par 文件位于 /examples/ppar 目录中。请使用以下方法进行测试:

./src/mightymandel ./examples/ppar/1_02.ppar

可以运行测试套件

 make -C src test EXTRA_LINK_FLAGS="-lGL -lGLU -lglfw3 -lX11 -lXxf86vm -lXrandr -lpthread -lXi"

示例输出

real	56m25.351s
user	33m50.995s
sys	21m38.976s

另请参阅

  • test 目录中 csv 文件的内容
  • test 目录中的图像

基准测试

[edit | edit source]

有关更多详细信息,请参见程序目录中的 BENCHMARKS 文件

检查硬件

[edit | edit source]
  • 中央处理单元 (CPU) 的类型和版本[14]
  • 图形处理单元 (GPU) 的类型和版本[15]
  • 显卡[16] 驱动程序[17] (DRV) 版本以及它支持的 OpenGl[18] 版本

示例输出

cat /proc/cpuinfo | grep model\ name

model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
model name	: Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz

lspci | grep VGA

01:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 770] (rev a1)

 glxinfo | grep OpenGL\ version

OpenGL version string: 4.3.0 NVIDIA 319.32

运行基准测试

[edit | edit source]
 time ./src/mightymandel --verbose warn --one-shot --de --weight -1.5 --glitch --size "1280x720" examples/mm/fp32-large-minibrot.mm
fp32-large-minibrot.mm,ok,fp32,322.402263,85.265842,14.734158,,

real	0m0.643s
user	0m0.188s
sys	0m0.236s

图像

[edit | edit source]

画廊

评论

[edit | edit source]

要从 ppm 文件中提取评论:[20]

 identify -format "%c" 1.ppm

或者

 head -n 2 1.ppm | tail -n 1

示例输出

mightymandel -1.8605739600158748e+00 + -9.3437424499999996e-07 i @ 3.5884749956982262e-09

以及从 png 文件中提取评论

extract k2000.png


颜色

[edit | edit source]
  • 白色 = 曼德勃罗集合的外部
  • 黑色 = 曼德勃罗集合的边界(使用 DEM)
  • 红色 = 故障
  • 黄色 = RGB(255,178,0) = 已知的曼德勃罗集合内部
  • 蓝色 = 未计算

文档

[edit | edit source]
  • 官方在线文档[21]

如何使用 doxygen 生成离线文档?

[edit | edit source]

如何贡献?

[edit | edit source]
git checkout master
git pull                         # get up to date
git checkout -b new-feature-42   # create a branch for your new feature
# make your changes, check that they compile and run ok
git add your-changed-files
git commit                       # write a description of your changes
git format-patch master          # save your changes to file(s)

如果路径文件未创建,请尝试

git format-patch origin/master # https://eothred.wordpress.com/2011/07/02/git-and-patches/

然后将 .patch 文件发送电子邮件给 Claude

参考文献

[edit | edit source]
  1. License GPL3+
  2. Perturbation glitches
  3. General-purpose computing on graphics processing units in wikipedia
  4. Git repository
  5. The OpenGL Extension Wrangler Library
  6. OpenGl in C
  7. The GNU MPFR Library
  8. librt library
  9. README for mightymandel
  10. Fractal Forum - mightymandel
  11. and Ubuntu
  12. Package: glfw3 (3.0.4-1) [universe]
  13. how-to-add-an-extension-to-all-files-via-terminal
  14. CPU in wikipedia)
  15. GPU in wiki[edia
  16. Video card in wiki
  17. Device driver in wikipedia
  18. OpenGl in wikipedia
  19. online official doc gallery
  20. stackexchange question : How to extract comment from ppm file?
  21. official online doc
华夏公益教科书