make_pov_180121.py > v0.1-v0.3 > bash 처리(2007년)를 Python으로 구현(2018년) > 43분 처리는 3.5초가 되었다

운영 환경
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6

bash > 43분 처리



[Obsolete] bash + Povray > conv-pov-exec (2008) > x,y,z 좌표 파일을 기반으로 구 입자로 구성된 aggregate의 이미지 생성
에 2007년 무렵의 bash 처리를 게재하고 있다.

처리 내용은 하기
  • x, y, z 파일이 주고있다
  • Povray 용 파일 생성

  • 2007년 무렵에 기사 집필자가 작성한 bash 스크립트로 처리를 하면 Povray용 파일 생성까지 43분 걸린다.

    2018년의 기사 집필자의 기술을 사용해 bash로 실장해도 늦을 것 같기 때문에, Python으로 실장해 보았다.

    데이터 파일



    다음과 같은 파일을 읽습니다.
    처리 대상 데이터는 N = 206,800의 점을 갖는다.
    $ head LN-SHAPE 
    -0.085861 -0.085861 -8.843684
    0.085861 -0.085861 -8.843684
    -0.085861 0.085861 -8.843684
    0.085861 0.085861 -8.843684
    -0.085861 -0.085861 -8.671962
    0.085861 -0.085861 -8.671962
    -0.085861 0.085861 -8.671962
    0.085861 0.085861 -8.671962
    -0.085861 -0.257583 -8.500240
    0.085861 -0.257583 -8.500240
    

    LN-SHAPE @ Dropbox

    코드 v0.1



    make_pov_180121.py
    import numpy as np
    
    '''
    v0.1 Jan., 21, 2018
      - output [.pov] file
        + add main()
      - add [SHAPE_FORMAT]
      - add [CONFIG_FORMAT]
    '''
    
    # on Python 3.5.2
    # coding rule: PEP8
    
    CONFIG_FORMAT = """
    camera {
      location <20, 20, -20>
      look_at <0, 0, 0>
    }
    light_source { <100, 200, -100>
      color rgb <1.0, 1.0, 1.0>
    }
    
    background{color rgb <1.0,1.0,1.0>}
    """
    
    SHAPE_FORMAT = """
    sphere { <XXX, YYY, ZZZ>, RRR
      texture {
        pigment { color rgb <0.7,0.7,0.7> }
        finish {      ambient 0.4    }
      }
    }
    """
    
    IN_FILE = 'LN-SHAPE'
    OUT_FILE = "shape_180121.pov"
    RADIUS = 0.5
    
    
    def main():
        cfg = np.array(CONFIG_FORMAT).reshape(1,)
    
        dat = np.genfromtxt(IN_FILE)
        with open(OUT_FILE, 'wb+') as fd:
            np.savetxt(fd, cfg, fmt='%s')
            for elem in dat:
                wrk = SHAPE_FORMAT.replace('XXX', '%s' % elem[0])
                wrk = wrk.replace('YYY', '%s' % elem[1])
                wrk = wrk.replace('ZZZ', '%s' % elem[2])
                wrk = wrk.replace('RRR', '%s' % RADIUS)
                wrk = np.array(wrk).reshape(1,)
                np.savetxt(fd, wrk, fmt='%s')
        print('[%s] is produced' % OUT_FILE)
    
    
    if __name__ == '__main__':
        main()
    
    

    처리 > 3.5초


    $ time python3 make_pov_180121.py 
    [shape_180121.pov] is produced
    
    real    0m3.452s
    user    0m3.392s
    sys     0m0.432s
    

    적당히 빨라졌다.
    povray shape_180121.pov 는 3초 정도이므로, 수치 광산란 시뮬레이션용 형상의 표시는 총 10초 정도로 끝나게 될 것 같다.



    주의



    bash의 처리가 느리다는 것이 아니라, 빠른 bash를 쓰는 기술을 기사 작성자가 가지고 있지 않다는 것입니다.
    또한 최근에는 데이터 처리는 Python3이 주체가 되었기 때문에 Python3에서 구현했습니다.
    bash는 필요에 따라 사용합니다.

    코드 v0.2,v0.3


  • 입자의 크기를 반으로 했다
  • 색칠을 한

  • make_pov_180121.py
    import numpy as np
    import sys
    
    '''
    v0.3 Jan., 21, 2018
      - each particle is colored
      - [SHAPE_FORMAT] has color value template
        + [RED], [GREEN], [BLUE]
    v0.2 Jan., 21, 2018
      - tweak [RADIUS] from 0.5 to 0.25
    v0.1 Jan., 21, 2018
      - output [.pov] file
        + add main()
      - add [SHAPE_FORMAT]
      - add [CONFIG_FORMAT]
    '''
    
    # on Python 3.5.2
    # coding rule: PEP8
    
    CONFIG_FORMAT = """
    camera {
      location <20, 20, -20>
      look_at <0, 0, 0>
    }
    light_source { <100, 200, -100>
      color rgb <1.0, 1.0, 1.0>
    }
    
    background{color rgb <1.0,1.0,1.0>}
    """
    
    SHAPE_FORMAT = """
    sphere { <XXX, YYY, ZZZ>, RRR
      texture {
        pigment { color rgb <RED,GREEN,BLUE> }
        finish {      ambient 0.4    }
      }
    }
    """
    
    IN_FILE = 'LN-SHAPE'
    OUT_FILE = "shape_180121.pov"
    RADIUS = 0.25
    
    RGBSET = [
        [0.40000000000000002, 0.76078431372549016, 0.6470588235294118],
        [0.40000000000000002, 0.76078431372549016, 0.6470588235294118],
        [0.9882352941176471, 0.55294117647058827, 0.3843137254901961],
        [0.55294117647058827, 0.62745098039215685, 0.79607843137254897],
        [0.90588235294117647, 0.54117647058823526, 0.76470588235294112],
        [0.65098039215686276, 0.84705882352941175, 0.32941176470588235],
        [0.65098039215686276, 0.84705882352941175, 0.32941176470588235],
        [1.0, 0.85098039215686272, 0.18431372549019609],
        [0.89803921568627454, 0.7686274509803922, 0.58039215686274515],
        [0.70196078431372544, 0.70196078431372544, 0.70196078431372544],
        [0.70196078431372544, 0.70196078431372544, 0.70196078431372544],
    ]
    
    X_MAX = 10  # used to set colors
    
    
    def main():
        cfg = np.array(CONFIG_FORMAT).reshape(1,)
    
        dat = np.genfromtxt(IN_FILE)
        with open(OUT_FILE, 'wb+') as fd:
            np.savetxt(fd, cfg, fmt='%s')
            for elem in dat:
                wrk = SHAPE_FORMAT.replace('XXX', '%s' % elem[0])
                # position
                wrk = wrk.replace('YYY', '%s' % elem[1])
                wrk = wrk.replace('ZZZ', '%s' % elem[2])
                wrk = wrk.replace('RRR', '%s' % RADIUS)
                # color
                #    clidx = (elem[0] - (-50)) / (50 - (-50))
                clidx = (elem[0] - (-X_MAX)) / (X_MAX - (-X_MAX))
                clidx = clidx * len(RGBSET)
                if clidx < 0.0:
                    clidx = 0.0
                acol = RGBSET[int(clidx)]
                wrk = wrk.replace('RED', '%s' % acol[0])
                wrk = wrk.replace('GREEN', '%s' % acol[1])
                wrk = wrk.replace('BLUE', '%s' % acol[2])
                wrk = np.array(wrk).reshape(1,)
                np.savetxt(fd, wrk, fmt='%s')
        print('[%s] is produced' % OUT_FILE)
    
    
    if __name__ == '__main__':
        main()
    
    

    좋은 웹페이지 즐겨찾기