Skip to content

Commit

Permalink
calculix-ccx: add new package (#19673)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: مهدي شينون (Mehdi Chinoune) <[email protected]>
  • Loading branch information
3rav and MehdiChinoune authored Jan 8, 2024
1 parent 4dcc9c1 commit 3c4e841
Show file tree
Hide file tree
Showing 3 changed files with 325 additions and 0 deletions.
61 changes: 61 additions & 0 deletions mingw-w64-calculix-ccx/PKGBUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Maintainer: Rafał Brzegowy <[email protected]>

_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
}
163 changes: 163 additions & 0 deletions mingw-w64-calculix-ccx/ccx_mingw.patch
Original file line number Diff line number Diff line change
@@ -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 <spoolesMPI.h>
#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 <spoolesMPI.h>
#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),
101 changes: 101 additions & 0 deletions mingw-w64-calculix-ccx/ccx_ooc.patch
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 3c4e841

Please sign in to comment.