Skip to content

ERROR during numerical factorization: -4 #3

Description

@larsmunaf

Dear all,

I have a question regarding the PARDISO matrix type used in CompMajor.

As I understand the paper, the CM Hessian is guaranteed to be positive semidefinite. However, the implementation configures PARDISO with mtype = 2, i.e. real symmetric positive definite. On some meshes I consistently get PARDISO error -4 during numerical factorization, for example:

./build/CompMajor_bin ./armadillo_cut.obj ./out.obj 1 (armadillo_cut.zip)

Changing only pardiso.set_type(2, true); to pardiso.set_type(-2, true); makes the factorization succeed. Is mtype = 2 intentional?

I am running on Linux with Intel oneMKL. To build the project, I only slightly modified the CMake configuration to use:

cmake_minimum_required(VERSION 3.26)
project(CompMajor)

# Option to enable PARDISO
option(USE_PARDISO "Use Intel MKL PARDISO solver" ON)

# Set libigl paths
set(LIBIGL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libigl/include)
set(LIBIGL_EXTERNAL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libigl/external)

# Add Eigen include directory
include_directories(
    ${LIBIGL_INCLUDE_DIR}
    ${LIBIGL_EXTERNAL_DIR}/eigen
)

# Enable math defines for Windows
if(WIN32)
    add_definitions(-D_USE_MATH_DEFINES)
endif()

option(LIBIGL_WITH_OPENGL      "Use OpenGL"         OFF)

# Your source files
set(SRCFILES
    src/Energy.cpp
    src/EnergySymDir.cpp
    src/Newton.cpp
    src/Solver.cpp
    src/Utils.cpp
    src/main_cmd.cpp
    src/PardisoSolver.cpp
)


# set(MKL_ARCH "intel64")
# set(MKL_LINK "static")
# set(MKL_THREADING "sequential")
# find_package(MKL REQUIRED)
find_package(MKL CONFIG REQUIRED PATHS $ENV{MKLROOT})
# set(BLA_VENDOR Intel10_64_dyn)
# find_package(BLAS REQUIRED)

# Create executable
add_executable(${PROJECT_NAME}_bin ${SRCFILES})

# Set C++11 standard
set_target_properties(${PROJECT_NAME}_bin PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
)


IF(USE_PARDISO)
    message("Use PARDISO")
    set(SRCFILES ${SRCFILES} src/PardisoSolver.cpp)
ENDIF()

target_link_libraries(${PROJECT_NAME}_bin PUBLIC MKL::MKL)
# target_link_libraries(${PROJECT_NAME}_bin PUBLIC BLAS::BLAS)

while otherwise keeping the original code unchanged.

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions