diff --git a/mingw-w64-calculix-ccx/PKGBUILD b/mingw-w64-calculix-ccx/PKGBUILD new file mode 100644 index 0000000000000..35294d8005555 --- /dev/null +++ b/mingw-w64-calculix-ccx/PKGBUILD @@ -0,0 +1,61 @@ +# Maintainer: RafaƂ Brzegowy + +_realname=calculix-ccx +pkgbase=mingw-w64-${_realname} +pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}" +pkgver=2.21 +pkgrel=1 +pkgdesc="CalculiX: 3D Structural Finite Element Program - Solver (mingw-w64)" +arch=('any') +mingw_arch=('mingw64' 'ucrt64') +url="http://www.calculix.de/" +license=('spdx:GPL-2.0-or-later') +depends=("${MINGW_PACKAGE_PREFIX}-arpack" + "${MINGW_PACKAGE_PREFIX}-arpack64" + "${MINGW_PACKAGE_PREFIX}-omp" + "${MINGW_PACKAGE_PREFIX}-openblas" + "${MINGW_PACKAGE_PREFIX}-openblas64" + "${MINGW_PACKAGE_PREFIX}-spooles" + $([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran")) +makedepends=("${MINGW_PACKAGE_PREFIX}-fc") +source=("http://www.dhondt.de/ccx_${pkgver}.src.tar.bz2" + "http://www.dhondt.de/gpl-2.0.txt" + "ccx_mingw.patch" + "ccx_ooc.patch") +sha256sums=('52a20ef7216c6e2de75eae460539915640e3140ec4a2f631a9301e01eda605ad' + '8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643' + '64a9b4aae8910f1acd1d28b65e188134775670f9ada5d15614df38c9cda16c53' + 'dd81df3de137a05b45e39fe61830337e6405ec566148598dab2828a6d9780e8a') + +prepare() { + cd "${srcdir}/CalculiX/ccx_${pkgver}/src" + patch -Np1 < ../../../ccx_mingw.patch + patch -Np1 < ../../../ccx_ooc.patch +} + +build() +{ + cd "${srcdir}/CalculiX/ccx_${pkgver}/src" + if [[ ${MINGW_PACKAGE_PREFIX} != *-clang-* ]]; then + CFLAGS+=" -fopenmp" + FC=gfortran + export FFLAGS="-fallow-argument-mismatch -fopenmp -O2" + export OMP_LIBS="-lgomp -lquadmath" + else + CFLAGS+=" -fopenmp -Wno-implicit-function-declaration" + FC=flang + export FFLAGS="-O2" + export OMP_LIBS="-lomp" + fi + + make CC=${CC} FC=${FC} CCX_VERSION=${pkgver} -f Makefile_mingw_i4 + make CC=${CC} FC=${FC} CCX_VERSION=${pkgver} -f Makefile_mingw_i8 +} + +package() +{ + install -Dm755 ${srcdir}/CalculiX/ccx_${pkgver}/src/ccx_i4/ccx_i4.exe ${pkgdir}${MINGW_PREFIX}/bin/ccx.exe + install -Dm755 ${srcdir}/CalculiX/ccx_${pkgver}/src/ccx_i8/ccx_i8.exe ${pkgdir}${MINGW_PREFIX}/bin/ccx_i8.exe + + install -Dm755 ${srcdir}/gpl-2.0.txt ${pkgdir}${MINGW_PREFIX}/share/licenses/${_realname}/LICENSE +} diff --git a/mingw-w64-calculix-ccx/ccx_mingw.patch b/mingw-w64-calculix-ccx/ccx_mingw.patch new file mode 100644 index 0000000000000..06af03149b7cc --- /dev/null +++ b/mingw-w64-calculix-ccx/ccx_mingw.patch @@ -0,0 +1,163 @@ +--- a/Makefile_mingw_i8 ++++ b/Makefile_mingw_i8 +@@ -0,0 +1,44 @@ ++#Specify where to store the generated .o files ++OBJDIR = ccx_i8 ++ ++CFLAGS += -DARCH="Linux" -DARPACK -DMATRIXSTORAGE -DUSE_MT=1 -DNETWORKOUT -DCALCULIX_EXTERNAL_BEHAVIOURS_SUPPORT -fcommon ++ ++CFLAGS += -DINTSIZE64 ++FFLAGS += -fdefault-integer-8 ++ ++#SPOOLES ++CFLAGS+= -I ${MINGW_PREFIX}/include/spooles -DSPOOLES ++ ++CC=CC ++FC=FC ++ ++#Source files in this folder and in the adapter directory ++$(OBJDIR)/%.o : %.c ++ $(CC) $(CFLAGS) -c $< -o $@ ++$(OBJDIR)/%.o : %.f ++ $(FC) $(FFLAGS) -c $< -o $@ ++ ++include Makefile.inc ++ ++SCCXMAIN = ccx_$(CCX_VERSION).c ++ ++OCCXF = $(SCCXF:%.f=$(OBJDIR)/%.o) ++OCCXC = $(SCCXC:%.c=$(OBJDIR)/%.o) ++OCCXMAIN = $(SCCXMAIN:%.c=$(OBJDIR)/%.o) ++ ++LDFLAGS = -lspoolesMT -lspooles ++ ++$(OBJDIR)/$(OBJDIR).exe: $(OBJDIR) $(OCCXMAIN) $(OBJDIR)/ccx_$(CCX_VERSION).a ++ ./date.pl; $(CC) $(CFLAGS) -c $(SCCXMAIN); ++ $(FC) $(FFLAGS) \ ++ -o $@ $(OCCXMAIN) $(OBJDIR)/ccx_$(CCX_VERSION).a \ ++ -lpthread $(OMP_LIBS) -larpack_64 -lopenblas_64 $(LDFLAGS) -lstdc++ ++ ++$(OBJDIR)/ccx_$(CCX_VERSION).a: $(OCCXF) $(OCCXC) ++ ar vr $@ $? ++ ++$(OBJDIR): ++ mkdir -p $(OBJDIR) ++ ++clean: ++ rm -f $(OBJDIR)/*.o $(OBJDIR)/ccx_$(CCX_VERSION).a $(OBJDIR)/ccx_$(OBJDIR).exe +--- a/Makefile_mingw_i4 ++++ b/Makefile_mingw_i4 +@@ -0,0 +1,41 @@ ++#Specify where to store the generated .o files ++OBJDIR = ccx_i4 ++ ++CFLAGS += -DARCH="Linux" -DARPACK -DMATRIXSTORAGE -DUSE_MT=1 -DNETWORKOUT -DCALCULIX_EXTERNAL_BEHAVIOURS_SUPPORT -fcommon ++ ++#SPOOLES ++CFLAGS+= -I ${MINGW_PREFIX}/include/spooles -DSPOOLES ++ ++CC=CC ++FC=FC ++ ++#Source files in this folder and in the adapter directory ++$(OBJDIR)/%.o : %.c ++ $(CC) $(CFLAGS) -c $< -o $@ ++$(OBJDIR)/%.o : %.f ++ $(FC) $(FFLAGS) -c $< -o $@ ++ ++include Makefile.inc ++ ++SCCXMAIN = ccx_$(CCX_VERSION).c ++ ++OCCXF = $(SCCXF:%.f=$(OBJDIR)/%.o) ++OCCXC = $(SCCXC:%.c=$(OBJDIR)/%.o) ++OCCXMAIN = $(SCCXMAIN:%.c=$(OBJDIR)/%.o) ++ ++LDFLAGS = -lspoolesMT -lspooles ++ ++$(OBJDIR)/$(OBJDIR).exe: $(OBJDIR) $(OCCXMAIN) $(OBJDIR)/ccx_$(CCX_VERSION).a ++ ./date.pl; $(CC) $(CFLAGS) -c $(SCCXMAIN); ++ $(FC) $(FFLAGS) \ ++ -o $@ $(OCCXMAIN) $(OBJDIR)/ccx_$(CCX_VERSION).a \ ++ -lpthread $(OMP_LIBS) -larpack -lopenblas $(LDFLAGS) -lstdc++ ++ ++$(OBJDIR)/ccx_$(CCX_VERSION).a: $(OCCXF) $(OCCXC) ++ ar vr $@ $? ++ ++$(OBJDIR): ++ mkdir -p $(OBJDIR) ++ ++clean: ++ rm -f $(OBJDIR)/*.o $(OBJDIR)/ccx_$(CCX_VERSION).a $(OBJDIR)/ccx_$(OBJDIR).exe +diff -urN src_orig/ccx_2.21.c src/ccx_2.21.c +--- src_orig/ccx_2.21.c 2023-07-29 10:52:01.000000000 +0200 ++++ src/ccx_2.21.c 2023-07-29 16:47:06.838731000 +0200 +@@ -15,10 +15,6 @@ + /* along with this program; if not, write to the Free Software */ + /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +-#ifdef __WIN32 +-_set_output_format(_TWO_DIGIT_EXPONENT); +-#endif +- + #ifdef CALCULIX_MPI + #include + #endif +@@ -37,6 +33,10 @@ + + int main(int argc,char *argv[]) + { ++ ++#if defined(_WIN32) && !defined(_UCRT) ++_set_output_format(_TWO_DIGIT_EXPONENT); ++#endif + + FILE *f1; + +diff -urN src_orig/ccx_2.21step.c src/ccx_2.21step.c +--- src_orig/ccx_2.21step.c 2023-07-29 10:52:01.000000000 +0200 ++++ src/ccx_2.21step.c 2023-07-29 17:05:22.548207900 +0200 +@@ -15,10 +15,6 @@ + /* along with this program; if not, write to the Free Software */ + /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +-#ifdef __WIN32 +-_set_output_format(_TWO_DIGIT_EXPONENT); +-#endif +- + #ifdef CALCULIX_MPI + #include + #endif +@@ -44,6 +40,10 @@ + ITG *inputsteps,ITG *iperturb,ITG *irstrt,char **filabp, + ITG *nlabel) + { ++ ++#if defined(_WIN32) && !defined(_UCRT) ++_set_output_format(_TWO_DIGIT_EXPONENT); ++#endif + + /* in FORTRAN convention: + +--- a/restartwrite.f ++++ b/restartwrite.f +@@ -113,7 +113,7 @@ + ! + ! check whether the restart file exists and is opened + ! +- call system("rm -f temporaryrestartfile") ++ call execute_command_line("rm -f temporaryrestartfile") + ! + open(15,file="temporaryrestartfile",ACCESS='SEQUENTIAL', + & FORM='UNFORMATTED',err=151) +--- a/writeobj.f ++++ b/writeobj.f +@@ -55,7 +55,7 @@ + dd=0.d0 + do j=1,ndesi + inode=nodedesi(j) +- dd=dd+dgdxglob(1,inode,i)**2 ++ dd=dd+dgdxglob(1,INT(inode),i)**2 + enddo + dd=dsqrt(dd) + write(5,'(3x,a16,e14.7,3x,e16.7,3x,a80)') objectset(1,i),g0(i), diff --git a/mingw-w64-calculix-ccx/ccx_ooc.patch b/mingw-w64-calculix-ccx/ccx_ooc.patch new file mode 100644 index 0000000000000..c4d590d92586a --- /dev/null +++ b/mingw-w64-calculix-ccx/ccx_ooc.patch @@ -0,0 +1,101 @@ +diff -urN src_orig/pardiso.c src/pardiso.c +--- src_orig/pardiso.c 2023-07-29 10:49:53.000000000 +0200 ++++ src/pardiso.c 2023-07-29 17:06:32.810872800 +0200 +@@ -34,6 +34,50 @@ + ITG mthread_mkl=0; + char envMKL[32]; + ++ ++/* Added by Victor Kemp 2022-11-18 to enable Out-Of-Core (OOC) mode. */ ++void initialize_iparm(ITG *symmetryflag){ ++ ++ ITG i; ++ char *env; ++ ++ // Most values are 0 ++ for(i=0;i<=63;i++){ ++ iparm[i]=0; ++ } ++ ++ // iparm(1) = 1 means all other values are specified instead of being defaults. ++ iparm[0]=1; ++ ++ // Non-zero default values ++ iparm[1]=2; ++ if(*symmetryflag==0){ ++ iparm[9]=8; ++ iparm[10]=0; ++ iparm[12]=0; ++ }else{ ++ iparm[9]=13; ++ iparm[10]=1; ++ iparm[12]=1; ++ } ++ iparm[17]=-1; ++ iparm[20]=1; ++ ++ // iparm(60) ++ env=getenv("MKL_PARDISO_OOC_MAX_CORE_SIZE"); ++ if(env) { ++ // PARDISO chooses IC/OOC (In-Core / Out-Of-Core) mode according to the ++ // environment variables ++ // MKL_PARDISO_OOC_MAX_CORE_SIZE and ++ // MKL_PARDISO_OOC_MAX_SWAP_SIZE. ++ iparm[59]=1; ++ }else{ ++ // Default. IC mode only. ++ iparm[59]=0; ++ } ++ ++} ++ + void pardiso_factor(double *ad, double *au, double *adb, double *aub, + double *sigma,ITG *icol, ITG *irow, + ITG *neq, ITG *nzs, ITG *symmetryflag, ITG *inputformat, +@@ -55,6 +99,10 @@ + + iparm[0]=0; + iparm[1]=3; ++ ++ /* Added by Victor Kemp 2022-11-18 to enable Out-Of-Core (OOC) mode. */ ++ initialize_iparm(symmetryflag); ++ + /* set MKL_NUM_THREADS to min(CCX_NPROC_EQUATION_SOLVER,OMP_NUM_THREADS) + must be done once */ + if (mthread_mkl == 0) { +diff -urN src_orig/uamplitude.f src/uamplitude.f +--- src_orig/uamplitude.f 2023-07-29 10:49:53.000000000 +0200 ++++ src/uamplitude.f 2023-07-29 16:55:06.310789300 +0200 +@@ -33,11 +33,31 @@ + implicit none + ! + character*80 name ++ integer(4) time2 + ! +- real*8 time,amplitude ++ real*8 time,amplitude,pi + ! + if(name(1:9).eq.'QUADRATIC') then + amplitude=time**2 ++ else if(name(1:3).eq.'SIN') then ++ pi=4.d0*datan(1.d0) ++ amplitude=sin(time*pi/2) ++ else if(name(1:4).eq.'QSIN') then ++ pi=4.d0*datan(1.d0) ++ amplitude=sin(time*pi/2)**2 ++ else if(name(1:6).eq.'ABSSIN') then ++ pi=4.d0*datan(1.d0) ++ amplitude=abs(sin(time*pi/2)) ++ else if(name(1:3).eq.'COS') then ++ pi=4.d0*datan(1.d0) ++ amplitude=cos(time*pi/2) ++ else if(name(1:7).eq.'ONEZERO') then ++ time2=time ++ if(modulo(time2,2).eq.0) THEN ++ amplitude=(time-time2) ++ else ++ amplitude=1-(time-time2) ++ endif + else + write(*,*) '*ERROR in uamplitude: unknown amplitude' + call exit(201)