Helyx-OS の改造

2014年5月17日

はじめに

Helyx-OS を改造してみる。

使用バージョン

Helyx-OS 2.0.0/2.0.1, OpenFOAM 2.2.2, Ubuntu 12.04 LTS/Linux Mint 13 LTS

コンパイル

バイナリ版のインストールを行っておく。ここでは 2.0.1 を想定。

ここ からソースパッケージをダウンロードする。ここでは 2.0.0 を想定。

オリジナルと区別するために、インストールディレクトリをコピーする。

$ cd ~/opt/Engys
$ cp -r HELYX-OS HELYX-OS-2.0.1-build

ソースパッケージを展開。

$ tar xvjf 20131121-engys-HELYX-OS-2.0.0-src.tar.bz2 -C ~/opt/Engys/HELYX-OS-2.0.1-build/v2.0.1

コンパイル用のパッケージをインストール。

$ sudo apt-get install ant
$ sudo apt-get install openjdk-7-jdk

Java の環境変数を ~/.bashrc に設定しておく。

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/jre

~/.bashrc を読み直して、コンパイル。

cd ~/opt/Engys/HELYX-OS-2.0.1-build/v2.0.1
ant -buildfile build_src.xml

確認

改造できるかどうか簡単に確認する。

src/eu/engys/application/StandardCFD.java

        private static final String VERSION = "version 2.0.0";

以下のように修正。

        private static final String VERSION = "version 2.0.0-mod";

再コンパイル。メニュー [Help]-[About] でバージョンが変わっていれば OK。

ボタンを増やす

"browse" ボタンを増やしてみる。

src/eu/engys/gui/view/ApplicationToolBar.java (layoutComponents の中)

        add(createToolBarButton(new TerminalAction()));
        add(createToolBarButton(new OpenBaseDirAction()));

以下を追加。

        add(createToolBarButton(new OpenBaseDirAction()));

ボタンが増える。

ホームディレクトリ表示ボタンの追加

ホームディレクトリを表示するボタンを作ってみる。

src/eu/engys/gui/view/ApplicationToolBar.java

import java.io.File;

layoutComponents の中

        add(createToolBarButton(new TerminalAction()));
        add(createToolBarButton(new OpenBaseDirAction()));

以下を追加。

        add(createToolBarButton(new OpenHomeDirAction()));

OpenBaseDirAction の定義の後に以下を追加。

    public class OpenHomeDirAction extends ViewAction {

        public OpenHomeDirAction() {
            super(OPEN_HOME_LABEL, OPEN_HOME_ICON, OPEN_HOME_TOOLTIP);
        }       

        @Override
        public void actionPerformed(ActionEvent e) {
            FileManagerSupport.open(new File(System.getProperty("user.home"), ""));
        }       
    };

最後に以下を追加。

    private static final String OPEN_HOME_LABEL = ResourcesUtil.getString("case.browse.label");
    public static final Icon OPEN_HOME_ICON = ResourcesUtil.getIcon("case.browse.icon");
    private static final String OPEN_HOME_TOOLTIP = ResourcesUtil.getString("case.browse.tooltip");

src/eu/engys/resources/bundle.properties

terminal.open.label                     Terminal
terminal.open.tooltip                   Open Terminal in case folder
terminal.open.icon                      eu/engys/resources/images/terminal16.png

case.browse.label                       Browse
case.browse.tooltip                     Browse Case Folder
case.browse.icon                        eu/engys/resources/images/browse16.png

以下を追加。

home.browse.label                       Home
home.browse.tooltip                     Browse Home Folder
home.browse.icon                        eu/engys/resources/images/browse16.png

ParaView ボタンの追加

ケースの設定の方にある ParaView ボタンを上に追加してみる。

src/eu/engys/gui/view/ApplicationToolBar.java

import java.io.File;

layoutComponents の中に以下を追加。

        add(createToolBarButton(new OpenParaviewAction(model)));

Linux Mint への対応

Helyx-OS は Linux Mint のファイルマネージャに対応していないので、追加する。

src/eu/engys/core/executor/FileManagerSupport.java

    private static String getFileManager() {
        if (checkTerminal("nautilus")) {
            return "nautilus";
        } else if (checkTerminal("dolphin")) {
            return "dolphin";
        } else if (checkTerminal("konqueror")) {
            return "konqueror";
        } else {
            System.err.println("No terminal found");
            JOptionPane.showMessageDialog(null, "No file manager found" , "Filesystem error", ionPane.ERROR_MESSA    GE);        
        }   
        return "";
    }   

konqueror の記述の下に追加。

        } else if (checkTerminal("caja")) {
            return "caja";

solver.run スクリプトの場所

src/eu/engys/core/controller/DefaultScriptFactory.java の getLinuxSerialSolverScript(), getLinuxParallelSolverScript()。

境界条件の作成

境界条件タイプ "patch" をコピーして "patch2" を作ってみる。

src/eu/engys/core/project/zero/patches/BoundaryType.java

public class BoundaryType {
        public static final String INLET_KEY = "inlet";
        public static final String OUTLET_KEY = "outlet";
        public static final String OPENING_KEY = "patch";
        public static final String PATCH_KEY = "patch";
	
	...
	
        private static final String INLET_LABEL = "Inlet";
        private static final String OUTLET_LABEL = "Outlet";
        private static final String OPENING_LABEL = "Opening";
        private static final String PATCH_LABEL = "Patch";

以下を追加。

        public static final String PATCH2_KEY = "patch2";
        private static final String PATCH2_LABEL = "Patch2";

また、以下の部分

        public static final BoundaryType PATCH = new BoundaryType(PATCH_KEY, PATCH_LABEL, true);

以下を追加。

        public static final BoundaryType PATCH2 = new BoundaryType(PATCH2_KEY, PATCH2_LABEL, true);

src/eu/engys/gui/casesetup/boundaryconditions/panels で、patch をコピーして patch2 を作る。ファイル名、クラス名などに "2" を付ける。

MomentumPatch2.java       PhasePatch2.java    TurbulencePatch2.java
PatchSettingsPanel2.java  ThermalPatch2.java

PatchSettingsPanel2.java

package eu.engys.gui.casesetup.boundaryconditions.panels.patch2;

...

        @Inject
        public PatchSettingsPanel2(Model model) {
                super(model);
                setName("Turbulence");
        }

        public BoundaryType getType() {
                return BoundaryType.PATCH2;
        }

MomentumPatch2.java

package eu.engys.gui.casesetup.boundaryconditions.panels.patch2;

...

public class MomentumPatch2 extends MomentumParametersPanel {

        public MomentumPatch2(BoundaryTypePanel parent) {
                super(parent);
        }

src/eu/engys/application/modules/StandardCFDBoundaryConditionsModule.java

import eu.engys.gui.casesetup.boundaryconditions.panels.patch.PatchSettingsPanel;

以下を追加。

import eu.engys.gui.casesetup.boundaryconditions.panels.patch2.PatchSettingsPanel2;

また

                bcMultibinder.addBinding().to(PatchSettingsPanel.class).in(Singleton.class);

以下を追加。

                bcMultibinder.addBinding().to(PatchSettingsPanel2.class).in(Singleton.class);

totalPressure 修正

totalPressure を非圧縮性でも使えるように修正。

src/eu/engys/gui/casesetup/boundaryconditions/factories/StandardPressureFactory.java

        public static final Dictionary totalPressure = new Dictionary("p"){
                {
                        add("type", "totalPressure");
                        add("value", "uniform 0");
                        add("p0", "uniform 0");
                        add("gamma", "0");
                        add("rho", "rho");
                }
        };

"rho" の行をコメント。

//                      add("rho", "rho");

ベクトル版 bounded upwind の追加

$ cd lib/StandardCFD-data.jar
$ jar xvf StandardCFD-data.jar

caseSetupDict.schemes

    vector
    (
        {
            key     Gauss upwind;
            label   Upwind - 1st Order;
        }
        {
            key     Gauss linearUpwindV grad(%s);
            label   Linear Upwind - 2nd Order;
        }
        {
            key     bounded Gauss linearUpwindV grad(%s);
            label   Bounded Linear Upwind - 2nd Order;
        }

以下を追加。

        {   
            key     bounded Gauss upwind;
            label   Bounded Upwind - 1st Order;
        }

更新。

$ mv StandardCFD-data.jar StandardCFD-data.org.jar
$ jar cvf StandardCFD-data.jar StandardCFD