- 플로팅 포인트 에러(Floating Point Error) 증상
플로팅 포인트 에러는 잔차(residual)의 증가나 속도 압력등의 증가등의 현상을 보이지 않는 경우가 대부분이다. 모니터링 값으로만 보면 문제없이 잘 수렴되는 것처럼 보이지만 특정 시점(iteration/time)에 불규칙하게 발생하게 된다. 에러 메시지는 아래와 같이 iteration에 따라서 여러 residual값들이 잘 수렴되고 있지만, 갑자기 플로팅 포인트 에러가 발생하게 된다. 에러가 발생하면 아래와 같이 에러 메시지를 보여 주고 해석이 저장된 후 종료 된다. 이렇게 저장된 파일을 다시 해석 하면 아무 문제 없이 최종 종료 되는 경우도 있고 다시 몇 iteration 진행 후 플로팅 포인트 에러가 발생하게 될 수도 있다.
Iteration Continuity X-momentum Y-momentum Z-momentum Tke Sdr
2576 9.240446e-08 8.102620e-06 3.748366e-06 3.036221e-06 2.963755e-05 1.726431e-03
2577 9.224399e-08 8.075741e-06 3.731813e-06 3.025256e-06 2.956513e-05 2.163701e-03
2578 9.199928e-08 8.047124e-06 3.715207e-06 3.012666e-06 2.948776e-05 1.686866e-03
2579 9.172513e-08 8.016819e-06 3.698343e-06 2.998791e-06 2.940669e-05 2.136377e-03
2580 9.147917e-08 7.986289e-06 3.681004e-06 2.985508e-06 2.932400e-05 1.693971e-03
2581 9.125993e-08 7.954836e-06 3.663138e-06 2.972562e-06 2.924124e-05 2.176786e-03
2582 9.101952e-08 7.923016e-06 3.644755e-06 2.959440e-06 2.915858e-05 1.969598e-03
2583 9.081804e-08 7.891668e-06 3.626911e-06 2.946625e-06 2.906143e-05 2.426139e-03
A floating point error has occurred. The following error has been logged:
floating point exception [overflow], the specific cause cannot be identified
Please refer to the troubleshooting section of the User's Guide.
Command: StepSimulation
error: Server Error
star.base.neo.ClientServerObject$CommandCompleteObserver.waitFor(ClientServerObject.java:1242)
star.base.neo.ClientServerObject.executeAndWait(ClientServerObject.java:1072)
star.common.SimulationIterator.step(SimulationIterator.java:303)
star.common.SimulationIterator.step(SimulationIterator.java:246)
- 플로팅 포인트 에러 진단 방법
플로팅 포인트 발생시 원인 파악을 위해서는 STAR-CCM+ 실행 시 옵션 명령어 중에 -fpe를 추가하면 된다. -fpe를 추가하면 어떤 물리 모델에서 발생하는지 파악할 수 있고, 파악이 끝나면 모델을 수정하면 된다. 한 예시로, -fpe 추가 했을 때 나오는 에러메세지는 아래와 같다. 이 메시지에서는 k-omega turbulent 모델에서 발생했음을 알 수 있다. 이런 경우 K-omega 모델의 옵션을 수정하면 문제가 해결 될 수 있다. 문제해결이 잘 안될 경우에는 담당 기술지원 엔지니어에게 아래와 같은 에러 메시지를 알려주고 기술 지원 요청을 하면 된다.
Iteration Continuity X-momentum Y-momentum Z-momentum Tke Sdr
1138 3.035581e-07 3.033218e-05 1.281180e-05 1.379740e-05 1.211350e-04 5.080065e-03
SIGFPE: floating point exception
Processor: 9
Recoverability: Non-recoverable
ServerStack: [
libStarNeo.so: SignalHandler::signalHandlerFunction(int, siginfo*, void*),
libpthread.so.0(+0xf630),
libKwTurbModel.so(+0x50d533),
libKwTurbModel.so(+0x109234),
libStarSolve.so(+0x156a6d),
libStarSolve.so: CellTerm::evaluate(FvDomain const&),
libKwTurbModel.so(+0x5099f9),
libKwTurbModel.so: KwTurbDeformationEquation::update(Continuum const&, FvDomain const&),
libFlowModel.so: FlowModel::notifyVelocityGradientObservers(Continuum const&, FvDomain const&) const,
libCoupledFlowModel.so: CoupledFlowModel::notifyGradientObservers(FvRepresentation const&),
libCoupledFlowModel.so: CoupledImplicitSolver::discretize(FvRepresentation const&, float, LinearEqnSystem const*, bool const&, bool) const,
libCoupledFlowModel.so: CoupledImplicitSolver::iterationUpdate(NamedResiduals&),
libStarSolve.so: RunnableSolver::doSolverIterationUpdate(SolverManager const&, NamedResiduals&),
libStarSolve.so: RunnableSolver::iterate(),
libStarSolve.so: SimulationIterator::startSimulation(RunnableSolver*, int, SimulationIterator::RunMode, bool),
libStarSolve.so(+0x296ad4),
libStarNeo.so: Controller::executeCommand(Command&, Properties const&, Properties&),
libStarNeo.so: Controller::executeCommand(Properties const&, Properties&),
libStarMachine.so: CommandController::SlaveCommandLoop::start(),
libStarMachine.so: CommandController::processCommands(),
libStarMachine.so: Machine::main(int, char**)]
ServerState: exiting
Signal: SIGFPE: floating point exception
error: Internal Error
- 플로팅 포인트 에러 해결 방법
위에서 언급한 -fpe 명령어를 통한 원인 파악을 한 후, 해결 방법은 다음과 같다.
- 모델 변경
-fpe를 통해 파악한 물리모델의 옵션을 변경하거나, 대체 가능한 모델이 있다면 모델을 변경하면 문제를 해결 할 수 있다.
- Precision 변경 또는 상위 버전 사용
모델 변경이 불가능한 경우는 동일 버전의 precision을 변경하여 해석하거나, 상위 버전을 사용하게 되면 문제를 해결 할 수 있다. Mixed precision을 사용했다면 double precision(-R8)으로 변경하면 된다.
- Reoder mesh
해석 초기와 전에 Reoder Mesh를 하게 되면 문제가 해결 될 수 있습니다. 경험상 Reoder mesh는 큰 효과는 없지만 fpe발생을 조금 지연할 수는 있습니다.