2012년 12월 28일 금요일

HWP 포멧 공개는 한컴의 비지니스에 오히려 도움이 될 것 같아요.


* 여기에 쓴 글임 : http://kldp.org/node/135591


HWP 포멧의 자유소프트웨어 워드프로세싱이 가능하도록 하는 것은 매우 중요한 일이라고 생각됩니다.
아직 이것이 실현되지 못한 것은, 자유소프트웨어를 지지하는 많은 유저들이 가지고 있는 불만족의 큰 요인이기도 하죠.
하지만 한컴의 노력에 의해 성립된 기술을 무조건 공공재로써 오픈하라고 강요만 할 수는 없는 노릇이기도 합니다.  그것은 시장정의에 어긋나는 일이라고 생각합니다.
다만 강요는 할 수 없겠지만, '설득'은 가능하지 않을까 생각도 해 보게 됩니다.

일단 한컴의 사업현황을 먼저 파악해 보고, 이를 통해 한컴 측의 입장이 어떨까 역지사지 개념으로 생각을 해 보았습니다.
사업현황 파악 자료는 공개된 것 중에서 비교적 잘 서술되어 있는 서울대 투자연구회 동아리에서 작성하여 공개한 분석보고서를 참고해 보았습니다. (by 구글링)
2011년까지의 자료입니다.

http://www.snumidas.com/article/2012_1/12_1_1_1_Hancom.pdf


대략, 회사의 영업이익률은 계속 상승국면에 있고 37% 수준에 도달하였습니다.
소프트웨어 회사라는 특성이 있기는 하지만 정말 무시무시한 영업이익률입니다.
(애플이 잘 나갈 때 영업이익률이 20%를 상회했고, 삼성전자는 5% 수준 도달해서 아주 좋다고 했던 점을 참고...  제조업은 영업이익률 5% 정도면 아주 훌륭하다고 합니다.)

시장점유율은 국내에서 20% 조금 못미치게 유지하고 있으며 아주 견고해 보입니다.
(물론 나머지 80%는 MS오피스 이고요.)
해외시장 점유율은 5% 정도로 나와 있는데, 역시 나머지 95%는 MS오피스 입니다.
(물론 이 자료에서는 오픈소스 오피스 제품은 포함되지 않았을 것입니다. 상업용 제품이 아니니까요.)
잘 아시다시피, 국내시장 20% 방어에 성공하는 나라 자체가 없다고 보면 되겠죠.

회사의 재무상태도 매우 탄탄합니다.
부채비율이 굉장히 낮고(10%), 자기자본비율이 90% 수준으로 안정적으로 유지되고 있습니다.
R&D 투자비중은 경쟁업체 대비하여 높은 수준을 계속 유지하고 있으므로, 연구개발에 소홀하다고 비난받을 이유는 없어 보입니다.  실제로 꾸준하게 신제품을 계속 출시하고 있죠.


한컴이 비난받는 큰 이유 중의 하나는, 관공서 납품에 의존해서 먹고 사는 업체라는 것인데
실제 전체 매출에서 관공서 납품 매출이 가장 큽니다.
하지만 이런 오명을 씻어내기 위해(?) 나름대로 다각적인 노력을 하고 있는 것도 눈에 확연히 보이기 때문에, 비난만 할 일은 아니라고 생각이 됩니다.
구체적으로 보면

(1) MS오피스 보다 낮은 가격으로 제품을 공급한다. (홈에디션의 경우는 1/6수준)
(2) 민간기업에 판매한 한컴오피스 제품 비중을 꾸준히 끌어올려 37% 수준까지 도달하였다.
(3) 모바일, 웹 씽크프리 솔루션등 신제품의 매출 기여 비중을 계속 끌어올리고 있다.
(4) 한컴오피스의 견제효과로 인하여, 한국에서 판매되는 MS오피스의 가격은 세계평균 가격보다 더욱 낮게 형성되어 소비자에게 간접적인 이익을 주고 있다.

이런 긍정적인 기여를 하고 있는 것 같습니다.

한편, 한컴의 매출원 중에서 가장 큰 비중을 차지하는게 한컴오피스 소프트웨어의 판매인데요.
전통적으로 전체 매출의 80% 이상을 여기에 의존하고 있었는데, 최근 시장환경 변화와 함께 자사 스스로의 노력에 의하여 웹/모바일 오피스 솔루션 매출 비중이 확 늘어나서, 덕분에 데스크탑 오피스의 비중이 2012년도부터 60~70% 수준으로 줄어들어 가는 것 같습니다.
(물론 전체 매출액은 크게 증가하고요.  그 중에 구성 비율이 변화했다는 것입니다.)
한컴리눅스 등 오픈소스 관계된 매출은 5% 정도 수준으로 보이는데, 이 부문에서도 비중이 아마 꾸준히 늘어나지 않을까 개인적으로 예상해 봅니다. (국방부가 MS정품 구매 압박에 결국 짜증 폭발하면서 리눅스 환경으로 바꾸거나 하게 되면 대박이겠죠.  국방부 같은데서 한컴리눅스를 깔거나 할 테니...  이런 가능성도 중기적으로 있을 수 있다고 생각됩니다.)

아무튼 데스크탑 오피스 제품의 매출 비중이 계속 낮아지고 있음에도 불구하고, 여전히 가장 중요한 주력 매출원이기 때문에 아래아 한글을 포함한 오피스의 오픈소스화는 한컴 입장에서 어불성설이고 일고의 가치도 없는 것일 것입니다.
회사 입장에서는 회사의 생존이 최우선이니까요.


다만, HWP 포멧의 완전한 공개가 이러한 한컴의 사업에 방해가 되는가 하는 점에 의문을 가지고, 설득의 포인트로 삼을 수 있을지도 모릅니다.
즉 "HWP 포멧을 완전 공개해서, 자유소프트웨어 라이센스를 가진 보조적인 솔루션이 나타나면, 오히려 한컴의 사업에 도움이 된다"는 점을 한컴사에 확신을 주면 될 것입니다.

그래서 몇가지 논리를 세워 보았습니다.


(1) 국내시장 20%, 해외시장 5% 유지하는게 계속 가능할 것 같은가?
--> 아마 한컴 스스로도 자신이 별로 없을 것입니다.  하지만, HWP 포멧을 공개하여, 경쟁 제품은 물론 자유소프트웨어에서 HWP 포멧을 전부 지원하게 된다고 할 경우, 오히려 HWP 포멧이 현재보다 더 자유롭게 교환될 수 있으므로, 한컴사에 유리한 사업환경이 조성될 가능성이 높다고 생각됩니다.
즉, 한컴오피스를 사용해서 높은 퀄리티의 작업환경을 누리는 정품사용자들에게 더 좋고, 또 한컴오피스를 사용하지 않는 사용자들조차도 잠재적으로 한컴오피스를 구매하여 사용할 가능성이 높아진다는 거죠.  왜냐?  데이타 교환에 아무 장애가 없으니까, 사용자 인터페이스나 안정성이 더 좋은 제품을 선호할 것이니까요.  돈 없는 사람은 자유소프트웨어로 좀 불안하더라도 그냥 쓰고, 그것에 만족 못하면 한컴오피스 사서 쓰면 되고, 한컴오피스의 퀄리티는 MS오피스에 뒤떨어지지 않으므로 가장 값비싼 MS오피스의 점유율을 거꾸로 잠식해 들어가는게 가능할 것입니다.  이런 상황을 만들어갈 수 있다면, 자유소프트웨어는 오히려 한컴사에 우호적인 세력이 되는 것이지 절대로 적대적인 세력이 되는 작용을 하지 않게 되는거죠.
반대로, HWP 포멧을 공개하지 않고 지금처럼 수세적인 전략을 고수할 경우에는, MS오피스 포멧에 거꾸로 야금야금 잠식당해 결국 소멸될 지도 모릅니다.

(2) 한컴 자체 개발력으로 모든 플랫폼에 대응 가능한가?
--> 한컴의 R&D 투자는 결코 적지 않다고 생각됩니다.  경쟁사 대비 훨씬 높은 비중을 유지하고 있습니다.  하지만 그럼에도 불구하고, 사용자들이 원하는 모든 솔루션을 내놓는 것은 불가능하며 역부족입니다.  이것은 이미 증명된 사실이죠.
리눅스용 아래아한글의 지속적인 개발은 포기한 것 같고, 아무런 대안도 내놓지 못하고 있습니다.
이 경우, 자유소프트웨어가 그 역할을 해 줄 수 있다고 생각됩니다.
자신이 먹지도 못하는 작은 시장이라면, 과감하게 오픈해 주면, 자사의 R&D 노력을 절감하면서 동시에 사용자들의 요구를 만족시켜줄 수 있습니다.
좋은 사례로, IBM이 자사의 유닉스 솔루션을 거의 포기하다시피 하면서 모험적으로 리눅스 솔루션으로 과감하게 전환하였던 사례를 볼 수 있습니다.  리눅스 플랫폼의 솔루션으로 전환하면서 동시에 아파치 재단을 지원하여, 수많은 오픈소스 개발자들의 개발력을 활용할 수 있게 되어, IBM 스스로 폐쇄적으로 개발할 때 보다 더욱 좋은 결과를 얻었습니다.
어떤 사람은 이러한 결정 덕분에 IBM이 여전히 강력한 회사로 생존하는게 가능했다고 합니다.
그때 그렇게 결정을 내리지 않았다면 IBM은 이미 망했을지도 모른다고요.
즉 한컴 스스로 리눅스 등의 마이너한 플랫폼에 대한 지원을 할 자신이 없으면, 오픈소스 개발자들을 활용하여 외연을 확장할 기회를 잡는 것이 좋지 않나 싶습니다.

(3) 거대한 MS와의 정면대결이 현명한 것일까?
--> 거대기업과의 정면대결에서 승산이 없을 경우, 사업모델을 전환하여 생존 발전을 도모하는 것이 가능하다고 생각됩니다.  즉, 오피스 판매가 지금은 비록 가장 큰 비중을 차지하고 있어 중요하지만, 향후 수년~십년 정도의 시간이 지난 후에도 마찬가지일리는 없을 것입니다.
사업환경이 급변할텐데, 이에 대해 미리 대비하여 사업모델을 전환할 필요도 있다고 생각됩니다.
데스크탑 오피스 사업은 아마 환경변화로 인해 크게 쪼그라들 것입니다.
(가상화 데스크탑, 모바일, 웹 등등...  잘 아시쟎아요.)
일정 시점에 가서 더이상 사업성이 없게 될 때, 이 기반을 그냥 죽여버리고 그 가치를 사장시켜버릴 수는 없을 것입니다.
이 단계에 가서는, 해당 기술의 가치를 보존하면서 최대한의 수익을 뽑아내려면, 소프트웨어의 직접 판매 사업모델을 버리고, 서비스 및 기술공급 사업모델로 바꾸는 경우가 많은 듯 합니다.
좋은 사례로는...  Open-Cascade라는 3D CAD 커널 라이브러리가 있던데, 물론 오픈소스입니다.
프랑스의 마트라사에서 유클리드라는 3D CAD 소프트웨어를 독자 개발했는데, 이걸 시장에 판매하려고 보니깐 이미 엄청나게 강력한 경쟁제품들이 이미 시장에 떠억하니 있었던 사정이 있다고 합니다.
GE의 파라솔리드, 닷쏘의 ACIS 같은 더 좋은 3D CAD 커널들이 있었기 때문에 도저히 승산이 없었던 거죠.  그렇다고 힘들여 개발한 기술을 사장시킬 수는 없고 해서 결국 과감하게 '오픈소스'화 해 버린 거죠.  물론 마트라사는 사업모델을, 'CAD 소프트웨어의 판매'가 아니라 'Open-Cascade 라이브러리의 교육과 기술서비스'로 변경해서 사업의 지속성을 확보했고, 지금까지 유지되고 있습니다.
만일 이당시 마트라사가 오픈소스화라는 처방을 내리지 않았다면, 승산없는 시장에서 고군분투하다가 결국 파산하고 말았을 것입니다.


-----------

쩝.
나름대로 HWP 포멧의 전면 개방이 한컴사에 이익이 된다는 논리를 세워 보았는데, 이게 설득력이 있는지는 잘 모르겠군요.
다만 이 논리는 저의 개인적인 소견으로는 나름 타당한 면이 있다고 생각해 봅니다..

한컴사에서 HWP 포멧의 공개를 하고, 또 여력이 있다면 HWP 포멧을 다룰 수 있는 재단(재단이 뭐 별건가욧) 같은 형태를 설립해서 오픈소스화된 솔루션 개발을 지원하는 형태도 좋을 것 같습니다.

HWP 포멧의 불완전한 공개자료를 가지고, 몇몇 해커분들이 Evince 뷰어 같은걸 불완전하나마 고군분투해서 만들어내는 걸 보니, 그런 상황이 안타깝기도 하고 또 한 사람의 유저로서 답답하기도 합니다.  이런 상황이 너무 오랫동안 계속되고 있는데 정말 좋지 않습니다.

한컴오피스는 세계수준의 훌륭한 제품이며, 한컴사의 우수한 기술력과 노하우는 스스로 자부심을 가질 만 하다고 생각됩니다.
리눅스 등 한컴에서 미처 지원하지 못하는 플랫폼에 대한 오픈소스 솔루션은, 한컴의 비지니스에 도움이 되는 조력자의 역할을 하게 될 것입니다.


한컴 경영진의 과감한 결단을 기대해 봅니다.


(한컴의 경영권은 현재 지분 5% 정도를 가진 소프트포럼 http://www.softforum.com/ 이라는 회사에서 유지하고 있나본데, 소유와 경영이 분리된 좋은 형태라고 생각됩니다. (최대주주는 어떤 사모펀드인 것 같음)  소프트포럼이라는 회사는 보니깐 Xecure 라는 보안솔루션을 만드는 곳 같던데...  이런 보안솔루션은 은행이나 관공서에 납품하는게 주력일 것인지라, 리테일 사용자들의 요구사항에 대해서는 좀 둔감한지도 모르겠습니다.  다만 기존의 경영관습을 한단계 넘어선 보다 세련된 경영적 판단이 필요할 때가 있을지도 모른다는 점을 한컴 경영진들도 심사숙고 하리라고 기대해 봅니다.)


2012년 12월 18일 화요일

PyQt GUI에 matplotlib 플랏 삽입하기 (번역)


(원글 출처 : http://www.technicaljar.com/?p=688 )

PyQt GUI에 matplotlib 플랏 삽입하기

admin 씀



Matplotlib는 광범위한 플라팅 툴과 기능성을 제공해 줍니다.
파이썬에서 Matplotlib를 사용하여 플라팅을 하는 것은 전혀 어렵지 않아요~
하지만 간혹 푸쉬버튼이나 텍스트 필드 같은 다른 GUI 요소들에 삽입하고 싶을 때가 있죠.
이 글에서는 PyQt로 GUI를 만들고, 여기에 Matplotlib를 삽입하는 방법을 설명드리겠어요.
일단 QtDesigner를 실행시키고...
File->New 를 해 줘야겠죠.  버튼이 없는 새로운 Dialog를 생성해 줍시다.
(버튼은 곧 직접 넣을 테니깐)
본 예제에서는 푸쉬버튼을 누를 때 새로이 생성되는 랜덤 넘버를 간단한 GUI에 띄워진 Matplotlib 화면에 플랏해 주려고 합니다.
일단 푸쉬버튼 하나를 찝어서 넣어줍시다.
Matplotlib는 PyQt의 일부가 아니기 때문에, Matplotlib를 PyQt상의 위젯이 되도록 만들어줘야 합니다.  일단 컨테이너(Containers)로부터 위젯(Widget)을 선택하고, GUI 위에 올려놔 줍시다.
그럼 이렇게 보일 겁니다.




오른쪽 위에 보이는 객체 탐색기(Object Inspector)를 보면, QWidget의 클래스로 위젯이 설정되어 있는 것을 주목해 볼 수 있어요.
하지만 우리는 Matplotlib를 그리려는 목적을 가지고 있으니깐 변경해 줄 필요가 있습니다.
변경해 줘야 하는 부분은, 구체적으로 위젯의 행동(Behavior)을 변화시켜주는 것입니다.
위젯의 행동을 변화시켜주려면, QWidget이라는 클래스 타입 대신에 Matplotlib를 그릴 수 있도록 타입을 바꿔주면 됩니다.
이런 작업을 승격(Promoting)이라고 합니다.
즉 위젯을 우리가 필요한 타입으로 변경해 주는 승격을 해 준다는 거죠.
승격 방법은 열라 쉬워요.
객체 탐색기(Object Inspector)에서 위젯(widget)을 오른쪽 클릭 해 주고, '다음으로 승격(Promote to)'을 선택해 주면 됩니다.  그리고 다음 그림과 같이 2개의 필드에 똑같이 써 줍시다.




이제 클래스 네임과 헤더파일 네임을 마음대로 쓸 수 있도록 허용된 것입니다.
이렇게 해 줌으로써, matplotlibwidgetFile.py 파일(.py는 써 줄 필요 없음)을 가진 matplotlibWidget이라는 이름의 클래스가, 이 위젯의 행동을 정의(define)해 줄 것이라고 PyQt에게 알려주는 의미가 됩니다.
본 예제에서 사용된 것과 클래스 네임과 헤더파일 네임이 반드시 똑같을 필요는 전혀 없습니다.
뭐 어쨌든 Add 버튼 눌러 주고, 그 다음 Promote 버튼 눌러 줍시다.
객체 탐색기(Object Inspector)에서 위젯의 타입이 변경되었는지 확인해 보시고요.





위젯의 클래스 타입이 matplotlibWidget으로 변경이 어떻게 되었는지 확인해 보고, 승격이 제대로 되었는지도 확인했습니다.
이제 matplotlibwidgetFile.py을 생성해서 위젯의 행동을 정의해 주면 됩니다.
다만 그 전에 먼저, GUI 코드를 파이썬 코드로 변환해 줄 필요가 있습니다.
일단 만들어진 GUI를 PlotGUI.ui 이름으로 저장하면, 아래와 같은 내용의 XML파일로 저장됩니다.



<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>570</width>
    <height>449</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>30</x>
     <y>20</y>
     <width>501</width>
     <height>41</height>
    </rect>
   </property>
   <property name="text">
    <string>Push To Plot</string>
   </property>
  </widget>
  <widget class="matplotlibWidget" name="widget" native="true">
   <property name="geometry">
    <rect>
     <x>40</x>
     <y>90</y>
     <width>501</width>
     <height>321</height>
    </rect>
   </property>
  </widget>
 </widget>
 <customwidgets>
  <customwidget>
   <class>matplotlibWidget</class>
   <extends>QWidget</extends>
   <header>matplotlibwidgetFile</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>



.py 파일로 변환하려면 아래의 명령어를 터미널에서 쳐 주면 됩니다.
$ pyuic4 PlotGUI.ui > PlotGUI.py
이렇게 변환된 파이썬 파일을 열어보면 아래와 같은 내용이 들어가 있을 것입니다.



# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'PlotGUI.ui'
#
# Created: Thu Jul 26 23:56:29 2012
#      by: PyQt4 UI code generator 4.8.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(570, 449)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(30, 20, 501, 41))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.widget = matplotlibWidget(Dialog)
        self.widget.setGeometry(QtCore.QRect(40, 90, 501, 321))
        self.widget.setObjectName(_fromUtf8("widget"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Dialog", "Push To Plot", None, QtGui.QApplication.UnicodeUTF8))

from matplotlibwidgetFile import matplotlibWidget



파일의 마지막 라인을 주목해 봅시다.
이 라인의 내용은, matplotlibwidgetFile을 인클루드 해 주고, matplotlibWidget를 임포트 해 주는 것입니다.
임포트되는 matplotlibWidget은 위젯의 행동을 정의해 주는 클래스가 될 것이구요.
아래 두 라인을 봅시다.

self.pushButton = QtGui.QPushButton(Dialog)
self.widget = matplotlibWidget(Dialog)


이 두 줄의 내용은, 우리가 만든 GUI에 있는 2개의 객체(Objects)를 정의하는 내용입니다.
pushButton과 Widget이 각각 자신의 정의함수(identifiers)를 가지게 됨을 알 수 있습니다.
우리는 이 2개의 이름을 가지고 이들에게 억세스 할 수 있게 됩니다.
PyQt GUI를 이제 만들었고, 여기에 푸쉬버튼과 위젯도 추가해 줬습니다.
그럼 이제 위젯의 행동을, matplotlibWidget 클래스를 핸들링해 줘서 설정해 줄 것입니다.
이걸 하려면 이 클래스를 정의(define)해 주기만 하면 됩니다.
방법은 아래와 같이 matplotlibwidgetFile.py 파일을 써서 만들어 주면 되고, 쉬워요.



from PyQt4 import QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas

from matplotlib.figure import Figure

class MplCanvas(FigureCanvas):

    def __init__(self):
        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)

        FigureCanvas.__init__(self, self.fig)
        FigureCanvas.setSizePolicy(self, QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)


class matplotlibWidget(QtGui.QWidget):

    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)
        self.canvas = MplCanvas()
        self.vbl = QtGui.QVBoxLayout()
        self.vbl.addWidget(self.canvas)
        self.setLayout(self.vbl)



이 파일은 핵심적으로 이런 일을 합니다.
그림을 그릴 수 있는 캔버스(canvas)를 만들어주고,
우리가 만든 matplotlibWidget으로 넘겨주는 것입니다.
우리의 플라팅 위젯이 어떻게 핸들링 될 것인지를 정의해 준 것입니다.
이 모든게 그 위에 뭔가를 실제로 그리도록 해 주는 거죠.
이제, 아래에 우리의 메인 프로그램(main.py)이 있습니다.
이것은 푸쉬버튼이 눌러지면 matplotlib에서 랜덤 넘버를 그려주게 될 것입니다.



import sys
from PlotGUI import *
import random

class GUIForm(QtGui.QDialog):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'), self.PlotFunc)

    def PlotFunc(self):
        randomNumbers = random.sample(range(0, 10), 10)
        self.ui.widget.canvas.ax.clear()
        self.ui.widget.canvas.ax.plot(randomNumbers)
        self.ui.widget.canvas.draw()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = GUIForm()
    myapp.show()
    sys.exit(app.exec_())


푸쉬버튼을 누를 때 마다, PlotFunc()이 호출되고, 정수의 랜덤 넘버셋이 그래프 위에 그려질 것입니다.  이 코드의 첫 실행 부분은 아래 부분입니다.


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = GUIForm()
    myapp.show()
    sys.exit(app.exec_())



이 부분은 기본적으로 우리의 GUI 인스턴스를 실행해 주는 QApplication 인스턴스를 생성해 줍니다.  두 번째로, QUIForm 인스턴스를 생성해 줍니다.
이것이 바로 우리의 프로세싱을 수행하고, 데이타를 그림그리는 위젯에 넘겨주도록 하는 우리의 클래스입니다.

우리가 인스턴스를 생성할 때, GUIForm은 초기화 부분(initializer)을 호출하게 됩니다.



    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self,parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL('clicked()'), self.PlotFunc)


여기서 먼저 Ui_Dialog 인스턴스를 생성시킵니다.
Ui_Dialog가 PlotGUI.py 안에 있는 클래스의 이름이라는 점을 주목합시다.
(PlotGUI.py는 우리가 미리 만들어둔 GUI파일을 파이썬 포멧으로 변환해 둔 것이죠)
때문에 이 부분은 기본적으로 우리의 GUI 인스턴스를 만들고, 그 다음 setupUi(self)를 호출해서 GUI를 셋업합니다.  마지막 라인은, 우리가 누른 푸쉬버튼 신호를 PlotFunc로 연결해 줍니다.
그 다음에는, GUI가 myapp.show()에 의해 만들어지고 스크린에 뜨게 됩니다.
app.exec_()는, GUI상의 어떤 액션(클릭 따위)이 발생하면 그걸 잡아서 sys.exit()로 연결해 주는 루프를 시동시켜줍니다.  sys.exit()는 GUI를 확실하게 종료시켜 주는 것이구요.
PlotFunc는 명백하게 스스로 설명됩니다.
즉 그림을 만드는 위젯 객체에 억세스하는 것이죠. (이 이름은 PlotGUI.py에서 설정되어 있음을 기억합시다)
결국 푸쉬버튼을 누르면 아래와 같은 장면을 볼 수 있습니다.




이상 PyQt GUI에 matplotlib 그래프를 삽입하는 방법이었습니다.


레퍼런스:
[1] Matplotlib for Python Developers
[2] Introduction to Python Programming and Developing GUI Applications With PyQT

기타 참고 예제는 여기서 : http://eli.thegreenplace.net/2009/01/20/matplotlib-with-pyqt-guis/

2012년 12월 14일 금요일

Elmer에 관한 일본쪽 문서들



영어권 문서를 보다 보면 짜증이 샘솟는 때가 있는데
영어 울렁증이란게 참 무섭다.

일본은 기술문서 번역 같은게 잘 되어있는 경우가 많아서
일본 야후 가서 검색을 좀 해 봤더니 몇 개 걸리는게 있다.

구글 번역해서 읽어보니 자동번역된게 이해하기도 쉽고 편하다...
잔머리... ㅋㅋ


ElmerOverview.pdf 번역본

(1) 2008년 본
2008년 문서라서, 최신버전의 Elmer에 추가된 ElmerGUI에 대한 부분이 전혀 없다.
다만 개발 과정에 대해서 조금 구체적으로 설명되어 있어서 맥락을 이해하기가 좋다.
번역자는 니이가타 대락 공학부(新潟大学工学部) 오오시마 타쿠야(大嶋拓也).
다음의 (2)번 번역본이 더 최신이므로 다음 것을 보도록 하자.

(2) 2011년 본
번역을 "기술사 사무소 응용기술연구소(技術士 事務所 応用技術研究所)"라는 곳에서 해 둔 것 같다.


* ElmerguiManual.pdf 번역본

(1) 2012년 3월본
번역을 "기술사 사무소 응용기술연구소(技術士 事務所 応用技術研究所)"라는 곳에서 해 둔 것 같다.


얘네들은 일본어 번역 문서도 없는 것 같다.. ㅠㅠ


그건 그렇고, Elmer를 확장해서 대규모 해석을 하는 사례가 있던데
Elmer/Ice 라는 프로젝트다.
Full-Stokes Equation 이라는 것에 기반해서, 그린란드의 빙하가 녹는 것을 시뮬레이션 하는가 보다.  그린란드 대륙 자체를 모델링해서 매쉬를 만든 다음 통째로 해석하는 것 같다.
이 프로젝트에서는 지배방정식을 따로 만들어 넣고, 코딩을 직접 했기 때문에 ElmerGUI 는 사용되지 않는것 같다.




2012년 12월 13일 목요일

Elmer를 이용한 FEA 연습

Elmer를 이용한 FEA 연습


Elmer는 핀란드의 CSC 연구소 (과학 IT 센터)에서 개발한
오픈소스 멀티피직스 시뮬레이션 소프트웨어이다.
(참고 : http://www.csc.fi/english/pages/elmer )

열,유체,선형변형,비선형변형 등이 한번에 다 된다.
(멀티바디가 되는지는 아직 확실히 확인은 못 해 봤다.)


http://en.wikipedia.org/wiki/Elmer_the_Patchwork_Elephant
Elmer라는 이름은 위 그림동화책의 주인공 코끼리 이름이라고 한다.
유럽 쪽에서는 꽤 유명한 동화책 시리즈인가 보다.


이 코끼리는 알록달록하게 분할된 헝겊조각으로 이루어져 있어서,
Mesh 작업을 반드시 해야 하는 
유한요소해석 소프트웨어 이름으로 적절하다고 생각했나 보다.

바운더리 구분을 하도록 표시 옵션을 줬을 때의 모습
실제로, Elmer에서 모델을 불러들인 후, 
뷰 옵션에서 바운더리별로 자동 구분하도록 해 주는 옵션을 줘 보니깐
진짜 "알록달록한 헝겊조각으로 된 코끼리 엘머"의 모습과 흡사하다.


아무튼 이것을 설치하는 방법은 우분투 계열 리눅스에서는 극히 간단하다.
왜냐면 우분투의 기본 저장소에 이 소프트웨어가 이미 등록되어 있기 때문에
별도의 저장소를 등록해 줄 필요도 없이
그냥 소프트웨어 센터에서 elmer를 찾은 다음에 깔기만 하면 된다.

대부분의 오픈소스 CAE 소프트웨어들이 설치하는데 꽤 까다롭다는 점을 생각하면
아주 고마운 일이다.

최근에 버전업이 되면서, GUI도 정말 직관적으로 잘 만들어진 것 같다.
한마디로 정말 심플하다.

(물론 정말 제대로 발본색원해서 쓰려면 GUI에 의존하면 안되고, 코딩을 해야 겠지만)


아무튼 시험삼아 모델을 하나 불러들여서 디폴트로 해석을 하나 해 봤다.
튜토리얼 문서들은 영어로 잘 되어 있는 것 같은데, 아직 GUI 환경을 제대로 이용한 튜토리얼은 안 나와 있는 듯 하다. (GUI 버전업이 된지 얼마 안 되었기 때문일 것이다 아마...) 
때문에 튜토리얼은 무시하고 그냥 통빡(?)으로 넘겨짚기 신공 발휘해서 그냥 해 봤다.


기어 모델 STEP 파일을 불러들인다.


전에 모델링 해 뒀던 것들 중에서, 적당한 난이도(?)를 가진 형상의 모델을 하나 불러들여 보았다.  인볼류트 기어 치형이 수십개 있고, 각 면도 플라스틱 사출성형을 고려하여 빼기구배가 0.5도씩 들어가 있기 때문에, 파일 용량에 비해서 연산량이 좀 될 수 있는 형상이다.
실무에서 해석이 필요한 것들은 대체로 이정도 수준이므로 테스트에 적절하다고 생각된다.

이것을 불러들이면, 위 그림과 같이 깔끔하게 모델이 불러들여와 진다.
그리고 시키지도 않았는데(?) 자기가 혼자 Mesh 작업에 제멋대로 돌입한다.
Mesh 작업을 이런식으로 지 멋대로 시작하는 구성은 난생 처음 봤다.
자신있다 이건가....

Mesh 작업 완료 상태


약간의 시간이 소요된 후, Mesh 작업이 완료되었다.
Elmer에서 구현된 Mesh 툴의 성능은 굉장히 선진적인 것이 아닌가 싶다.
왜냐면, 기존의 일반적인 Mesh 툴들은 보통, 형상에 따라 밀도를 저렇게 자기가 지능적으로 배분해서 알아서 저렇게 깔끔하게 내보여주지는 않기 때문이다.

저 모델을 그대로 Salome-Meca 및 GMSH 같은걸로 해 봤는데, 
Elmer 처럼 이쁘게 절대로 안나온다.  에러나 뱉아내지 않으면 다행이다.
(NetGen 같은 제네레이터를 사용)
때문에 일일이 손을 봐 줘서 에러가 없도록 땜빵해 주거나 세심하게 옵션을 조정해 줘야 하는데, Elmer의 Mesh 툴은 그보다 한차원 더 편하게 해 주는 듯 싶다.

(물론 Elmer에서도, 형상 복잡도에 따라 이 자동화 작업이 실패하기 때문에 옵션을 손 봐줘야 할 때가 많을 것이다.  자동 Mesh 작업 이후에 좀 더 손 봐 줄 수 있는 약간의 편집 기능도 있다.)

아무튼 Mesh 단계는 이렇게 편하게 넘어가고....


그 다음에 모델 설정을 해 준다.
메뉴에서 순서대로 그냥 임의의 것들을 디폴트로 넣어준다.
지배방정식(Equation), 재질(Material), 외력(Body Force), 초기조건(Initial Condition), 경계조건(Boundary Condition) 등등.
이들 각각의 모델 설정을 해 줄 때 탭으로 각각의 피직스(Physics)를 선택해주고 설정 가능하다.

헬름홀쯔 방정식, 정적 열전도, 열전달 방정식, 점탄성변형 평면, 선형 점탄성변형, Saveline, 나비에-스토크 방정식, 확산방정식, K-입실론, ...  레이놀즈 방정식, 뿌아종-볼츠만 방정식 까지.

열,유체,고체 전부 멀티피직스로 한번에 처리 가능도록 구성해 놨다.

일단 다른 옵션을 다 죽여놓고,
선형 점탄성 변형(Linear Elastic) 기능만 체크해서 해석해 보기로 하였다.


노드,서피스,바운더리 등등에 대한 넘버링을 확인 가능하다.

뷰 옵션을 잘 보면, 노드/서피스/바운더리 등에 각각 메겨져 있는 넘버를 확인할 수 있도록 표시되는 옵션이 있다.  이 옵션을 켜면 숫자들이 확 뜨는데, 화면이 갑자기 버벅댄다...
숫자가 너무 많으므로 보고 싶은 부분을 확대한 다음 옵션을 켜서 확인하는 정도가 적절하지 않나 싶다.
특정 바운더리를 확인하고 싶다면, 원하는 표면에 마우스를 올려놓고 더블클릭 해 주면
0.5초 정도의 딜레이 후에 빨간색으로 선택이 된다.  창 아래쪽에는 해당 바운더리의 넘버가 역시 표시되므로, 모델 설정시 바운더리 컨디션을 정해 줄 때, 힘을 줄 바운더리를 골라서 체크해 줄 때 이걸 참고해서 선택하면 되는 것 같다.


아무튼 이제 모델 설정이 되었다 싶으면, 메뉴에 Sif를 Generate 해 준다.
여기서 생성되는 텍스트파일이 바로 Elmer Solver에 지령을 내려주는 것이다.
GUI 덕분에 이 텍스트 지령을 일일이 코딩해 주는 삽질을 많이 줄여준 것이다.

상용 CAE 소프트웨어들은 이런 사용자편의성을 많이 배려하고 있지만,
아직 오픈소스 CAE 소프트웨어들은 이런 부분이 약한 편이다.
현대중공업에서 과감하게 도입했다는 OpenFOAM 같은 유체역학 솔버만 봐도
해석 전문 엔지니어가 날밤새서 몇달 공부한 다음에 겨우 코딩해서 뭔가 해 보는 정도이니...

그런 점에서 Elmer의 GUI 제공은 정말 고맙다.

프랑스의 Salome GUI 툴의 경우도 잘 만들어지긴 했지만, Elmer 처럼 심플하지는 못하므로
초보자가 접근하기에는 Elmer 쪽이 훨씬 더 나은 것 같다.


아무튼 Sif를 만들어준 후, Start Solver 버튼을 눌러서 해석을 시작해 준다.
물론 해석 시작 전에, 현재까지의 것을 저장해 주었다..
해석 하다가 뻗어버릴지 모르니..

해석이 시작되면 컨버전스(수렴) 히스토리 그래프가 떠서, 해석 상태를 보여준다.
이게 의미하는 바는 잘 모름. (=,.=);
아마 해답을 찾기 위해 수렴을 해 들어가야 하는데 각 아이터레이션 단계마다 보여주는 수렴 정도를 나타내는 것 같다.  자세한 내용은 방정식을 꿰뚫고 있어야 이해 가능할 듯.


컨버전스(수렴) 히스토리

그리고 솔버 로그창도 띄워서 상태를 본다.
대충 보니, 변형량 계산하는데 아이터레이션을 스무번 정도 하는 것 같다.
솔버 옵션에서는 일단 싱글CPU로 설정해 놨기 때문에, 코어 4개의 i5 CPU의 풀파워를 내지는 않고 1개의 코어만 사용한다.  그럼에도 불구하고 노트북의 냉각팬은 풀파워(?)로 시끄럽게 돌아간다.

솔버 로그


모델이 좀 복잡한 형상이라 그런지, 생각보다 시간이 꽤 걸린다.


솔버 연산 완료!

완료되고 나서 소요시간을 보니, 대충 34분 정도 걸렸다.
노드 개수가 많으니 어쩔 수 없나보다.
멀티피직스로 다른 물리량까지 같이 계산 했다가는 밤 샐 기세....


아무튼 다 됐으니, 화면에 뿌려본다.
Elmer가 제공하는 포스트 프로세싱은 2가지 다른 종류인 것 같다.
자체 포스트 프로세서 화면은 띄워보니 너무 촌스러워서(ㅠㅠ) 그냥 넘어가고,
메뉴에 VTK 포스트 프로세서가 따로 있길래 그걸로 띄워 보았다.




모델의 피쳐, 좌표계 표시, 범례 바 표시 옵션을 줌


역시 VTK라서 그런지 화면이 이쁘게 나온다.
폰미세스 응력 위주로 여러 표현 옵션을 줘 가면서 얼마나 이쁜지(?) 봤다.

등고선 표시
변형량 벡터 표시 (색깔은 폰미세스 응력)
아이소 서피스 - 내부 응력 표시
폰미세스 응력
폰미세스 응력, 변형량 벡터 함께 표시

메쉬 선이랑 함께 표시

관심있는 응력집중 부위 관찰


이상의 결과를 예쁘게 그림 캡춰하고, 결과도 저장하고 했다.
지금은 스태틱한 해석 옵션을 줬기 때문에 정지그림밖에 없지만, 
해석하기 전에 트랜지언트 옵션을 주면 애니메이션도 가능한 것 같다.


 * 결론

(1) 아무 문서도 보지 않은 상태에서, 그냥 직관적으로 모델을 어찌어찌 불러들여 해석시켜보는 것이 가능할 정도로 사용법이 쉽다.  (물론 제대로 하려면 공부를 좀 해야 함)

(2) 꽤 안정적인 느낌이다.  그리고 깔끔하고 이쁘다.

(3) Mesh 작업에서 골머리 썩히는 부분이 많이 줄었다.

(4) 다만, 디폴트 상태에서는 Mesh가 상당히 촘촘하게 되는 경향이 있으므로, 그대로 해석 시켜버리니까 해석시간이 꽤 오래 걸린다.  시간 단축을 위해서는 Mesh 옵션을 조정해 주면서 감을 잡아 나가야 할 것 같다.

(5) 우리나라에서 이것을 사용해서 실무에 적용하는 엔지니어가 존재하는지 궁금하다.

(6) 한국에서 이걸 많이 사용해서 튜토리얼이나 예제가 많아졌으면 좋겠다.

(7) 전문적인 해석 엔지니어가 아닌, 설계 엔지니어가 작업 중에 의심나는 부위에 대한 간단한 해석을 신속하게 할 수 있는 용도로 사용하기에도 좋지 않을까 하는 생각이 든다.  일단 쉬우니까...



2012년 12월 12일 수요일

리눅스용 오픈소스 공학용 툴들을 사용해 본 느낌


리눅스용 오픈소스 공학용 툴들을 사용해 본 느낌


(원래 글 : http://www.ubuntu.or.kr/viewtopic.php?p=107618#p107618 )


(위) FreeCAD에서 STEP 파일을 불러들인 모습

(위) Salome-Meca 에서 STEP 파일을 불러들여 메슁을 한 모습

(위) Elmer에서 STEP 파일을 불러들여 메슁된 모습

(위) Elmer, ConvertAll, FreeMAT 실행 모습

우선 저는 제품설계자이구요.
실업무에서는 주로 
미국 PTC사의 Pro/Engineer (현재는 CREO로 이름이 변경됨) 3D CAD를 주로 사용해 왔습니다.
물론 회사에서 정품을 사용했죠.
이런 상용 제품의 최근 경향은, 모든 툴이나 관리도구를 한 패키지 안에 다 집어넣어서 제공하는 식이라서
제품설계를 하고 나서, 유한요소해석이나 동역학 해석 같은 것을 간단히 하기도 좋습니다.

사실 원래 Pro/Engineer라는 제품도 유닉스 환경에서 개발되었던 것인데
최근에는 대세를 따라서 윈도우 중심으로 완전히 옮겨와 버렸고
리눅스 지원을 했다가 안 했다가 암턴 제멋대로 입니다.
실제로 리눅스에서 이걸 쓰는 사람이 거의 없죠!

아무튼 이런 강력한 상용 툴을 리눅스에서 오픈소스만으로 완전히 대체할 수 있는가? 
하는걸 주제로 해서 따져봤습니다.

현재 저의 리눅스 환경은 우분투 12.10 깔아놨고, 여기서 이것저것 깔아보고 테스트 해 봤습니다.
사용방법이 상당한 스터디를 필요로 하는 것들 뿐이라
저도 제대로 해 보지는 못했지만 기본적으로 파일 불러들여서 간단한거 다뤄보는 정도만 해 봤습니다.
(각 패키지를 구하는 방법, 홈페이지 같은건 그냥 구글링하면 쉽게 튀어나오므로 URL 같은 것은 대부분 생략하겠습니다.)


일단 2D CAD는...

(1) LibreCAD (리브레캐드)
오토캐드를 대체하는 것이 가장 중요하고, 또 다른 업체/부서와의 데이타 교환에 문제가 없어야 하죠.
오픈소스로는 LibreCAD를 깔아서 써 봤는데
오토캐드와는 사용방법이 좀 달라서 적응이 쉽지는 않은 듯 합니다.
하지만 익숙해지면 상당히 편리하겠더군요.
콘솔 부분도, 파이썬 기반으로 해서 별도로 스터디할 필요가 있었는데 기능상의 부족함은 거의 없어 보입니다.
다만 문제점은...
DXF 포멧은 잘 지원되는데, DWG 포멧은 아직 지원되지 않고 있으므로
데이타 교환시 불편함이 많을 것 같아요.

(2) DraftSight (드래프트사이트)
이건 카티아를 개발했던 프랑스의 닷소 사에서 개발해서 무료제공하는 건데 (이미 잘 알려져 있죠)
사용자 등록만 해 주면 무료로 사용 가능하다는 장점이 있습니다.
오픈소스는 아니기 때문에 불만이지만, 제품의 퀄리티를 보고 깜짝 놀라게 됩니다.
오토캐드를 사용하는 것과 아무런 차이를 느낄 수 없을 정도로 유사하거든요.
명령어 쳐넣는거 왠만한거 그대로 다 되는 등 오토캐드에서의 사용습관을 전혀 버리지 않아도 됩니다.
또한 DWG 포멧도 완벽히 지원하므로 실무에서의 사용에 아무런 문제가 없습니다.
물론 저는 이걸 윈도우, 리눅스 둘 다 깔아놓고, 기존의 오토캐드는 완전히 삭제한 상태입니다.


3D CAD는....

(3) BRL CAD (비알엘 캐드)
3D CAD 발달 역사상 아주 중요한 역할을 한 기념비적인 제품이죠!
1979년에 마이크 무스(Mike Muuss)가 오리지널 코드를 개발했다고 하는데,
미국 국방성에서 M-1 에이브럼즈 탱크 개발할 때 이걸로 설계했다고 합니다.
마이크 무스라는 프로그래머는 ping (아시죠?) 이라는 프로그램도 최초로 발명(?)한 분이라고 하네요.
아무튼 역사와 전통이 깊은 패키지이고, 2004년도부터는 완전히 오픈소스로 풀려서 좋긴 한데...
문제는 너무 구닥다리라서 실무적으로 도저히 쓸 수 없다는 겁니다.
역사적인 소스코드 분석 해보고 싶은 도전적인 해커가 아니고
그냥 설계 엔지니어라면 이걸 깔아서 쓰는건 비추...

상용 소프트웨어 중에 이것과 비견될 만한게, CATIA가 있을 것 같습니다.
카티아는 프랑스 닷소에서 라팔 전투기 개발을 위한 설계툴로 개발한 건데,
유닉스환경에서의 초기버전(V4이전)은 BRL CAD와 막상막하할 정도로 구식 UI입니다.
하지만 카티아는 BRL CAD처럼 오픈소스화하지 않고, 계속 상용 코드로 발전해서
V5부터 완전히 윈도우 플랫폼으로 옮겨가서 모든걸 밑바닥부터 새로 개발해서 
지금은 시장에서 나름 잘 팔리고 있는 고급 제품이 되었죠.


(4) FreeCAD (프리캐드)
오픈소스 쪽에서 이게 대세라고 하는데, 이와 유사한 다른 3D 오픈소스 CAD 몇가지를 더 보긴 했지만
이것과 대등한 완성도까지 도달한 것은 아직 없는 듯 하더군요.
깔아서 기본적인 스케치와 익스트루드 정도 해 봤는데, 설명서에는 NURBS까지 다 된다고 되어 있긴 한데
아무래도 역시 상용 패키지처럼 신속한 작업성이 보장되는 수준은 아닌 듯 합니다.
하지만 이 패키지와 연계한 스크립트 어플리케이션을 얼마든지 만들어낼 수 있기 때문에
FreeCAD를 기반으로 해서, 특정 설계목적에 맟춘 특화된 기능을 부여하면
각종 문제를 해결하는데 아주 좋겠더라구요.

제가 사용하는 PTC Pro/Engineer의 경우에는, 
Pro/Program 이라는 스크립트가 있긴 하지만, 새로운 Feature를 생성하는건 불가능한 등 아주 기능이 미약하기 때문에
제대로 기능을 부여하려면 (플러그인 툴 개발) Pro/Toolkit 이라는 C 라이브러리를 사용해서 
아예 새로운 C 프로그램을 개발해야 됩니다.
물론 기계공학과 소프트웨어공학을 동시에 정통한 엔지니어는 별로 없기 때문에
우리나라에서도 Pro/Toolkit 개발자는 아주 희귀합니다.
듣기로는 현대자동차 같은 곳에서 이걸로 섀시 부품설계를 편하게 해 주는 플러그인 같은 것을
개발해서 쓴다고는 하는데, 이런 대기업에서 개발자 따로 고용해서 만들지 않는 이상 
현실적으로 개발이 힘든 환경입니다.

반면에 FreeCAD는 빵빵하고 자유로운 파이썬 스크립트 콘솔을 이용해서
대화식으로 어떤 작업을 스크립팅 하고, 그 소스를 파일화해서 그냥 새로운 플러그인을 만드는게 아주 쉬운 것 같습니다. (아직 해 보진 않았지만)

즉 기본적으로 제공되는 사용자 인터페이스나, 라이브러리 같은 것들이 좀 부족할지 몰라도
사용상의 자유도나 확장성이 매우 좋은 장점이 있다고 생각됩니다.

"FreeCAD 기반으로 엔지니어링 서비스 회사 하나 차려도 되겠구만!"
하는 생각이 들더군요.

세상일이 다 그렇듯이, 내가 생각한 걸 누군가 이미 생각했을 확률이 높죠?

그래서 구글링 해 봤더니, 아니나다를까 이미 그런 분들이 있더군요. ㅠㅠ

부산에 있다는 디비시테크 ( http://www.qtkor.com/ ) 라는 회사에서 QT,OpenCascade 같은 프레임웤이나 오픈소스 3D 라이브러리와 FreeCAD 같은 오픈소스 툴들을 조합, 개조하는 엔지니어링 서비스를 사업아이템으로 해서 잘 하고 계시는 모양입니다. FreeCAD 기반으로 소스코드 좀 손봐서, 풍력발전소의 날개설계 전용 CAD를 만들거나 하는 모양입니다. 국책과제 같은데서 이런 수요가 분명 있으니, 사업의 지속성은 아마 문제없지 않나 싶더라구요.



아무튼 CAD 부분은 그럼 됐으니, 이제 공학해석(CAE) 쪽은...
http://en.wikipedia.org/wiki/List_of_fi ... e_packages
여기만 봐도 오픈소스화 된 코드들이 아주 빵빵하게 많이 나와 있음을 알 수 있습니다.
사실 몇년 전에도 찾아본 적이 있는데, 공개된 패키지들의 완성도도 대체로 낮은 편이고
해서 오픈소스로는 공학해석이 아직 어렵구나 하면서 좌절한 기억이 나는데
지금은 그런 패키지들이 계속 버전업을 해서 엄청나게 완성도가 향상되었습니다.
모든걸 다 볼 수는 없지만, 몇개만 골라서 살펴봤습니다.

해석프로그램은 일반적으로 프리프로세서,솔버,포스트프로세서로 분리해서 나뉘는데
각각의 구성모듈별로 이넘 저넘 섞어서 쓰기도 합니다.
다만 한 방에 다 묶여서 패키지로 제공되는게 골치가 덜 아프므로(?)
그런 것들만 일단 봤습니다.


(5) Calculix (칼큘릭스)
독일 뮌헨에 있는 MTU라는 회사가 있는 모양인데, 항공기용 제트엔진 개발하는 회사인가 봅니다.
여기서 일하는 엔지니어들이 '남는 시간에' 조금씩 개발한게 완성되어서 칼큘릭스 패키지가 되었고, 이걸 그냥 프리 소프트웨어로 개방했을 뿐만 아니라 MTU사 자체 해석 툴로도 사용되고 있다고 하네요.
제트엔진 개발용으로 만든 놈이니만큼, 
유한요소해석(고체) 뿐만 아니라 전산유체해석(유체)도 되고 
신뢰성은 충분히 검증되었다고 봐도 무방하겠죠.
공돌이들이 남는 시간에 만들어서 이런게 튀어나오다니 독일이 대단하긴 합니다.


(6) Code-Aster (코드 아스터), Salome (살로메)
코드-아스터는 프랑스 물건인데, 토목 구조 해석을 위한 목적으로 개발된 것입니다.
EDF라는 프랑스 엔지니어링 회사에서, 자체 해석툴로 개발한 건데
20년 이상 꾸준하게 오랜 시간동안 개발이 지속되어 왔기 때문에 (한국에서는 불가능하죠)
이걸 개발한 엔지니어들 인터뷰 동영상 보면 
전부 백발이 희끗하거나 대머리가 된 아저씨들 10여명이 프랑스어로 꿍얼꿍얼 대고 있더군요.
코드 아스터는 솔버 부분 뿐입니다만, 홈페이지 가보면
다른 프랑스제 오픈소스 프리프로세서/포스트프로세서인 
GUI 환경의 SALOME(살로메) 프로그램과 묶어서 패키지로도 제공합니다.
(Salome-Meca 2012.2)
저는 이 "살로메-메카 2012.2"를 깔아봤습니다.
살로메는 
일단 프리프로세스 부분에서 옵션설정이 GUI로 상당히 세부적으로 가능하고
또 불러들인 3D 모델을 매쉬로 변환할 때 중간에 깨진 부분도 수동으로 꿰멜 수 있는 
등의 툴들이 빵빵합니다. 상용툴 저리가라더군요.
또 상용툴처럼, 3D 모델링을 살로메 상에서 직접 할 수도 있습니다.
간단한 CAD 기능도 있다는거죠.
아무튼 이걸 이용해서, 기계공학의 구조해석을 하기에 아주 좋은 솔루션 같습니다.
다만 옵션이 너무 많아서, 제대로 쓰려면 스터디를 많이 해야 됩니다. 
설계전문 엔지니어용 툴이라기 보다는 
해석전문 엔지니어를 위한 툴에 가깝다고 생각됩니다.
또, DEB 같은 리눅스용 패키지를 제공하지 않고 그냥 압축패키지로 제공하기 때문에
깔 때 좀 짜증납니다. 또 이넘은 윈도우 쪽은 아예 지원 안합니다.


(7) Elmer (엘머)
이넘은 핀란드 물건입니다.
핀란드 교육부에서 역시 20년 조금 못되게 지속적으로 
CSC연구소에 펀딩해 줘서 나온 것이더군요.
프리프로세서,솔버,포스트프로세서 전부 한 패키지로 제공됩니다.
최근에 GUI 부분이 많이 개선되어서 쓰기가 더 좋아진 것 같습니다.
위의 프랑스제 살로메 보다는 좀 더 심플하다는 느낌이구요.
덕분에 설명서 안 보고, 그냥 딱 띄워서 일단 뭘 해 보기는 좀 더 낫더군요.
일단 3D 모델링한 파일이 불러들어와 지니까요.
모델을 불러들이면 지멋대로 매쉬 작업을 시작해 버립니다.
하다가 뻑 나면 메시지창 뜨고 중단되고, 잘 되면 몇 분 정도 기다리니깐
자동적으로 잘 짜여진 매쉬 모델로 변환되어 똻! 뜨더군요.
매쉬 작업은 일종의 노가다 같은건데, 이넘은 자동으로 꽤 일을 잘 하는 것 같습니다.
솔버 부분의 코드는 역시 위의 프랑스제 코드-아스터 처럼 포트란 기반이라서
속도가 아주 좋은 듯 합니다.
규모가 큰 작업을 할 때 반드시 지원되어야 하는 병렬컴퓨팅,슈퍼컴퓨팅에서도 아마 잘 되나 봅니다.
솔버 부분은 아주 빵빵해서,
선형/비선형 구조해석은 물론
다물체 해석, 열해석, 유체해석, 심지어 양자역학적 해석까지 다 되나봐요.
이걸 개발한 핀란드의 CSC연구소에서는 HP랑 크레이 슈퍼컴퓨터 2대가 있는 모양인데
둘 다 이넘을 깔아놓고 쓰나봐요.
2011년 기준으로, CSC연구소 자체적으로는 엘머 유저가 200명 정도 되고
세계적으로는 수천명 정도의 사용자가 있다고 합니다. 다운로드는 몇만건 정도 되나봐요.
첫인상이 아주 좋은 소프트웨어 같습니다.
리눅스에 깔 때도 별 문제없이 한 방에 잘 됩니다.


(8) Z88 Aurora (Z88 오로라)
이넘은 독일 바이로이트(Bayreuth)대학교의 프랭크 리그(Frank Rieg) 교수팀이 만든 학교 제품입니다.
Z88은 솔버를 말하는 거고, 오로라는 프리/포서트프로세서 GUI 패키지를 말하는 것입니다.
둘을 합쳐서 "Z88 Aurora"로 제공하는가 봅니다.
윈도우용은 그냥 인스톨 하면되고, 리눅스용은 압축패키지 받아서 풀어야 됩니다.
리눅스용 깔아보니 의존성 있는 C 라이브러리가 있는지 확인을 먼저 해야 되던데
우분투에서 이 라이브러리들이 확실히 딱 있는 것 같지는 않더군요. 
깔아서 실행시켜 보니 뭔가 빠진 것 같은데 대체 뭐가 빠진건지 파악을 아직 못했습니다. ㅠㅠ
암튼 윈도우 환경에서 깔았을 때는 그냥 잘 돌아갑니다.
안정성은 조금 떨어지는 듯... 좀 복잡한 모델을 불러오니 다운되는 확률이 높습니다.
Z88 솔버의 특징은, 포트란이 아니고 C로 전부 다 짰다는 것입니다.
포트란 소스코드를 사용하는 이유중의 하나는, 빠르다는 점도 있지만
해당 연구소나 학교에서 대대로 물려오는 빠방한 포트란 라이브러리를 포기 못해서 
그냥 물려받아 재활용하는 차원도 큰데요.
Z88은 그냥 처음부터 C로 밑바닥부터 다 짰나봅니다.
이를테면 "나는 젊은 소스코드다"라고 주장하는 듯. 
장점은, 다른 상용 해석프로그램의 데이타들이 임포트되도록 호환성이 높은 편인 듯 합니다.
위에 언급한 엘머 같은 경우에는 그런 데이타 호환성이 좀 낮아 보입니다. (자체 포멧) 


덩치가 좀 큰 해석 프로그램들은 대충 이정도 살펴봤고,
매틀랩을 대체할 수 있는 넘들도 좀 봤습니다.


(9) FreeMAT (프리멧)
공짜 매틀랩이라는 의미의 이름 같군요..
매틀랩 소스코드 호환 잘 되는 편입니다. plot 까지 가는데 아무 문제 없더군요.
사이즈가 작아서 일단 좋아 보입니다.

(10) QtOctave (큐트 옥타브)
코멘드라인용 옥타브에 GUI 올려서 매틀랩이랑 더 비슷해진 건데
역시 FreeMAT 정도의 소스 호환성이 이루어지더군요.
옥타브는 원체 역사도 좀 되고, 제일 유명한 넘이니 별 다른 설명이 필요 없을 듯..

(11) Scilab (사이랩)
이넘도 프랑스 물건이죠?
매틀랩과 소스 호환성은 없지만, 비슷한 느낌이라 적응하는데 큰 어려움은 없는 듯 하고
대신에 매틀랩 소스를 싸이랩 소스로 변환해 주는 번역기가 매뉴에 있어서
이걸로 그냥 매틀랩 m파일을 변환해서 실행시켜주니깐 잘 되네요.
프리멧,옥타브가 갖지 못한 이 녀석의 또다른 장점은
Xcos 툴이 있다는 것... 매틀랩의 시뮬링크 대체품인데, 옥타브에서도 이런건 없으므로
시뮬링크 없어서 아쉬웠던 분이 사이랩 쪽에 유혹을 많이 느끼시나 봅니다.

(12) SageNB (세이지 노트북)
이넘도 꽤 유명한 것 같네요... 파이썬 문법도 배울 겸 해서도 좋고요.
웹 기반 서비스니깐 따로 뭘 깔 필요도 없고, 그냥 홈피가서 로그인 하면 막 되니깐
간단히 플랏 같은거 해서 그림 캡춰해서 쓰고 하면 좋을 듯....


기타


(13) ConvertAll (콘버트올)
이외에 공돌이 필수품으로 단위변환 해주는 툴이 있으면 좋을텐데
리눅스용으로 없나 찾아 봤더니 이게 있더군요.
깔아서 써 보니깐, 내가 평소 찾아왔던 놀라운 구조더라고요.
차원해석 개념이 들어가 있더라는....
즉 단위별로 일일이 골라서 쓰는게 아니고
예를 들어 m/s 단위를 km/h로 변환한다고 하면
두 단위는 차원이 같쟎아요. (길이/시간) 이렇게요.
이렇게 차원별로 따로 선택하거나 직접 써주면 단위가 성립이 되고
내부적으로 일관된 단위변환이 가능해지므로
각 차원별로만 단위를 프로그램이 제공해 주면
변환 할 수 있는 단위들이 엄청나게 늘어나서 제한이 없어지는거죠.




일단 이정도 툴들을 살펴봤는데,
리눅스용 오픈소스 공학용 툴들의 특징으로 할 만한게
파이썬으로 일부가 코딩되거나, 또는 자체 콘솔에 파이썬 기반으로 제공되는게 많더라....
파이썬 배워놓으면 리눅스에서 공돌이 노릇 하기 정말 좋겠구나...
대충 이런 느낌이에요.

이런 툴들을 제대로 익숙하게 다루려면
상당한 노력이 들어가게 되는데, 대신 적응만 잘 하면 
강력한 엔지니어로서의 무기를 갖게 되므로
다른 동료들과 비교해서 우월감(?)을 쩔어주게 만끽할 수 있을 것 같습니다.