Compiling OpemMX in Arch Linux |
- Date: 2025/11/16 03:55
- Name: Koichi Kawai
- Compiling OpenMX(3.9+patch3.9.9) in Arch Linux was succeeded.
So I will report it here.
environment: Linux archlinux 6.17.7-arch1-1
* install packages Following packages was installed. scalapack 2.2.2-2 openmpi 5.0.9-1 fftw-openmpi 3.3.10-7 openblas 0.3.30-1 lapack 3.12.1-2 lapacke 3.12.1-2 scalapack is registered in AUR, so we cannot install with pacman. To install it, we need package management system which available AUR such that "yay".
* Source file expansion $ cp ./patch3.9.9.tar.gz openmx3.9/source $ cd openmx3.9/source $ tar -xvf patch3.9.9.tar.gz $ mv kpoint.in ../work/
* Modifying makefile Parameters (CC, FC, LIB, CFLAG) was modified like follow. CC = mpicc -O3 -ffast-math -fopenmp -Dkcomp \ -DMPI -DUSE_MPI -DUSE_SCALAPACK -Df2cFortran -DUSE_FFTW -DFFTW_NO_Complex\ -I/usr/include -I/usr/include/openmpi/mpiext -I/usr/include/openblas/ -include $(PWD)/scalapack_stub.h -z muldefs FC = mpif90 -O3 -ffast-math -fopenmp -Dkcomp \ -DMPI -DUSE_MPI -DUSE_SCALAPACK -DUSE_FFTW -DFFTW_NO_Complex\ -I/usr/include -I/usr/include/openmpi/mpiext -I/usr/include/openblas/ -fallow-argument-mismatch -z muldefs
LIB = -L/usr/lib \ -lscalapack -lmpi -lmpi_mpifh -llapack -lblas -lfftw3 -lfftw3_mpi -lgfortran CFLAGS = -g -fcommon
* New header file creation Following header file "scalapack_stub.h" was created.
#ifndef SCALAPACK_STUB_H #define SCALAPACK_STUB_H #ifdef USE_SCALAPACK #include <mpi.h> #include "lapack_prototypes.h" extern int fsync(int); extern void dgeesx_(char*, char*, long int (*)(double, double), char*, int*, double*, int*, int*, double*, double*, double*, int*, double*, double*, double*, int*, int*, int*, long int *, int* ); extern void solve_evp_complex_(int*, int*, void*, void*, double*, void*, int*, int*, int*, int*); extern void pzgemm_(char*, char*, int*, int*, int*, void*, void*, int*, int*, int*, void*, int*, int*, int*, void*, void*, int*, int*, int*); extern void solve_evp_complex(int, int, void*, void*, double*, void*, int*); extern double Cblacs_barrier(int,char*); extern int pdgemm_(char*,char*,int*,int*,int*,void*,void*,int*,int*,int*,void*,int*,int*,int*,void*,void*,int*,int*,int*); extern int solve_evp_real_( int*, int*, void*, int*, void*, void*, int*, int*, int*, int*); extern int numroc_(int*, int*, int*, int*, int*); extern int Csys2blacs_handle(MPI_Comm); extern void Cblacs_gridinit(int*, const char*, int, int); extern void descinit_(int*, int*, int*, int*, int*, int*, int*, int*, int*, int*); extern void Cfree_blacs_system_handle(int); extern void Cblacs_gridexit(int); extern int omp_get_thread_num(); extern int omp_get_num_threads(); #endif #endif
* Modifying code with "sed"
$ sed -i -z 's!#include "lapack_prototypes.h"!// #include "lapack_prototypes.h"\n#include "scalapack_stub.h"!g' $(grep -l lapack_prototypes *.c) $ sed -i 's!void Generate_Wannier();!void Generate_Wannier(char*);!' openmx_common.h $ sed -i -z 's!#include!#include <string.h>\n#include!' DFT.c $ sed -i -z 's!#include!#include <string.h>\n#include!' Force.c $ sed -i 's!void Calc_OLP_exp();!void Calc_OLP_exp(int, double**);!' Generate_Wannier.c $ sed -i -z 's!#include!#include <string.h>\n#include!' TRAN_Channel_Output.c $ sed -i -z 's!typedef!// typedef!' DosMain.c
* Modifying code with code editor Following line was added to "Divide_Conquer.c", "Divide_Conquer_LNO.c". void Eigen_lapack_d(double **a, double *ko, int n0, int EVmax);
Following line was added to "EGAC_DFT.c" int Lapack_LU_Zinverse(int , dcomplex *);
* Changing definition of function "void read_scfout(char *argv[])" There was 2 patterns that arguments was deal with in "read_scfout". (1) read_scfout(fname_wf, 1) (2) read_scfout(argv) The definition says "void read_scfout(char*)" in "read_scfout.h". In this deffinition "arg" is used like "argv[1]" and second argument in (2) is used forking MPI rank which obtain independently in definition . So I redefined it "void read_scfout(char *filename)" Therefor code was modified with following commands.
$ sed -i 's!read_scfout(argv);!read_scfout(argv[1]);!' $(grep -l read_scfout *.c) $ sed -i 's!read_scfout(fname_wf, 1);!read_scfout(fname_wf);!' $(grep -l read_scfout *.c) $ sed -i 's!read_scfout(fname_wf, 0);!read_scfout(fname_wf);!' $(grep -l read_scfout *.c) $ sed -i 's/main/int main/' bandgnu13.c
I succeeded to compile above procedure in my environment. I'm happy to help someones installing.

| |