Top Page > Browsing
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.
ƒƒ“ƒe
Page: [1]

Thread Title (must) Move the thread to the top
Your Name (must)
E-Mail (must)
URL
Password (used in modification of the submitted text)
Comment (must)

   Save Cookie