STAR-CCM+ JAVA 메소드를 사용하는 방법

메소드란?

메소드란 객체의 동작에 해당하는 중괄호{}블록을 말한다. 중괄호 블록은 이름을 가지고 있는데, 이것이 메소드 이름이다. 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일관적으로 실행된다. 메소드는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 한다. 메소드는 객체 간의 데이터 전달의 수단으로 사용된다. 외부로부터 매개값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있다.

메소드 선언

메소드 선언은 리턴타입, 메소드이름, 매개변수선언과 실행 블록으로 구성된다. 메소드 선언부를 메소드 시그니처라고도 한다.

리턴 타입 : 메소드가 실행 후 리턴하는 값의 타입을 말한다.
매개변수 선언 : 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용된다.

매개변수 선언 관련 팁

일반적으로 메소드의 매개 변수는 개수가 이미 정해져 있지만 경우에 따라서는 메소드를 선언할 때 매개 변수의 개수를 알 수 없는 경우가 있다. 예를 들어 여러 개의 수를 모두 합산하는 메소드를 선언해야 한다면, 몇 개의 매개 변수가 입력될지 알 수 없기 때문에 매개 변수의 개수를 결정할 수 없을 것이다. 해결책은 아래와 같이 매개 변수를 배열 타입으로 선언하는 것이다.

int sum1(int[] values){ }

그러나 매개변수를 배열 타입으로 선언하면, 메소드를 호출하기 전에 배열을 생성해야 하는 불편한 점이 있다. 그래서 배열을 생성하지 않고 값의 리스트만 넘겨주는 방법도 있다. 아래와 같이 sum2() 메소드의 매개 변수를 “…”를 사용해서 선언하게 되면, 메소드 호출 시 넘겨준 값의 수에 따라 자동으로 배열이 생성되고 매개값으로 사용된다.

int sum2(int ... value){ }

int result = sum2(1,2,3);
int result = sum2(1,2,3,4,5);

이 같은 방법으로 STAR-CCM+에서 같은 경계조건을 적용하는 메소드나 2개이상의 형상을 Scene에 추가할 때 사용할 수있다.

STAR-CCM+에서 Cylinder만드는 메소드 예제

현재 만들고 있는 자동화 파일에서 사용한 메소드를 예제로 가져와봤다. 이 자동화는 블레이드의 회전운동을 자동으로 설정하는 코드인데 블레이드 형상을 CAD로 불러오면 나머지 CFD해석 설정은 자동으로 진행된다. 이 때 회전 공간을 만들려면 Cylinder 형상이 필요하고, 공간 격자를 조밀하게 생성하기 위한 Volumetric control을 사용할 때도 Cylinder가 필요하게 된다. 관련 코드는 아래와 같다

    private SimpleCylinderPart createCylinder(double radius, double upper, double lower, double farRadius) {
        Units units_0 = sim.getUnitsManager().getPreferredUnits(Dimensions.Builder().length(1).build());
        MeshPartFactory meshPartFactory_0 = sim.get(MeshPartFactory.class);
        SimpleCylinderPart simpleCylinderPart_0 = meshPartFactory_0.createNewCylinderPart(sim.get(SimulationPartManager.class));
        simpleCylinderPart_0.setDoNotRetessellate(true);
        LabCoordinateSystem labCoordinateSystem_0 = sim.getCoordinateSystemManager().getLabCoordinateSystem();
        simpleCylinderPart_0.setCoordinateSystem(labCoordinateSystem_0);
        simpleCylinderPart_0.getStartCoordinate().setCoordinateSystem(labCoordinateSystem_0);
        simpleCylinderPart_0.getStartCoordinate().setCoordinate(units_0, units_0, units_0, new DoubleVector(new double[]{0.0, 0.0, radius * upper}));
        simpleCylinderPart_0.getEndCoordinate().setCoordinateSystem(labCoordinateSystem_0);
        simpleCylinderPart_0.getEndCoordinate().setCoordinate(units_0, units_0, units_0, new DoubleVector(new double[]{0.0, 0.0, -(radius * lower)}));
        simpleCylinderPart_0.getRadius().setUnits(units_0);
        simpleCylinderPart_0.getRadius().setValue(radius * farRadius);
        simpleCylinderPart_0.getTessellationDensityOption().setSelected(TessellationDensityOption.Type.MEDIUM);
        simpleCylinderPart_0.rebuildSimpleShapePart();
        simpleCylinderPart_0.setDoNotRetessellate(false);

        return simpleCylinderPart_0;
    }

STAR-CCM+에서만 사용되는 API가 포함되어 일반 JAVA코드랑은 조금 다른 Class가 있는것을 볼 수 있다. 먼저 코드를 설명하면
1. private 는 외부 다른 코드에서 접근하여 메서드 내용을 수정할 수 없다고 선언한 부분으로 보통 ‘접근제한자‘라고 이야기 한다.
2.SimpleCylinderPart 는 리턴 타입으로 SimpleCylinderPart타입으로 결과를 리턴한다는 의미이다. CylinerPart의 타입이 SimpleCylinderPart란 이야기다.
3.createCylinder는 메서드 이름이고
4. (double radius, double upper, double lower, double farRadius)는 매개변수를 선언한 부분이다. 향 후 메서드를 호출할 때 메서드로 입력해줘야하는 값들을 매개변수에 넣어주어야 한다. radius는 기준값이다. 코드를 보면 Cylinder의 크기를 radius를 기준으로 특정 배수로 크기를 키우는 방식이다. Cylinder의 반경을 예로 들면 radius * farRadius 이며 farRadius는 특정 배율로 20배, 30배등등 사용할 수 있다.
5. { } 실행코드가 들어간 부분이다. 보통 실행코드는 STAR-CCM+에서 Macro record를 통해 얻을 수 있다. 저 많은 Class를 다 외워서 사용하는 사람들도 있겠지만 보통 사용하는 것만 기억하기 때문에 특정 Class는 녹화해서 사용하게 된다. 녹화된 코드 중 변경이 필요한 수치 값만 매개변수로 변경해 주면 메서드 완성이다.

위에서 생성된 메서드를 호출하는 방법은 아래와 같다

        sim = getActiveSimulation();
        SimpleCylinderPart far = createCylinder(pa.radius, pa.far_upper_rate, pa.far_lower_rate, pa.far_radius_rate);
        SimpleCylinderPart rot = createCylinder(pa.radius, pa.rotating_upper_rate, pa.rotating_lower_rate, 1.1);
        SimpleCylinderPart fine = createCylinder(pa.radius, pa.rotating_upper_rate*1.1, pa.far_upper_rate, 1.15);
        

        far.setPresentationName("Far");
        rot.setPresentationName("Rotating");
        fine.setPresentationName("Fine");

‘SimpleCylinderPart 클래스를 가진 far 객체를 선언하고 createCylinder() 메서드를 실행한 결과를 far 객체로 대입한다’ 라는 의미를 가지고 있다.

위로 스크롤