diff --git a/.github/workflows/Python.yml b/.github/workflows/Python.yml
index 15e04fb18..2f2a5d111 100644
--- a/.github/workflows/Python.yml
+++ b/.github/workflows/Python.yml
@@ -42,13 +42,13 @@ jobs:
- name: Install and run unit tests (Unix)
if: runner.os != 'Windows'
run: |
- python -m pip install ./python --no-deps -vv --use-feature=in-tree-build
+ python -m pip install ./python --no-deps -vv
COLUMNS=256 pytest python
- name: Install and run unit tests (Windows)
if: runner.os == 'Windows'
run: |
- python -m pip install ./python --no-deps -vv --use-feature=in-tree-build
+ python -m pip install ./python --no-deps -vv
pytest python -k 'not XDMF'
apt:
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e7cccb6bd..faaf66564 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -47,7 +47,7 @@ variables:
PETSC_INTELLLVM: "Libraries/PETSc/3.16.3/oneAPI-2022.0.1-IntelMPI-2021.5.0"
PETSC_INTEL: "Libraries/PETSc/3.16.5/Intel-2022.0.1-IntelMPI-2021.5.0"
# ++++++++++++ MSC Marc +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- MSC: "FEM/MSC/2021.3.1"
+ MSC: "FEM/MSC/2022.1"
IntelMarc: "Compiler/Intel/19.1.2 Libraries/IMKL/2020"
HDF5Marc: "HDF5/1.12.1/Intel-19.1.2"
diff --git a/VERSION b/VERSION
index 5a0b819ae..2ff635946 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.0.0-alpha6-325-g236a009e2
+3.0.0-alpha6-343-gc8d48d6eb
diff --git a/install/MarcMentat/2021.3.1/Marc_tools/include_linux64.patch b/install/MarcMentat/2021.3.1/Marc_tools/include_linux64.patch
index f0276bb62..5d78b22f8 100644
--- a/install/MarcMentat/2021.3.1/Marc_tools/include_linux64.patch
+++ b/install/MarcMentat/2021.3.1/Marc_tools/include_linux64.patch
@@ -21,6 +21,7 @@
I8DEFINES="-DI64"
I8CDEFINES="-U_DOUBLE -D_SINGLE"
fi
+
@@ -556,7 +561,7 @@ then
PROFILE=" $PROFILE -pg"
fi
diff --git a/install/MarcMentat/2022.1/Marc_tools/comp_damask_hmp.patch b/install/MarcMentat/2022.1/Marc_tools/comp_damask_hmp.patch
new file mode 100644
index 000000000..8dda8e1ce
--- /dev/null
+++ b/install/MarcMentat/2022.1/Marc_tools/comp_damask_hmp.patch
@@ -0,0 +1,49 @@
+---
++++
+@@ -6,18 +6,27 @@
+ DIR=$1
+ user=$3
+ program=$4
++usernoext=$user
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
++
++# add BLAS options for linking
++ BLAS="%BLAS%"
++
+ . $DIR/tools/include
+ DIRJOB=$2
+ cd $DIRJOB
+-echo "Compiling and linking user subroutine $user.f on host `hostname`"
++echo "Compiling and linking user subroutine $user on host `hostname`"
+ echo "program: $program"
+- $FORTRAN $user.f || \
++ $DFORTHIGHMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+- userobj=$user.o
++ userobj=$usernoext.o
+
+
+ $LOAD ${program} $DIR/lib/main.o\
+@@ -33,9 +42,13 @@ echo "program: $program"
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
++ $BLAS \
+ $SYSLIBS || \
+ {
+- echo "$0: link failed for $user.o on host `hostname`"
++ echo "$0: link failed for $usernoext.o on host `hostname`"
+ exit 1
+ }
+ /bin/rm $userobj
++ /bin/rm $DIRJOB/*.mod
++ /bin/rm $DIRJOB/*.smod
++ /bin/rm $DIRJOB/*_genmod.f90
diff --git a/install/MarcMentat/2022.1/Marc_tools/comp_damask_lmp.patch b/install/MarcMentat/2022.1/Marc_tools/comp_damask_lmp.patch
new file mode 100644
index 000000000..6ea9c098f
--- /dev/null
+++ b/install/MarcMentat/2022.1/Marc_tools/comp_damask_lmp.patch
@@ -0,0 +1,49 @@
+---
++++
+@@ -6,18 +6,27 @@
+ DIR=$1
+ user=$3
+ program=$4
++usernoext=$user
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
++
++# add BLAS options for linking
++ BLAS="%BLAS%"
++
+ . $DIR/tools/include
+ DIRJOB=$2
+ cd $DIRJOB
+-echo "Compiling and linking user subroutine $user.f on host `hostname`"
++echo "Compiling and linking user subroutine $user on host `hostname`"
+ echo "program: $program"
+- $FORTRAN $user.f || \
++ $DFORTRANLOWMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+- userobj=$user.o
++ userobj=$usernoext.o
+
+
+ $LOAD ${program} $DIR/lib/main.o\
+@@ -33,9 +42,13 @@ echo "program: $program"
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
++ $BLAS \
+ $SYSLIBS || \
+ {
+- echo "$0: link failed for $user.o on host `hostname`"
++ echo "$0: link failed for $usernoext.o on host `hostname`"
+ exit 1
+ }
+ /bin/rm $userobj
++ /bin/rm $DIRJOB/*.mod
++ /bin/rm $DIRJOB/*.smod
++ /bin/rm $DIRJOB/*_genmod.f90
diff --git a/install/MarcMentat/2022.1/Marc_tools/comp_damask_mp.patch b/install/MarcMentat/2022.1/Marc_tools/comp_damask_mp.patch
new file mode 100644
index 000000000..3316227d6
--- /dev/null
+++ b/install/MarcMentat/2022.1/Marc_tools/comp_damask_mp.patch
@@ -0,0 +1,49 @@
+---
++++
+@@ -6,18 +6,27 @@
+ DIR=$1
+ user=$3
+ program=$4
++usernoext=$user
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
++
++# add BLAS options for linking
++ BLAS="%BLAS%"
++
+ . $DIR/tools/include
+ DIRJOB=$2
+ cd $DIRJOB
+-echo "Compiling and linking user subroutine $user.f on host `hostname`"
++echo "Compiling and linking user subroutine $user on host `hostname`"
+ echo "program: $program"
+- $FORTRAN $user.f || \
++ $DFORTRANMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+- userobj=$user.o
++ userobj=$usernoext.o
+
+
+ $LOAD ${program} $DIR/lib/main.o\
+@@ -33,9 +42,13 @@ echo "program: $program"
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
++ $BLAS \
+ $SYSLIBS || \
+ {
+- echo "$0: link failed for $user.o on host `hostname`"
++ echo "$0: link failed for $usernoext.o on host `hostname`"
+ exit 1
+ }
+ /bin/rm $userobj
++ /bin/rm $DIRJOB/*.mod
++ /bin/rm $DIRJOB/*.smod
++ /bin/rm $DIRJOB/*_genmod.f90
diff --git a/install/MarcMentat/2022.1/Marc_tools/include_linux64.patch b/install/MarcMentat/2022.1/Marc_tools/include_linux64.patch
new file mode 100644
index 000000000..8cf6d2113
--- /dev/null
+++ b/install/MarcMentat/2022.1/Marc_tools/include_linux64.patch
@@ -0,0 +1,99 @@
+---
++++
+@@ -166,6 +166,11 @@ if test -n "$MSCCOSIM_HOME"; then
+ MARC_COSIM_LIB="$MSCCOSIM_HOME/Cosim$MSCCOSIM_VERSION/Dcosim$MSCCOSIM_VERSION/lib"
+ fi
+
++# DAMASK uses the HDF5 compiler wrapper around the Intel compiler
++H5FC="$(h5fc -shlib -show)"
++HDF5_LIB=${H5FC//ifort/}
++FCOMP="$H5FC"
++
+ # AEM
+ if test "$MARCDLLOUTDIR" = ""; then
+ DLLOUTDIR="$MARC_LIB"
+@@ -477,8 +482,8 @@ if test "$MARC_INTEGER_SIZE" = "i4" ; then
+ I8DEFINES=
+ I8CDEFINES=
+ else
+- I8FFLAGS="-i8"
++ I8FFLAGS="-i8 -integer-size 64"
+ I8DEFINES="-DI64"
+ I8CDEFINES="-U_DOUBLE -D_SINGLE"
+ fi
+
+@@ -594,7 +599,7 @@ then
+ PROFILE=" $PROFILE -pg"
+ fi
+
+-FORT_OPT="-c -assume byterecl -safe_cray_ptr -mp1 -WB -fp-model source"
++FORT_OPT="-c -implicitnone -stand f18 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr -mp1 -WB -fp-model source"
+ if test "$MTHREAD" = "OPENMP"
+ then
+ FORT_OPT=" $FORT_OPT -qopenmp"
+@@ -607,7 +612,7 @@ else
+ FORT_OPT=" $FORT_OPT -save -zero"
+ fi
+ if test "$MARCHDF_HDF" = "HDF"; then
+- FORT_OPT="$FORT_OPT -DMARCHDF_HDF=$MARCHDF_HDF $HDF_INCLUDE"
++ FORT_OPT="$FORT_OPT -DMARCHDF=$MARCHDF_HDF"
+ fi
+
+ FORTLOW="$FCOMP $FORT_OPT $PROFILE -O0 $I8FFLAGS -I$MARC_SOURCE/common \
+@@ -621,6 +626,29 @@ FORTNA="$FCOMP $FORT_OPT -fno-alias -O3 $I8FFLAGS -I$MARC_SOURCE/common \
+ # for compiling free form f90 files. high opt, integer(4)
+ FORTF90="$FCOMP -c -O3"
+
++# determine DAMASK version
++if test -n "$DAMASK_USER"; then
++ DAMASKROOT=`dirname $DAMASK_USER`/..
++ read DAMASKVERSION < $DAMASKROOT/VERSION
++ DAMASKVERSION="'"$DAMASKVERSION"'"
++else
++ DAMASKVERSION="'N/A'"
++fi
++
++# DAMASK compiler calls
++DFORTLOWMP="$FCOMP -c -O0 -qno-offload -implicitnone -stand f18 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
++ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMARC4DAMASK=2022.1 -DDAMASKVERSION=$DAMASKVERSION \
++ -qopenmp -qopenmp-threadprivate=compat\
++ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD -I$MARC_MOD"
++DFORTRANMP="$FCOMP -c -O1 -qno-offload -implicitnone -stand f18 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
++ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMARC4DAMASK=2022.1 -DDAMASKVERSION=$DAMASKVERSION \
++ -qopenmp -qopenmp-threadprivate=compat\
++ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD -I$MARC_MOD"
++DFORTHIGHMP="$FCOMP -c -O3 -qno-offload -implicitnone -stand f18 -standard-semantics -assume nostd_mod_proc_name -safe_cray_ptr $PROFILE -zero -mp1 -WB $I8FFLAGS -I$MARC_SOURCE/common \
++ -fpp -ftz -diag-disable 5268 -warn declarations -warn general -warn usage -warn interfaces -warn ignore_loc -warn alignments -DMARC4DAMASK=2022.1 -DDAMASKVERSION=$DAMASKVERSION \
++ -qopenmp -qopenmp-threadprivate=compat\
++ $MUMPS_INCLUDE $I8DEFINES -DLinux -DLINUX -DLinux_intel $FDEFINES $DDM $SOLVERFLAGS -I$KDTREE2_MOD -I$MARC_MOD"
++
+ if test "$MARCDEBUG" = "ON"
+ then
+ FORTLOW="$FCOMP $FORT_OPT $PROFILE $I8FFLAGS -I$MARC_SOURCE/common \
+@@ -778,7 +806,7 @@ SECLIBS="-L$MARC_LIB -llapi"
+
+ SOLVERLIBS="${BCSSOLVERLIBS} ${VKISOLVERLIBS} ${CASISOLVERLIBS} ${MF2SOLVERLIBS} \
+ -L$MARC_MKL \
+- $MARC_LIB/blas_src.a ${ACSI_LIB}/ACSI_MarcLib.a $KDTREE2_LIB/libkdtree2.a $MARC_LIB/libtetmeshinterface.a $MARC_LIB/libcaefatigueinterface.a -L$MARC_LIB -lmkl_blacs_intelmpi_ilp64 -lmkl_scalapack_ilp64 -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -liomp5 -ltetmesh -lmeshgems -lmg-tetra -lmeshgems_stubs $HDF_LIBS $SOLVER2LIBS"
++ $MARC_LIB/blas_src.a ${ACSI_LIB}/ACSI_MarcLib.a $KDTREE2_LIB/libkdtree2.a $MARC_LIB/libtetmeshinterface.a $MARC_LIB/libcaefatigueinterface.a -L$MARC_LIB -lmkl_blacs_intelmpi_ilp64 -lmkl_scalapack_ilp64 -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -liomp5 -ltetmesh -lmeshgems -lmg-tetra -lmeshgems_stubs $HDF5_LIB $SOLVER2LIBS"
+
+ SOLVERLIBS_DLL=${SOLVERLIBS}
+ if test "$AEM_DLL" -eq 1
+@@ -802,7 +830,7 @@ then
+ OPENSSL=NONE
+ fi
+
+-SYSLIBS=" $OPENMP -lpthread -shared-intel -cxxlib $MARC_RPC_LIB"
++SYSLIBS=" $OPENMP -lpthread -cxxlib $MARC_RPC_LIB"
+
+ # Uncomment the following lines to turn on the trace and comment out the next 4 lines
+ # if test $MPITYPE = intelmpi
+@@ -812,7 +840,7 @@ SYSLIBS=" $OPENMP -lpthread -shared-intel -cxxlib $MARC_RPC_LIB"
+ # fi
+ if test $MPITYPE = intelmpi
+ then
+- SYSLIBS="-L${MPI_ROOT}/lib/release -lmpi -L${MPI_ROOT}/lib -lmpifort -lrt $OPENMP -threads -lpthread -shared-intel -cxxlib $MARC_RPC_LIB"
++ SYSLIBS="-L${MPI_ROOT}/lib/release -lmpi -L${MPI_ROOT}/lib -lmpifort -lrt $OPENMP -threads -lpthread -cxxlib $MARC_RPC_LIB"
+ fi
+
+ if test "$ZLIB" = "ZLIB"; then
diff --git a/install/MarcMentat/2022.1/Marc_tools/run_damask_hmp.patch b/install/MarcMentat/2022.1/Marc_tools/run_damask_hmp.patch
new file mode 100644
index 000000000..e3a364e00
--- /dev/null
+++ b/install/MarcMentat/2022.1/Marc_tools/run_damask_hmp.patch
@@ -0,0 +1,710 @@
+---
++++
+@@ -302,7 +302,23 @@ fi
+
+ . "$DIR/getarch"
+
++
++# getting user subroutine file name
++found=0
++for i in "$@"; do
++ if test $found = 1; then
++ DAMASK_USER=$i
++ found=0
++ fi
++ case $i in
++ -u* | -U*)
++ found=1
++ ;;
++ esac
++done
++# sourcing include_linux64 (needs DAMASK_USER to be set)
+ . $MARC_INCLUDE
++
+ #
+
+ #
+@@ -405,7 +421,7 @@ sid=
+ did=
+ vid=
+ user=
+-usersubname=
++usernoext=
+ objs=
+ qid=background
+ cpu=
+@@ -573,7 +589,7 @@ do
+ justlist=yes
+ ;;
+ -fe* | -FE*)
+- feature=$value
++ feature=$value
+
+ ;;
+ -pr* | -PR*)
+@@ -676,50 +692,19 @@ do
+ esac
+ ;;
+ -u* | -U*)
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user
+- basefile=`$BASENAME $value`
+- if test ${basefile##*.} = f
+- then
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user.f
+- elif test ${basefile##*.} = F
+- then
+- user=`dirname $value`/`$BASENAME $value .F`
+- usersubname=$user.F
+- elif test ${basefile##*.} = f90
+- then
+- user=`dirname $value`/`$BASENAME $value .f90`
+- usersubname=$user.f90
+- elif test ${basefile##*.} = F90
+- then
+- user=`dirname $value`/`$BASENAME $value .F90`
+- usersubname=$user.F90
+- fi
++ user=$value
+ case $user in
+ \/*)
+ ;;
+ *)
+ user=`pwd`/$user
+- usersubname=`pwd`/$usersubname
+ ;;
+ esac
+- if test ! -f $usersubname
+- then
+- if test -f $usersubname.f
+- then
+- usersubname=$usersubname.f
+- elif test -f $usersubname.F
+- then
+- usersubname=$usersubname.F
+- elif test -f $usersubname.f90
+- then
+- usersubname=$usersubname.f90
+- elif test -f $usersubname.F90
+- then
+- usersubname=$usersubname.F90
+- fi
+- fi
++ usernoext=$user
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
+ ;;
+ -obj | -OBJ)
+ objs="$value"
+@@ -739,19 +724,19 @@ do
+ ;;
+ esac
+ ;;
+- -dl | -DL)
+- case $value in
+- y* | Y*)
+- deletelog=yes
+- ;;
+- n* | N*)
+- deletelog=no
+- ;;
+- *)
+- ;;
+- esac
++ -dl | -DL)
++ case $value in
++ y* | Y*)
++ deletelog=yes
++ ;;
++ n* | N*)
++ deletelog=no
++ ;;
++ *)
++ ;;
++ esac
+
+- ;;
++ ;;
+ -at | -AT)
+ att=$value
+ ;;
+@@ -1207,12 +1192,12 @@ post file $DIRPID/$pid.t16 or $DIRPID/$pid.t19 or $DIRPID/$pid.h5 not accessible
+ fi
+ fi
+ fi
+- if test "$usersubname"
++ if test "$user"
+ then
+- if test ! -f $usersubname
++ if test ! -f $user
+ then
+ error="$error
+-user subroutine file $usersubname not accessible"
++user subroutine file $user not accessible"
+ fi
+ fi
+ if test "$objs"
+@@ -1386,7 +1371,7 @@ else
+ else
+ error="$error
+ job id required"
+- fi
++fi
+ fi
+
+ case $qid in
+@@ -1531,7 +1516,7 @@ Program name : $prog
+ Marc shared lib : $progdll
+ Version type : $mode
+ Job ID : $DIRJID/$jid$extra_job_info
+-User subroutine name : $usersubname
++User subroutine name : $user
+ User objects/libs : $objs
+ Restart file job ID : $rid
+ Substructure file ID : $sid
+@@ -1564,7 +1549,7 @@ Program name : $prog
+ Marc shared lib : $progdll
+ Version type : $mode
+ Job ID : $DIRJID/$jid$extra_job_info
+-User subroutine name : $usersubname
++User subroutine name : $user
+ User objects/libs : $objs
+ Restart file job ID : $rid
+ Substructure file ID : $sid
+@@ -1687,7 +1672,7 @@ Program name ($prog)? $ECHOTXT"
+ ;;
+ esac
+ fi
+- $ECHO "User subroutine name ($usersubname)? $ECHOTXT"
++ $ECHO "User subroutine name ($user)? $ECHOTXT"
+ read value
+ if test "$value"
+ then
+@@ -1696,50 +1681,19 @@ Program name ($prog)? $ECHOTXT"
+ user=
+ ;;
+ *)
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user
+- basefile=`$BASENAME $value`
+- if test ${basefile##*.} = f
+- then
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user.f
+- elif test ${basefile##*.} = F
+- then
+- user=`dirname $value`/`$BASENAME $value .F`
+- usersubname=$user.F
+- elif test ${basefile##*.} = f90
+- then
+- user=`dirname $value`/`$BASENAME $value .f90`
+- usersubname=$user.f90
+- elif test ${basefile##*.} = F90
+- then
+- user=`dirname $value`/`$BASENAME $value .F90`
+- usersubname=$user.F90
+- fi
++ user=$value
+ case $user in
+- \/*)
+- ;;
+- *)
++ \/*)
++ ;;
++ *)
+ user=`pwd`/$user
+- usersubname=`pwd`/$usersubname
+- ;;
+- esac
+- if test ! -f $usersubname
+- then
+- if test -f $usersubname.f
+- then
+- usersubname=$usersubname.f
+- elif test -f $usersubname.F
+- then
+- usersubname=$usersubname.F
+- elif test -f $usersubname.f90
+- then
+- usersubname=$usersubname.f90
+- elif test -f $usersubname.F90
+- then
+- usersubname=$usersubname.F90
+- fi
+- fi
++ ;;
++ esac
++ usernoext=$user
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
+ ;;
+ esac
+ fi
+@@ -2274,11 +2228,12 @@ fi
+ #
+ # user subroutine used
+ #
++# add DAMASK options for linking
++ DAMASK="-lstdc++"
+
+ if test "$user"
+ then
+-# program=$user.marc
+- program=$DIRJOB/`$BASENAME $user .f`.marc
++ program=$usernoext.marc
+ case $program in
+ \/* | \.\/*)
+ bd=
+@@ -2391,7 +2346,7 @@ fi
+ fi
+ if test "$user"
+ then
+- execpath=$DIRJOB/`$BASENAME $user .f`.marc
++ execpath=$usernoext.marc
+ usersub=1
+ fi
+ export execpath
+@@ -3274,44 +3229,27 @@ then
+ echo
+ if test "$user"
+ then
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
+- fi
+-
++ userobj=$usermoext.o
+ fi
+ cat > $jid.runmarcscript << END4
+ if test "$user"
+ then
+- if test ${basefile##*.} = f
+- then
+- ln -sf "$user.f" "$usersub"
+- fi
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTHIGHMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTHIGHMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi
+
+
+@@ -3331,10 +3269,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
+- $SFLIB \
++ $DAMASK \
++ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ exit 1
+@@ -3344,6 +3283,9 @@ else
+ prgsav=yes
+ fi
+ /bin/rm $userobj 2>/dev/null
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+
+ #
+ # run marc
+@@ -3390,7 +3332,7 @@ if test $dllrun -eq 0; then
+ fi
+ else
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes
+@@ -3556,7 +3498,7 @@ then
+ # first copy over the user sub if local directories
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RCP $user.f $i:$DIR1/
++ $RCP $user $i:$DIR1/
+ fi
+ # do the compilation on the other machine
+ if test ${dirstatus[$counter]} = "shared"
+@@ -3569,21 +3511,21 @@ then
+ remoteuser=$DIR1/`$BASENAME $user`
+ $RSH $i /bin/rm $remoteprog 2> /dev/null
+ echo
+- $RSH $i $DIR2/tools/comp_user $DIR2 $DIR1 $remoteuser $remoteprog
++ $RSH $i $DIR2/tools/comp_damask_hmp $DIR2 $DIR1 $remoteuser $remoteprog
+ # check if successful, the new executable should be there
+ line=`$RSH $i /bin/ls $remoteprog 2> /dev/null`
+ if test "$line"
+ then
+ echo compilation and linking successful on host $i
+ else
+- echo "$0: compile failed for $user.f on host $i"
++ echo "$0: compile failed for $user on host $i"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ fi
+ # remove the user subroutine on remote machine
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RSH $i /bin/rm $remoteuser.f 2> /dev/null
++ $RSH $i /bin/rm $remoteuser 2> /dev/null
+ fi
+ fi
+ fi
+@@ -3593,39 +3535,27 @@ then
+ if test "$userhost"
+ then
+ echo
+- echo "Compiling and linking user subroutine $user.f on host `hostname`"
+- fi
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
++ echo "Compiling and linking user subroutine $user on host `hostname`"
+ fi
++ userobj=$usernoext.o
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTHIGHMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTHIGHMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi # if test $user
+
+
+@@ -3645,10 +3575,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
+- $SFLIB \
++ $DAMASK \
++ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ echo " $PRODUCT Exit number 3"
+@@ -3686,6 +3617,9 @@ else # if test $link
+ prgsav=yes
+ fi # if test $link
+ /bin/rm $userobj 2>/dev/null
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+
+ #
+ # run marc
+@@ -3744,42 +3678,42 @@ then
+ counter=0
+ if test -f "$host_filt"
+ then
+- for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
+- do
+- ibase=${i%%.*}
+- if test $ibase != $thishost
++ for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
++ do
++ ibase=${i%%.*}
++ if test $ibase != $thishost
++ then
++ counter=$((counter+1))
++ DIR1=$DIRJOB
++ line=`grep -v '^#' $userhost | grep "^$ibase "`
++ workdir=`echo $line | $AWK '{print $3}'`
++ if test -n "$workdir"
+ then
+- counter=$((counter+1))
+- DIR1=$DIRJOB
+- line=`grep -v '^#' $userhost | grep "^$ibase "`
+- workdir=`echo $line | $AWK '{print $3}'`
+- if test -n "$workdir"
+- then
+- DIR1=$workdir
+- fi
+- # if an incompatible host uses shared directory,
+- # then the root machine deletes the executable
+- if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
+- then
+- hname=_$ibase
+- /bin/rm ${execname}$hname
+- fi
+- # if local directory used, the remote machine
+- # deletes the executable
+- if test ${dirstatus[$counter]} = "local"
+- then
+- $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
+- fi
++ DIR1=$workdir
+ fi
+- done
+- fi
++ # if an incompatible host uses shared directory,
++ # then the root machine deletes the executable
++ if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
++ then
++ hname=_$ibase
++ /bin/rm ${execname}$hname
++ fi
++ # if local directory used, the remote machine
++ # deletes the executable
++ if test ${dirstatus[$counter]} = "local"
++ then
++ $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
++ fi
++ fi
++ done
+ fi
+ fi
+ fi
++fi
+ else
+ #dllrun >0
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes;then
+@@ -3904,7 +3838,7 @@ then
+ # first copy over the user sub if local directories
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RCP $user.f $i:$DIR1/
++ $RCP $user $i:$DIR1/
+ fi
+ # do the compilation on the other machine
+ if test ${dirstatus[$counter]} = "shared"
+@@ -3917,20 +3851,20 @@ then
+ remoteuser=$DIR1/`$BASENAME $user`
+ $RSH $i /bin/rm $remoteprog 2> /dev/null
+ echo
+- $RSH $i $DIR2/tools/comp_user $DIR2 $DIR1 $remoteuser $remoteprog
++ $RSH $i $DIR2/tools/comp_damask_hmp $DIR2 $DIR1 $remoteuser $remoteprog
+ # check if successful, the new executable should be there
+ line=`$RSH $i /bin/ls $remoteprog 2> /dev/null`
+ if test "$line"
+ then
+ echo compilation and linking successful on host $i
+ else
+- echo "$0: compile failed for $user.f on host $i"
++ echo "$0: compile failed for $user on host $i"
+ exit 1
+ fi
+ # remove the user subroutine on remote machine
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RSH $i /bin/rm $remoteuser.f 2> /dev/null
++ $RSH $i /bin/rm $remoteuser 2> /dev/null
+ fi
+ fi
+ fi
+@@ -3940,37 +3874,25 @@ then
+ if test "$userhost"
+ then
+ echo
+- echo "Compiling and linking user subroutine $user.f on host `hostname`"
+- fi
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
++ echo "Compiling and linking user subroutine $user on host `hostname`"
+ fi
++ userobj=$usernoext.o
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTHIGHMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTHIGHMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi # if test $user
+
+
+@@ -3990,10 +3912,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
++ $DAMASK \
+ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ exit 1
+@@ -4030,7 +3953,9 @@ else # if test $link
+ prgsav=yes
+ fi # if test $link
+ /bin/rm $userobj 2>/dev/null
+-
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+ # done if no job id given
+ if test -z "$jid"
+ then
+@@ -4070,7 +3995,7 @@ if test $ddm_arc -gt 0; then
+ RUN_JOB="$BINDIR/exeddm $RUN_JOB -ddm $ddm_arc "
+ fi
+
+-$RUN_JOB
++ $RUN_JOB
+
+ if test $nprocd -gt 1
+ then
+@@ -4114,42 +4039,42 @@ then
+ counter=0
+ if test -f "$host_filt"
+ then
+- for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
+- do
+- ibase=${i%%.*}
+- if test $ibase != $thishost
++ for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
++ do
++ ibase=${i%%.*}
++ if test $ibase != $thishost
++ then
++ counter=$((counter+1))
++ DIR1=$DIRJOB
++ line=`grep -v '^#' $userhost | grep "^$ibase "`
++ workdir=`echo $line | $AWK '{print $3}'`
++ if test -n "$workdir"
+ then
+- counter=$((counter+1))
+- DIR1=$DIRJOB
+- line=`grep -v '^#' $userhost | grep "^$ibase "`
+- workdir=`echo $line | $AWK '{print $3}'`
+- if test -n "$workdir"
+- then
+- DIR1=$workdir
+- fi
+- # if an incompatible host uses shared directory,
+- # then the root machine deletes the executable
+- if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
+- then
+- hname=_$ibase
+- /bin/rm ${execname}$hname
+- fi
+- # if local directory used, the remote machine
+- # deletes the executable
+- if test ${dirstatus[$counter]} = "local"
+- then
+- $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
+- fi
++ DIR1=$workdir
+ fi
+- done
+- fi
++ # if an incompatible host uses shared directory,
++ # then the root machine deletes the executable
++ if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
++ then
++ hname=_$ibase
++ /bin/rm ${execname}$hname
++ fi
++ # if local directory used, the remote machine
++ # deletes the executable
++ if test ${dirstatus[$counter]} = "local"
++ then
++ $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
++ fi
++ fi
++ done
+ fi
+ fi
+ fi
++fi
+ else
+ #dllrun >0
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes;then
diff --git a/install/MarcMentat/2022.1/Marc_tools/run_damask_lmp.patch b/install/MarcMentat/2022.1/Marc_tools/run_damask_lmp.patch
new file mode 100644
index 000000000..a5989bfca
--- /dev/null
+++ b/install/MarcMentat/2022.1/Marc_tools/run_damask_lmp.patch
@@ -0,0 +1,710 @@
+---
++++
+@@ -302,7 +302,23 @@ fi
+
+ . "$DIR/getarch"
+
++
++# getting user subroutine file name
++found=0
++for i in "$@"; do
++ if test $found = 1; then
++ DAMASK_USER=$i
++ found=0
++ fi
++ case $i in
++ -u* | -U*)
++ found=1
++ ;;
++ esac
++done
++# sourcing include_linux64 (needs DAMASK_USER to be set)
+ . $MARC_INCLUDE
++
+ #
+
+ #
+@@ -405,7 +421,7 @@ sid=
+ did=
+ vid=
+ user=
+-usersubname=
++usernoext=
+ objs=
+ qid=background
+ cpu=
+@@ -573,7 +589,7 @@ do
+ justlist=yes
+ ;;
+ -fe* | -FE*)
+- feature=$value
++ feature=$value
+
+ ;;
+ -pr* | -PR*)
+@@ -676,50 +692,19 @@ do
+ esac
+ ;;
+ -u* | -U*)
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user
+- basefile=`$BASENAME $value`
+- if test ${basefile##*.} = f
+- then
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user.f
+- elif test ${basefile##*.} = F
+- then
+- user=`dirname $value`/`$BASENAME $value .F`
+- usersubname=$user.F
+- elif test ${basefile##*.} = f90
+- then
+- user=`dirname $value`/`$BASENAME $value .f90`
+- usersubname=$user.f90
+- elif test ${basefile##*.} = F90
+- then
+- user=`dirname $value`/`$BASENAME $value .F90`
+- usersubname=$user.F90
+- fi
++ user=$value
+ case $user in
+ \/*)
+ ;;
+ *)
+ user=`pwd`/$user
+- usersubname=`pwd`/$usersubname
+ ;;
+ esac
+- if test ! -f $usersubname
+- then
+- if test -f $usersubname.f
+- then
+- usersubname=$usersubname.f
+- elif test -f $usersubname.F
+- then
+- usersubname=$usersubname.F
+- elif test -f $usersubname.f90
+- then
+- usersubname=$usersubname.f90
+- elif test -f $usersubname.F90
+- then
+- usersubname=$usersubname.F90
+- fi
+- fi
++ usernoext=$user
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
+ ;;
+ -obj | -OBJ)
+ objs="$value"
+@@ -739,19 +724,19 @@ do
+ ;;
+ esac
+ ;;
+- -dl | -DL)
+- case $value in
+- y* | Y*)
+- deletelog=yes
+- ;;
+- n* | N*)
+- deletelog=no
+- ;;
+- *)
+- ;;
+- esac
++ -dl | -DL)
++ case $value in
++ y* | Y*)
++ deletelog=yes
++ ;;
++ n* | N*)
++ deletelog=no
++ ;;
++ *)
++ ;;
++ esac
+
+- ;;
++ ;;
+ -at | -AT)
+ att=$value
+ ;;
+@@ -1207,12 +1192,12 @@ post file $DIRPID/$pid.t16 or $DIRPID/$pid.t19 or $DIRPID/$pid.h5 not accessible
+ fi
+ fi
+ fi
+- if test "$usersubname"
++ if test "$user"
+ then
+- if test ! -f $usersubname
++ if test ! -f $user
+ then
+ error="$error
+-user subroutine file $usersubname not accessible"
++user subroutine file $user not accessible"
+ fi
+ fi
+ if test "$objs"
+@@ -1386,7 +1371,7 @@ else
+ else
+ error="$error
+ job id required"
+- fi
++fi
+ fi
+
+ case $qid in
+@@ -1531,7 +1516,7 @@ Program name : $prog
+ Marc shared lib : $progdll
+ Version type : $mode
+ Job ID : $DIRJID/$jid$extra_job_info
+-User subroutine name : $usersubname
++User subroutine name : $user
+ User objects/libs : $objs
+ Restart file job ID : $rid
+ Substructure file ID : $sid
+@@ -1564,7 +1549,7 @@ Program name : $prog
+ Marc shared lib : $progdll
+ Version type : $mode
+ Job ID : $DIRJID/$jid$extra_job_info
+-User subroutine name : $usersubname
++User subroutine name : $user
+ User objects/libs : $objs
+ Restart file job ID : $rid
+ Substructure file ID : $sid
+@@ -1687,7 +1672,7 @@ Program name ($prog)? $ECHOTXT"
+ ;;
+ esac
+ fi
+- $ECHO "User subroutine name ($usersubname)? $ECHOTXT"
++ $ECHO "User subroutine name ($user)? $ECHOTXT"
+ read value
+ if test "$value"
+ then
+@@ -1696,50 +1681,19 @@ Program name ($prog)? $ECHOTXT"
+ user=
+ ;;
+ *)
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user
+- basefile=`$BASENAME $value`
+- if test ${basefile##*.} = f
+- then
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user.f
+- elif test ${basefile##*.} = F
+- then
+- user=`dirname $value`/`$BASENAME $value .F`
+- usersubname=$user.F
+- elif test ${basefile##*.} = f90
+- then
+- user=`dirname $value`/`$BASENAME $value .f90`
+- usersubname=$user.f90
+- elif test ${basefile##*.} = F90
+- then
+- user=`dirname $value`/`$BASENAME $value .F90`
+- usersubname=$user.F90
+- fi
++ user=$value
+ case $user in
+- \/*)
+- ;;
+- *)
++ \/*)
++ ;;
++ *)
+ user=`pwd`/$user
+- usersubname=`pwd`/$usersubname
+- ;;
+- esac
+- if test ! -f $usersubname
+- then
+- if test -f $usersubname.f
+- then
+- usersubname=$usersubname.f
+- elif test -f $usersubname.F
+- then
+- usersubname=$usersubname.F
+- elif test -f $usersubname.f90
+- then
+- usersubname=$usersubname.f90
+- elif test -f $usersubname.F90
+- then
+- usersubname=$usersubname.F90
+- fi
+- fi
++ ;;
++ esac
++ usernoext=$user
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
+ ;;
+ esac
+ fi
+@@ -2274,11 +2228,12 @@ fi
+ #
+ # user subroutine used
+ #
++# add DAMASK options for linking
++ DAMASK="-lstdc++"
+
+ if test "$user"
+ then
+-# program=$user.marc
+- program=$DIRJOB/`$BASENAME $user .f`.marc
++ program=$usernoext.marc
+ case $program in
+ \/* | \.\/*)
+ bd=
+@@ -2391,7 +2346,7 @@ fi
+ fi
+ if test "$user"
+ then
+- execpath=$DIRJOB/`$BASENAME $user .f`.marc
++ execpath=$usernoext.marc
+ usersub=1
+ fi
+ export execpath
+@@ -3274,44 +3229,27 @@ then
+ echo
+ if test "$user"
+ then
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
+- fi
+-
++ userobj=$usermoext.o
+ fi
+ cat > $jid.runmarcscript << END4
+ if test "$user"
+ then
+- if test ${basefile##*.} = f
+- then
+- ln -sf "$user.f" "$usersub"
+- fi
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTLOWMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTLOWMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi
+
+
+@@ -3331,10 +3269,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
+- $SFLIB \
++ $DAMASK \
++ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ exit 1
+@@ -3344,6 +3283,9 @@ else
+ prgsav=yes
+ fi
+ /bin/rm $userobj 2>/dev/null
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+
+ #
+ # run marc
+@@ -3390,7 +3332,7 @@ if test $dllrun -eq 0; then
+ fi
+ else
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes
+@@ -3556,7 +3498,7 @@ then
+ # first copy over the user sub if local directories
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RCP $user.f $i:$DIR1/
++ $RCP $user $i:$DIR1/
+ fi
+ # do the compilation on the other machine
+ if test ${dirstatus[$counter]} = "shared"
+@@ -3569,21 +3511,21 @@ then
+ remoteuser=$DIR1/`$BASENAME $user`
+ $RSH $i /bin/rm $remoteprog 2> /dev/null
+ echo
+- $RSH $i $DIR2/tools/comp_user $DIR2 $DIR1 $remoteuser $remoteprog
++ $RSH $i $DIR2/tools/comp_damask_lmp $DIR2 $DIR1 $remoteuser $remoteprog
+ # check if successful, the new executable should be there
+ line=`$RSH $i /bin/ls $remoteprog 2> /dev/null`
+ if test "$line"
+ then
+ echo compilation and linking successful on host $i
+ else
+- echo "$0: compile failed for $user.f on host $i"
++ echo "$0: compile failed for $user on host $i"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ fi
+ # remove the user subroutine on remote machine
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RSH $i /bin/rm $remoteuser.f 2> /dev/null
++ $RSH $i /bin/rm $remoteuser 2> /dev/null
+ fi
+ fi
+ fi
+@@ -3593,39 +3535,27 @@ then
+ if test "$userhost"
+ then
+ echo
+- echo "Compiling and linking user subroutine $user.f on host `hostname`"
+- fi
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
++ echo "Compiling and linking user subroutine $user on host `hostname`"
+ fi
++ userobj=$usernoext.o
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTLOWMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTLOWMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi # if test $user
+
+
+@@ -3645,10 +3575,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
+- $SFLIB \
++ $DAMASK \
++ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ echo " $PRODUCT Exit number 3"
+@@ -3686,6 +3617,9 @@ else # if test $link
+ prgsav=yes
+ fi # if test $link
+ /bin/rm $userobj 2>/dev/null
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+
+ #
+ # run marc
+@@ -3744,42 +3678,42 @@ then
+ counter=0
+ if test -f "$host_filt"
+ then
+- for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
+- do
+- ibase=${i%%.*}
+- if test $ibase != $thishost
++ for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
++ do
++ ibase=${i%%.*}
++ if test $ibase != $thishost
++ then
++ counter=$((counter+1))
++ DIR1=$DIRJOB
++ line=`grep -v '^#' $userhost | grep "^$ibase "`
++ workdir=`echo $line | $AWK '{print $3}'`
++ if test -n "$workdir"
+ then
+- counter=$((counter+1))
+- DIR1=$DIRJOB
+- line=`grep -v '^#' $userhost | grep "^$ibase "`
+- workdir=`echo $line | $AWK '{print $3}'`
+- if test -n "$workdir"
+- then
+- DIR1=$workdir
+- fi
+- # if an incompatible host uses shared directory,
+- # then the root machine deletes the executable
+- if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
+- then
+- hname=_$ibase
+- /bin/rm ${execname}$hname
+- fi
+- # if local directory used, the remote machine
+- # deletes the executable
+- if test ${dirstatus[$counter]} = "local"
+- then
+- $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
+- fi
++ DIR1=$workdir
+ fi
+- done
+- fi
++ # if an incompatible host uses shared directory,
++ # then the root machine deletes the executable
++ if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
++ then
++ hname=_$ibase
++ /bin/rm ${execname}$hname
++ fi
++ # if local directory used, the remote machine
++ # deletes the executable
++ if test ${dirstatus[$counter]} = "local"
++ then
++ $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
++ fi
++ fi
++ done
+ fi
+ fi
+ fi
++fi
+ else
+ #dllrun >0
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes;then
+@@ -3904,7 +3838,7 @@ then
+ # first copy over the user sub if local directories
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RCP $user.f $i:$DIR1/
++ $RCP $user $i:$DIR1/
+ fi
+ # do the compilation on the other machine
+ if test ${dirstatus[$counter]} = "shared"
+@@ -3917,20 +3851,20 @@ then
+ remoteuser=$DIR1/`$BASENAME $user`
+ $RSH $i /bin/rm $remoteprog 2> /dev/null
+ echo
+- $RSH $i $DIR2/tools/comp_user $DIR2 $DIR1 $remoteuser $remoteprog
++ $RSH $i $DIR2/tools/comp_damask_lmp $DIR2 $DIR1 $remoteuser $remoteprog
+ # check if successful, the new executable should be there
+ line=`$RSH $i /bin/ls $remoteprog 2> /dev/null`
+ if test "$line"
+ then
+ echo compilation and linking successful on host $i
+ else
+- echo "$0: compile failed for $user.f on host $i"
++ echo "$0: compile failed for $user on host $i"
+ exit 1
+ fi
+ # remove the user subroutine on remote machine
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RSH $i /bin/rm $remoteuser.f 2> /dev/null
++ $RSH $i /bin/rm $remoteuser 2> /dev/null
+ fi
+ fi
+ fi
+@@ -3940,37 +3874,25 @@ then
+ if test "$userhost"
+ then
+ echo
+- echo "Compiling and linking user subroutine $user.f on host `hostname`"
+- fi
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
++ echo "Compiling and linking user subroutine $user on host `hostname`"
+ fi
++ userobj=$usernoext.o
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTLOWMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTLOWMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi # if test $user
+
+
+@@ -3990,10 +3912,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
++ $DAMASK \
+ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ exit 1
+@@ -4030,7 +3953,9 @@ else # if test $link
+ prgsav=yes
+ fi # if test $link
+ /bin/rm $userobj 2>/dev/null
+-
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+ # done if no job id given
+ if test -z "$jid"
+ then
+@@ -4070,7 +3995,7 @@ if test $ddm_arc -gt 0; then
+ RUN_JOB="$BINDIR/exeddm $RUN_JOB -ddm $ddm_arc "
+ fi
+
+-$RUN_JOB
++ $RUN_JOB
+
+ if test $nprocd -gt 1
+ then
+@@ -4114,42 +4039,42 @@ then
+ counter=0
+ if test -f "$host_filt"
+ then
+- for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
+- do
+- ibase=${i%%.*}
+- if test $ibase != $thishost
++ for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
++ do
++ ibase=${i%%.*}
++ if test $ibase != $thishost
++ then
++ counter=$((counter+1))
++ DIR1=$DIRJOB
++ line=`grep -v '^#' $userhost | grep "^$ibase "`
++ workdir=`echo $line | $AWK '{print $3}'`
++ if test -n "$workdir"
+ then
+- counter=$((counter+1))
+- DIR1=$DIRJOB
+- line=`grep -v '^#' $userhost | grep "^$ibase "`
+- workdir=`echo $line | $AWK '{print $3}'`
+- if test -n "$workdir"
+- then
+- DIR1=$workdir
+- fi
+- # if an incompatible host uses shared directory,
+- # then the root machine deletes the executable
+- if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
+- then
+- hname=_$ibase
+- /bin/rm ${execname}$hname
+- fi
+- # if local directory used, the remote machine
+- # deletes the executable
+- if test ${dirstatus[$counter]} = "local"
+- then
+- $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
+- fi
++ DIR1=$workdir
+ fi
+- done
+- fi
++ # if an incompatible host uses shared directory,
++ # then the root machine deletes the executable
++ if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
++ then
++ hname=_$ibase
++ /bin/rm ${execname}$hname
++ fi
++ # if local directory used, the remote machine
++ # deletes the executable
++ if test ${dirstatus[$counter]} = "local"
++ then
++ $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
++ fi
++ fi
++ done
+ fi
+ fi
+ fi
++fi
+ else
+ #dllrun >0
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes;then
diff --git a/install/MarcMentat/2022.1/Marc_tools/run_damask_mp.patch b/install/MarcMentat/2022.1/Marc_tools/run_damask_mp.patch
new file mode 100644
index 000000000..924af6fbd
--- /dev/null
+++ b/install/MarcMentat/2022.1/Marc_tools/run_damask_mp.patch
@@ -0,0 +1,730 @@
+diff --git "a/C:\\Users\\f.roters\\Documents\\Forschung\\FEM\\Kristallplastizit\303\244t\\Programme\\Userroutinen\\Marc\\Marc_mods\\2022.1\\Marc_tools\\run_marc.original" "b/C:\\Users\\f.roters\\Documents\\Forschung\\FEM\\Kristallplastizit\303\244t\\Programme\\Userroutinen\\Marc\\Marc_mods\\2022.1\\Marc_tools\\run_damask_mp"
+index 88a3027..85beabe 100644
+--- "a/C:\\Users\\f.roters\\Documents\\Forschung\\FEM\\Kristallplastizit\303\244t\\Programme\\Userroutinen\\Marc\\Marc_mods\\2022.1\\Marc_tools\\run_marc.original"
++++ "b/C:\\Users\\f.roters\\Documents\\Forschung\\FEM\\Kristallplastizit\303\244t\\Programme\\Userroutinen\\Marc\\Marc_mods\\2022.1\\Marc_tools\\run_damask_mp"
+@@ -302,7 +302,23 @@ fi
+
+ . "$DIR/getarch"
+
++
++# getting user subroutine file name
++found=0
++for i in "$@"; do
++ if test $found = 1; then
++ DAMASK_USER=$i
++ found=0
++ fi
++ case $i in
++ -u* | -U*)
++ found=1
++ ;;
++ esac
++done
++# sourcing include_linux64 (needs DAMASK_USER to be set)
+ . $MARC_INCLUDE
++
+ #
+
+ #
+@@ -405,7 +421,7 @@ sid=
+ did=
+ vid=
+ user=
+-usersubname=
++usernoext=
+ objs=
+ qid=background
+ cpu=
+@@ -573,7 +589,7 @@ do
+ justlist=yes
+ ;;
+ -fe* | -FE*)
+- feature=$value
++ feature=$value
+
+ ;;
+ -pr* | -PR*)
+@@ -676,50 +692,19 @@ do
+ esac
+ ;;
+ -u* | -U*)
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user
+- basefile=`$BASENAME $value`
+- if test ${basefile##*.} = f
+- then
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user.f
+- elif test ${basefile##*.} = F
+- then
+- user=`dirname $value`/`$BASENAME $value .F`
+- usersubname=$user.F
+- elif test ${basefile##*.} = f90
+- then
+- user=`dirname $value`/`$BASENAME $value .f90`
+- usersubname=$user.f90
+- elif test ${basefile##*.} = F90
+- then
+- user=`dirname $value`/`$BASENAME $value .F90`
+- usersubname=$user.F90
+- fi
++ user=$value
+ case $user in
+ \/*)
+ ;;
+ *)
+ user=`pwd`/$user
+- usersubname=`pwd`/$usersubname
+ ;;
+ esac
+- if test ! -f $usersubname
+- then
+- if test -f $usersubname.f
+- then
+- usersubname=$usersubname.f
+- elif test -f $usersubname.F
+- then
+- usersubname=$usersubname.F
+- elif test -f $usersubname.f90
+- then
+- usersubname=$usersubname.f90
+- elif test -f $usersubname.F90
+- then
+- usersubname=$usersubname.F90
+- fi
+- fi
++ usernoext=$user
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
+ ;;
+ -obj | -OBJ)
+ objs="$value"
+@@ -739,19 +724,19 @@ do
+ ;;
+ esac
+ ;;
+- -dl | -DL)
+- case $value in
+- y* | Y*)
+- deletelog=yes
+- ;;
+- n* | N*)
+- deletelog=no
+- ;;
+- *)
+- ;;
+- esac
++ -dl | -DL)
++ case $value in
++ y* | Y*)
++ deletelog=yes
++ ;;
++ n* | N*)
++ deletelog=no
++ ;;
++ *)
++ ;;
++ esac
+
+- ;;
++ ;;
+ -at | -AT)
+ att=$value
+ ;;
+@@ -1207,12 +1192,12 @@ post file $DIRPID/$pid.t16 or $DIRPID/$pid.t19 or $DIRPID/$pid.h5 not accessible
+ fi
+ fi
+ fi
+- if test "$usersubname"
++ if test "$user"
+ then
+- if test ! -f $usersubname
++ if test ! -f $user
+ then
+ error="$error
+-user subroutine file $usersubname not accessible"
++user subroutine file $user not accessible"
+ fi
+ fi
+ if test "$objs"
+@@ -1386,7 +1371,7 @@ else
+ else
+ error="$error
+ job id required"
+- fi
++fi
+ fi
+
+ case $qid in
+@@ -1531,7 +1516,7 @@ Program name : $prog
+ Marc shared lib : $progdll
+ Version type : $mode
+ Job ID : $DIRJID/$jid$extra_job_info
+-User subroutine name : $usersubname
++User subroutine name : $user
+ User objects/libs : $objs
+ Restart file job ID : $rid
+ Substructure file ID : $sid
+@@ -1548,8 +1533,6 @@ GPGPU option : $gpuids
+ Host file name : $host" > $jid.log
+ if test "$iprintsimufact" = true ; then
+ echo "DDM with ARC Mapper : $ddm_arc" >> $jid.log
+- echo "Mapper directory : $MESHERDIR" >> $jid.log
+- echo "Meshing directory : $MESHERDIR" >> $jid.log
+ fi
+ echo \
+ "Message passing type : $itree
+@@ -1564,7 +1547,7 @@ Program name : $prog
+ Marc shared lib : $progdll
+ Version type : $mode
+ Job ID : $DIRJID/$jid$extra_job_info
+-User subroutine name : $usersubname
++User subroutine name : $user
+ User objects/libs : $objs
+ Restart file job ID : $rid
+ Substructure file ID : $sid
+@@ -1579,6 +1562,8 @@ Solver processes : $nsolverprint
+ Solver threads : $ntsprint"
+ if test "$iprintsimufact" = true ; then
+ echo "DDM with ARC Mapper : $ddm_arc"
++ echo "Mapper directory : $MESHERDIR" >> $jid.log
++ echo "Meshing directory : $MESHERDIR" >> $jid.log
+ fi
+ echo \
+ "GPGPU option : $gpuids
+@@ -1687,7 +1672,7 @@ Program name ($prog)? $ECHOTXT"
+ ;;
+ esac
+ fi
+- $ECHO "User subroutine name ($usersubname)? $ECHOTXT"
++ $ECHO "User subroutine name ($user)? $ECHOTXT"
+ read value
+ if test "$value"
+ then
+@@ -1696,50 +1681,19 @@ Program name ($prog)? $ECHOTXT"
+ user=
+ ;;
+ *)
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user
+- basefile=`$BASENAME $value`
+- if test ${basefile##*.} = f
+- then
+- user=`dirname $value`/`$BASENAME $value .f`
+- usersubname=$user.f
+- elif test ${basefile##*.} = F
+- then
+- user=`dirname $value`/`$BASENAME $value .F`
+- usersubname=$user.F
+- elif test ${basefile##*.} = f90
+- then
+- user=`dirname $value`/`$BASENAME $value .f90`
+- usersubname=$user.f90
+- elif test ${basefile##*.} = F90
+- then
+- user=`dirname $value`/`$BASENAME $value .F90`
+- usersubname=$user.F90
+- fi
++ user=$value
+ case $user in
+- \/*)
+- ;;
+- *)
++ \/*)
++ ;;
++ *)
+ user=`pwd`/$user
+- usersubname=`pwd`/$usersubname
+- ;;
+- esac
+- if test ! -f $usersubname
+- then
+- if test -f $usersubname.f
+- then
+- usersubname=$usersubname.f
+- elif test -f $usersubname.F
+- then
+- usersubname=$usersubname.F
+- elif test -f $usersubname.f90
+- then
+- usersubname=$usersubname.f90
+- elif test -f $usersubname.F90
+- then
+- usersubname=$usersubname.F90
+- fi
+- fi
++ ;;
++ esac
++ usernoext=$user
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .F`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .for`
++ usernoext=`dirname $usernoext`/`$BASENAME $usernoext .f90`
+ ;;
+ esac
+ fi
+@@ -2274,11 +2228,12 @@ fi
+ #
+ # user subroutine used
+ #
++# add DAMASK options for linking
++ DAMASK="-lstdc++"
+
+ if test "$user"
+ then
+-# program=$user.marc
+- program=$DIRJOB/`$BASENAME $user .f`.marc
++ program=$usernoext.marc
+ case $program in
+ \/* | \.\/*)
+ bd=
+@@ -2391,7 +2346,7 @@ fi
+ fi
+ if test "$user"
+ then
+- execpath=$DIRJOB/`$BASENAME $user .f`.marc
++ execpath=$usernoext.marc
+ usersub=1
+ fi
+ export execpath
+@@ -3274,44 +3229,27 @@ then
+ echo
+ if test "$user"
+ then
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
+- fi
+-
++ userobj=$usermoext.o
+ fi
+ cat > $jid.runmarcscript << END4
+ if test "$user"
+ then
+- if test ${basefile##*.} = f
+- then
+- ln -sf "$user.f" "$usersub"
+- fi
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTRANMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTRANMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi
+
+
+@@ -3331,10 +3269,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
+- $SFLIB \
++ $DAMASK \
++ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ exit 1
+@@ -3344,6 +3283,9 @@ else
+ prgsav=yes
+ fi
+ /bin/rm $userobj 2>/dev/null
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+
+ #
+ # run marc
+@@ -3390,7 +3332,7 @@ if test $dllrun -eq 0; then
+ fi
+ else
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes
+@@ -3556,7 +3498,7 @@ then
+ # first copy over the user sub if local directories
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RCP $user.f $i:$DIR1/
++ $RCP $user $i:$DIR1/
+ fi
+ # do the compilation on the other machine
+ if test ${dirstatus[$counter]} = "shared"
+@@ -3569,21 +3511,21 @@ then
+ remoteuser=$DIR1/`$BASENAME $user`
+ $RSH $i /bin/rm $remoteprog 2> /dev/null
+ echo
+- $RSH $i $DIR2/tools/comp_user $DIR2 $DIR1 $remoteuser $remoteprog
++ $RSH $i $DIR2/tools/comp_damask_mp $DIR2 $DIR1 $remoteuser $remoteprog
+ # check if successful, the new executable should be there
+ line=`$RSH $i /bin/ls $remoteprog 2> /dev/null`
+ if test "$line"
+ then
+ echo compilation and linking successful on host $i
+ else
+- echo "$0: compile failed for $user.f on host $i"
++ echo "$0: compile failed for $user on host $i"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ fi
+ # remove the user subroutine on remote machine
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RSH $i /bin/rm $remoteuser.f 2> /dev/null
++ $RSH $i /bin/rm $remoteuser 2> /dev/null
+ fi
+ fi
+ fi
+@@ -3593,39 +3535,27 @@ then
+ if test "$userhost"
+ then
+ echo
+- echo "Compiling and linking user subroutine $user.f on host `hostname`"
+- fi
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
++ echo "Compiling and linking user subroutine $user on host `hostname`"
+ fi
++ userobj=$usernoext.o
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTRANMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTRANMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ echo " $PRODUCT Exit number 3"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi # if test $user
+
+
+@@ -3645,10 +3575,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
+- $SFLIB \
++ $DAMASK \
++ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ echo " $PRODUCT Exit number 3"
+@@ -3686,6 +3617,9 @@ else # if test $link
+ prgsav=yes
+ fi # if test $link
+ /bin/rm $userobj 2>/dev/null
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+
+ #
+ # run marc
+@@ -3744,42 +3678,42 @@ then
+ counter=0
+ if test -f "$host_filt"
+ then
+- for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
+- do
+- ibase=${i%%.*}
+- if test $ibase != $thishost
++ for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
++ do
++ ibase=${i%%.*}
++ if test $ibase != $thishost
++ then
++ counter=$((counter+1))
++ DIR1=$DIRJOB
++ line=`grep -v '^#' $userhost | grep "^$ibase "`
++ workdir=`echo $line | $AWK '{print $3}'`
++ if test -n "$workdir"
+ then
+- counter=$((counter+1))
+- DIR1=$DIRJOB
+- line=`grep -v '^#' $userhost | grep "^$ibase "`
+- workdir=`echo $line | $AWK '{print $3}'`
+- if test -n "$workdir"
+- then
+- DIR1=$workdir
+- fi
+- # if an incompatible host uses shared directory,
+- # then the root machine deletes the executable
+- if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
+- then
+- hname=_$ibase
+- /bin/rm ${execname}$hname
+- fi
+- # if local directory used, the remote machine
+- # deletes the executable
+- if test ${dirstatus[$counter]} = "local"
+- then
+- $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
+- fi
++ DIR1=$workdir
+ fi
+- done
+- fi
++ # if an incompatible host uses shared directory,
++ # then the root machine deletes the executable
++ if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
++ then
++ hname=_$ibase
++ /bin/rm ${execname}$hname
++ fi
++ # if local directory used, the remote machine
++ # deletes the executable
++ if test ${dirstatus[$counter]} = "local"
++ then
++ $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
++ fi
++ fi
++ done
+ fi
+ fi
+ fi
++fi
+ else
+ #dllrun >0
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes;then
+@@ -3904,7 +3838,7 @@ then
+ # first copy over the user sub if local directories
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RCP $user.f $i:$DIR1/
++ $RCP $user $i:$DIR1/
+ fi
+ # do the compilation on the other machine
+ if test ${dirstatus[$counter]} = "shared"
+@@ -3917,20 +3851,20 @@ then
+ remoteuser=$DIR1/`$BASENAME $user`
+ $RSH $i /bin/rm $remoteprog 2> /dev/null
+ echo
+- $RSH $i $DIR2/tools/comp_user $DIR2 $DIR1 $remoteuser $remoteprog
++ $RSH $i $DIR2/tools/comp_damask_mp $DIR2 $DIR1 $remoteuser $remoteprog
+ # check if successful, the new executable should be there
+ line=`$RSH $i /bin/ls $remoteprog 2> /dev/null`
+ if test "$line"
+ then
+ echo compilation and linking successful on host $i
+ else
+- echo "$0: compile failed for $user.f on host $i"
++ echo "$0: compile failed for $user on host $i"
+ exit 1
+ fi
+ # remove the user subroutine on remote machine
+ if test ${dirstatus[$counter]} = "local"
+ then
+- $RSH $i /bin/rm $remoteuser.f 2> /dev/null
++ $RSH $i /bin/rm $remoteuser 2> /dev/null
+ fi
+ fi
+ fi
+@@ -3940,37 +3874,25 @@ then
+ if test "$userhost"
+ then
+ echo
+- echo "Compiling and linking user subroutine $user.f on host `hostname`"
+- fi
+- userobj=$DIRJOB/`$BASENAME $user .f`.o
+- basefile=`$BASENAME $usersubname`
+- if test ${basefile##*.} = f
+- then
+- usersub=$DIRJOB/`$BASENAME $user .f`.F
+- ln -sf "$user.f" "$usersub"
+- else
+- usersub=$usersubname
++ echo "Compiling and linking user subroutine $user on host `hostname`"
+ fi
++ userobj=$usernoext.o
+ if test $MACHINENAME = "CRAY"
+ then
+- $FORTRAN $usersub || \
++ $DFORTRANMP $user || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ else
+- $FORTRAN $usersub -o $userobj || \
++ $DFORTRANMP $user -o $userobj || \
+ {
+- echo "$0: compile failed for $user.f"
++ echo "$0: compile failed for $user"
+ exit 1
+ }
+ /bin/rm $program 2>/dev/null
+ fi
+- if test ${basefile##*.} = f
+- then
+- /bin/rm -f "$usersub"
+- fi
+ fi # if test $user
+
+
+@@ -3990,10 +3912,11 @@ then
+ $TKLIBS \
+ $MRCLIBS \
+ $METISLIBS \
++ $DAMASK \
+ $SFLIB \
+ $OPENSSL_LIB \
+ $SYSLIBS \
+- $SECLIBS || \
++ $SECLIBS || \
+ {
+ echo "$0: link failed for ${user:+$userobj }$objs"
+ exit 1
+@@ -4030,7 +3953,9 @@ else # if test $link
+ prgsav=yes
+ fi # if test $link
+ /bin/rm $userobj 2>/dev/null
+-
++/bin/rm $DIRJOB/*.mod 2>/dev/null
++/bin/rm $DIRJOB/*.smod 2>/dev/null
++/bin/rm $DIRJOB/*_genmod.f90 2>/dev/null
+ # done if no job id given
+ if test -z "$jid"
+ then
+@@ -4070,7 +3995,7 @@ if test $ddm_arc -gt 0; then
+ RUN_JOB="$BINDIR/exeddm $RUN_JOB -ddm $ddm_arc "
+ fi
+
+-$RUN_JOB
++ $RUN_JOB
+
+ if test $nprocd -gt 1
+ then
+@@ -4114,42 +4039,42 @@ then
+ counter=0
+ if test -f "$host_filt"
+ then
+- for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
+- do
+- ibase=${i%%.*}
+- if test $ibase != $thishost
++ for i in `$AWK -v n=$numfield '{print $n}' $host_filt`
++ do
++ ibase=${i%%.*}
++ if test $ibase != $thishost
++ then
++ counter=$((counter+1))
++ DIR1=$DIRJOB
++ line=`grep -v '^#' $userhost | grep "^$ibase "`
++ workdir=`echo $line | $AWK '{print $3}'`
++ if test -n "$workdir"
+ then
+- counter=$((counter+1))
+- DIR1=$DIRJOB
+- line=`grep -v '^#' $userhost | grep "^$ibase "`
+- workdir=`echo $line | $AWK '{print $3}'`
+- if test -n "$workdir"
+- then
+- DIR1=$workdir
+- fi
+- # if an incompatible host uses shared directory,
+- # then the root machine deletes the executable
+- if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
+- then
+- hname=_$ibase
+- /bin/rm ${execname}$hname
+- fi
+- # if local directory used, the remote machine
+- # deletes the executable
+- if test ${dirstatus[$counter]} = "local"
+- then
+- $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
+- fi
++ DIR1=$workdir
+ fi
+- done
+- fi
++ # if an incompatible host uses shared directory,
++ # then the root machine deletes the executable
++ if test ${dirstatus[$counter]} = "shared" -a ${compstatus[$counter]} = "no"
++ then
++ hname=_$ibase
++ /bin/rm ${execname}$hname
++ fi
++ # if local directory used, the remote machine
++ # deletes the executable
++ if test ${dirstatus[$counter]} = "local"
++ then
++ $RSH $i /bin/rm $DIR1/${execname} 2>/dev/null
++ fi
++ fi
++ done
+ fi
+ fi
+ fi
++fi
+ else
+ #dllrun >0
+ if test $cpdll = yes; then
+- filename=`basename $usersubname .f`
++ filename=$usernoext
+ /bin/cp $DIRJOB/$marcdll $DIRJOB/${filename}_$marcdll 2>/dev/null
+ fi
+ if test $rmdll = yes;then
diff --git a/install/MarcMentat/2022.1/Mentat_bin/edit_window.patch b/install/MarcMentat/2022.1/Mentat_bin/edit_window.patch
new file mode 100644
index 000000000..915af9bf6
--- /dev/null
+++ b/install/MarcMentat/2022.1/Mentat_bin/edit_window.patch
@@ -0,0 +1,24 @@
+---
++++
+@@ -1,18 +1,5 @@
+ #!/bin/sh
+-# This script opens a window running an editor. The default window is an
+-# xterm, and the default editor is vi. These may be customized.
++# This script opens a window running an editor.
++# The command to invoke the editor is specified during DAMASK installation
+
+-dir=
+-for d in /usr/bin /usr/bin/X11; do
+- if test -x "$d/xterm"; then
+- dir="$d"
+- break
+- fi
+-done
+-
+-if test -z "$dir"; then
+- echo "$0: Could not find xterm"
+- exit 1
+-fi
+-
+-"$dir/xterm" -T "vi $*" -n "vi $*" -e vi $*
++%EDITOR% $*
diff --git a/install/MarcMentat/2022.1/Mentat_bin/kill4.patch b/install/MarcMentat/2022.1/Mentat_bin/kill4.patch
new file mode 100644
index 000000000..e69de29bb
diff --git a/install/MarcMentat/2022.1/Mentat_bin/kill5.patch b/install/MarcMentat/2022.1/Mentat_bin/kill5.patch
new file mode 100644
index 000000000..e69de29bb
diff --git a/install/MarcMentat/2022.1/Mentat_bin/kill6.patch b/install/MarcMentat/2022.1/Mentat_bin/kill6.patch
new file mode 100644
index 000000000..e69de29bb
diff --git a/install/MarcMentat/2022.1/Mentat_bin/submit4.patch b/install/MarcMentat/2022.1/Mentat_bin/submit4.patch
new file mode 100644
index 000000000..3f1371fdb
--- /dev/null
+++ b/install/MarcMentat/2022.1/Mentat_bin/submit4.patch
@@ -0,0 +1,38 @@
+---
++++
+@@ -63,10 +64,10 @@ doe_nparallel=$6
+ if [ "$slv" != "" -a "$slv" != "marc" -a "$slv" != "datfit" ]; then
+ slv="-iam sfm"
+ fi
+-if [ "$slv" == "marc" ]; then
++if [ "$slv" = "marc" ]; then
+ slv=""
+ fi
+-if [ "$slv" == "datfit" ]; then
++if [ "$slv" = "datfit" ]; then
+ slv="-iam datfit"
+ fi
+
+@@ -91,6 +92,7 @@ if [ "$srcfile" != "" -a "$srcfile" != "-" ]; then
+ srcfile="-u $srcfile -save y"
+ ;;
+ runsaved)
++ srcfile=${srcfile%.*}".marc"
+ srcfile="-prog $srcfile"
+ ;;
+ esac
+@@ -189,12 +191,12 @@ unset PYTHONHOME
+ unset PYTHONPATH
+
+ if [ "$doe_first" = "-" ]; then # submit of regular Marc job
+- "${DIR}/tools/run_marc" $slv -j $job -v n -b y $nprocds $nprocd \
++ "${DIR}/tools/run_damask_hmp" $slv -j $job -v n -b y $nprocds $nprocd \
+ $srcfile $restart $postfile $viewfactorsfile $hostfile \
+ $compat $copy_datfile $copy_postfile $scr_dir $dcoup \
+ $assem_recov_nthread $nthread $nsolver $mode $gpu > /dev/null 2>&1
+ else # submit of a DoE Marc job
+- "${DIR}/tools/run_marc" $slv -j $job -v n -b n $nprocds $nprocd \
++ "${DIR}/tools/run_damask_hmp" $slv -j $job -v n -b n $nprocds $nprocd \
+ $srcfile $restart $postfile $viewfactorsfile $hostfile \
+ $compat $copy_datfile $copy_postfile $scr_dir $dcoup \
+ $assem_recov_nthread $nthread $nsolver $mode $gpu
diff --git a/install/MarcMentat/2022.1/Mentat_bin/submit5.patch b/install/MarcMentat/2022.1/Mentat_bin/submit5.patch
new file mode 100644
index 000000000..9614d8c69
--- /dev/null
+++ b/install/MarcMentat/2022.1/Mentat_bin/submit5.patch
@@ -0,0 +1,38 @@
+---
++++
+@@ -63,10 +64,10 @@ doe_nparallel=$6
+ if [ "$slv" != "" -a "$slv" != "marc" -a "$slv" != "datfit" ]; then
+ slv="-iam sfm"
+ fi
+-if [ "$slv" == "marc" ]; then
++if [ "$slv" = "marc" ]; then
+ slv=""
+ fi
+-if [ "$slv" == "datfit" ]; then
++if [ "$slv" = "datfit" ]; then
+ slv="-iam datfit"
+ fi
+
+@@ -91,6 +92,7 @@ if [ "$srcfile" != "" -a "$srcfile" != "-" ]; then
+ srcfile="-u $srcfile -save y"
+ ;;
+ runsaved)
++ srcfile=${srcfile%.*}".marc"
+ srcfile="-prog $srcfile"
+ ;;
+ esac
+@@ -189,12 +191,12 @@ unset PYTHONHOME
+ unset PYTHONPATH
+
+ if [ "$doe_first" = "-" ]; then # submit of regular Marc job
+- "${DIR}/tools/run_marc" $slv -j $job -v n -b y $nprocds $nprocd \
++ "${DIR}/tools/run_damask_mp" $slv -j $job -v n -b y $nprocds $nprocd \
+ $srcfile $restart $postfile $viewfactorsfile $hostfile \
+ $compat $copy_datfile $copy_postfile $scr_dir $dcoup \
+ $assem_recov_nthread $nthread $nsolver $mode $gpu > /dev/null 2>&1
+ else # submit of a DoE Marc job
+- "${DIR}/tools/run_marc" $slv -j $job -v n -b n $nprocds $nprocd \
++ "${DIR}/tools/run_damask_mp" $slv -j $job -v n -b n $nprocds $nprocd \
+ $srcfile $restart $postfile $viewfactorsfile $hostfile \
+ $compat $copy_datfile $copy_postfile $scr_dir $dcoup \
+ $assem_recov_nthread $nthread $nsolver $mode $gpu
diff --git a/install/MarcMentat/2022.1/Mentat_bin/submit6.patch b/install/MarcMentat/2022.1/Mentat_bin/submit6.patch
new file mode 100644
index 000000000..a3ed16135
--- /dev/null
+++ b/install/MarcMentat/2022.1/Mentat_bin/submit6.patch
@@ -0,0 +1,38 @@
+---
++++
+@@ -63,10 +64,10 @@ doe_nparallel=$6
+ if [ "$slv" != "" -a "$slv" != "marc" -a "$slv" != "datfit" ]; then
+ slv="-iam sfm"
+ fi
+-if [ "$slv" == "marc" ]; then
++if [ "$slv" = "marc" ]; then
+ slv=""
+ fi
+-if [ "$slv" == "datfit" ]; then
++if [ "$slv" = "datfit" ]; then
+ slv="-iam datfit"
+ fi
+
+@@ -91,6 +92,7 @@ if [ "$srcfile" != "" -a "$srcfile" != "-" ]; then
+ srcfile="-u $srcfile -save y"
+ ;;
+ runsaved)
++ srcfile=${srcfile%.*}".marc"
+ srcfile="-prog $srcfile"
+ ;;
+ esac
+@@ -189,12 +191,12 @@ unset PYTHONHOME
+ unset PYTHONPATH
+
+ if [ "$doe_first" = "-" ]; then # submit of regular Marc job
+- "${DIR}/tools/run_marc" $slv -j $job -v n -b y $nprocds $nprocd \
++ "${DIR}/tools/run_damask_lmp" $slv -j $job -v n -b y $nprocds $nprocd \
+ $srcfile $restart $postfile $viewfactorsfile $hostfile \
+ $compat $copy_datfile $copy_postfile $scr_dir $dcoup \
+ $assem_recov_nthread $nthread $nsolver $mode $gpu > /dev/null 2>&1
+ else # submit of a DoE Marc job
+- "${DIR}/tools/run_marc" $slv -j $job -v n -b n $nprocds $nprocd \
++ "${DIR}/tools/run_damask_lmp" $slv -j $job -v n -b n $nprocds $nprocd \
+ $srcfile $restart $postfile $viewfactorsfile $hostfile \
+ $compat $copy_datfile $copy_postfile $scr_dir $dcoup \
+ $assem_recov_nthread $nthread $nsolver $mode $gpu
diff --git a/install/MarcMentat/2022.1/Mentat_menus/job_run.ms.patch b/install/MarcMentat/2022.1/Mentat_menus/job_run.ms.patch
new file mode 100644
index 000000000..6cbcf895c
--- /dev/null
+++ b/install/MarcMentat/2022.1/Mentat_menus/job_run.ms.patch
@@ -0,0 +1,158 @@
+---
++++
+@@ -261,11 +261,18 @@ popmenu job_run_popmenu {
+ }
+ button {
+ position +25 =
+- size 25 4
++ size 18 4
+ text "ADVANCED JOB SUBMISSION"
+ help "job_run#Job Submission And Control"
+ popmenu job_submit_adv_pm
+ }
++ button {
++ position +18 =
++ size 7 4
++ text "DAMASK"
++ help "damask_run#Job Submission And Control"
++ popmenu damask
++ }
+ button {
+ position 0 +4
+ size 12 4
+@@ -1189,6 +1196,135 @@ popmenu job_submit_adv_pm {
+ }
+
+
++#--------------------------------------------------------------------------------------------------
++popmenu damask {
++
++#ifdef QT_MENTAT
++ text "DAMASK.MPIE.DE"
++#endif
++
++ group {
++#ifndef QT_MENTAT
++ label {
++ position 0 0
++ size 50 4
++ text "DAMASK.MPIE.DE"
++ }
++#endif
++
++ label {
++ position 1 6
++ size 13 6
++ text "Optimzation"
++ border_width 1
++ border_color black
++ }
++
++ label {
++ position +13 =
++ size 20 6
++ text "write Input"
++ border_width 1
++ border_color black
++ }
++
++ label {
++ position +18 =
++ size 30 6
++ text "do not write Inp."
++ border_width 1
++ border_color black
++ }
++
++ label {
++ position -32 +6
++ size 12 6
++ text "O2 / OpenMP"
++ border_width 1
++ border_color black
++ }
++
++ popdown {
++ position +12 =
++ size 20 6
++ text "Submit"
++ command "*submit_job 4 *monitor_job"
++ }
++
++ popdown {
++ position +20 =
++ size 20 6
++ text "Execute"
++ command "*execute_job 4 *monitor_job"
++ }
++
++ label {
++ position -32 +6
++ size 12 6
++ text "O1 / OpenMP"
++ border_width 1
++ border_color black
++ }
++
++ popdown {
++ position +12 =
++ size 20 6
++ text "Submit"
++ command "*submit_job 5 *monitor_job"
++ }
++
++ popdown {
++ position +20 =
++ size 20 6
++ text "Execute"
++ command "*execute_job 5 *monitor_job"
++ }
++
++ label {
++ position -32 +6
++ size 12 6
++ text "O0 / OpenMP"
++ border_width 1
++ border_color black
++ }
++
++ popdown {
++ position +12 =
++ size 20 6
++ text "Submit"
++ command "*submit_job 6 *monitor_job"
++ }
++
++ popdown {
++ position +20 =
++ size 20 6
++ text "Execute"
++ command "*execute_job 6 *monitor_job"
++ }
++
++ popdown {
++ position 19 +8
++ size 12 8
++ text "CANCEL"
++ }
++}
++
++ window {
++ parent mentat
++ origin 38 8
++#ifdef DCOM
++ size 50 100
++#else
++ size 50 94
++#endif
++ background_color body
++ border_width 1
++ border_color border
++ buffering single
++ }
++ mode permanent
++}
++
+ #--------------------------------------------------------------------------------------------------
+ popmenu job_exit_msg_pm {
+
diff --git a/install/MarcMentat/apply_DAMASK_modifications.py b/install/MarcMentat/apply_DAMASK_modifications.py
index 9ffe187c5..a17120895 100755
--- a/install/MarcMentat/apply_DAMASK_modifications.py
+++ b/install/MarcMentat/apply_DAMASK_modifications.py
@@ -76,6 +76,7 @@ damask.util.run(f'xvfb-run -a {executable} -compile {menu_file}')
print('setting file access rights...')
for file in (glob.glob(str(marc_root/f'marc{marc_version}/tools/*_damask*')) +
+ glob.glob(str(marc_root/f'mentat{marc_version}/bin/edit_window')) +
glob.glob(str(marc_root/f'mentat{marc_version}/bin/kill[4-6]')) +
glob.glob(str(marc_root/f'mentat{marc_version}/bin/submit[4-6]'))):
os.chmod(file , 0o755)
diff --git a/python/damask/_grid.py b/python/damask/_grid.py
index 471ba36bd..f7acfe5aa 100644
--- a/python/damask/_grid.py
+++ b/python/damask/_grid.py
@@ -694,9 +694,9 @@ class Grid:
"""
v = VTK.from_image_data(self.cells,self.size,self.origin)\
- .add('material',self.material.flatten(order='F'))
+ .set('material',self.material.flatten(order='F'))
for label,data in self.initial_conditions.items():
- v = v.add(label,data.flatten(order='F'))
+ v = v.set(label,data.flatten(order='F'))
v.comments = self.comments
v.save(fname,parallel=False,compress=compress)
@@ -745,7 +745,7 @@ class Grid:
"""
VTK.from_image_data(self.cells,self.size,self.origin) \
- .add('material',self.material.flatten('F'),) \
+ .set('material',self.material.flatten('F'),) \
.show('material',colormap)
diff --git a/python/damask/_result.py b/python/damask/_result.py
index 253881731..b86a5fb3d 100644
--- a/python/damask/_result.py
+++ b/python/damask/_result.py
@@ -1627,7 +1627,7 @@ class Result:
for inc in util.show_progress(self.visible['increments']):
u = _read(f['/'.join([inc,'geometry','u_n' if mode.lower() == 'cell' else 'u_p'])])
- v = v.add('u',u)
+ v = v.set('u',u)
for ty in ['phase','homogenization']:
for field in self.visible['fields']:
@@ -1654,7 +1654,7 @@ class Result:
outs[out][at_cell_ho[label]] = data[in_data_ho[label]]
for label,dataset in outs.items():
- v = v.add(' / '.join(['/'.join([ty,field,label]),dataset.dtype.metadata['unit']]),dataset)
+ v = v.set(' / '.join(['/'.join([ty,field,label]),dataset.dtype.metadata['unit']]),dataset)
v.save(f'{self.fname.stem}_inc{inc[10:].zfill(N_digits)}',parallel=parallel)
diff --git a/python/damask/_vtk.py b/python/damask/_vtk.py
index 4f2658cd7..880b00ede 100644
--- a/python/damask/_vtk.py
+++ b/python/damask/_vtk.py
@@ -401,13 +401,13 @@ class VTK:
# Check https://blog.kitware.com/ghost-and-blanking-visibility-changes/ for missing data
- def add(self,
+ def set(self,
label: str = None,
data: Union[np.ndarray, np.ma.MaskedArray] = None,
*,
table: 'Table' = None):
"""
- Add data to either cells or points.
+ Add (or replace existing) point or cell data.
Data can either be a numpy.array, which requires a corresponding label,
or a damask.Table.
@@ -417,11 +417,15 @@ class VTK:
label : str, optional
Label of data array.
data : numpy.ndarray or numpy.ma.MaskedArray, optional
- Data to add. First dimension needs to match either
+ Data to add or replace. First array dimension needs to match either
number of cells or number of points.
table: damask.Table, optional
- Data to add. Number of rows needs to match either
- number of cells or number of points.
+ Data to add or replace. Each table label is individually considered.
+ Number of rows needs to match either number of cells or number of points.
+
+ Notes
+ -----
+ If the number of cells equals the number of points, the data is added to both.
"""
@@ -429,7 +433,10 @@ class VTK:
label: str,
data: np.ndarray):
- N_data = data.shape[0]
+ N_p,N_c = vtk_data.GetNumberOfPoints(),vtk_data.GetNumberOfCells()
+ if (N_data := data.shape[0]) not in [N_p,N_c]:
+ raise ValueError(f'data count mismatch ({N_data} ≠ {N_p} & {N_c})')
+
data_ = data.reshape(N_data,-1) \
.astype(np.single if data.dtype in [np.double,np.longdouble] else data.dtype)
@@ -442,12 +449,10 @@ class VTK:
d.SetName(label)
- if N_data == vtk_data.GetNumberOfPoints():
+ if N_data == N_p:
vtk_data.GetPointData().AddArray(d)
- elif N_data == vtk_data.GetNumberOfCells():
+ if N_data == N_c:
vtk_data.GetCellData().AddArray(d)
- else:
- raise ValueError(f'data count mismatch ({N_data} ≠ {self.N_points} & {self.N_cells})')
if data is None and table is None:
raise KeyError('no data given')
diff --git a/python/damask/solver/_marc.py b/python/damask/solver/_marc.py
index 3d006d27b..8b7f7acba 100644
--- a/python/damask/solver/_marc.py
+++ b/python/damask/solver/_marc.py
@@ -3,7 +3,7 @@ import shlex
import re
from pathlib import Path
-_marc_version = '2021.3.1'
+_marc_version = '2022.1'
_marc_root = '/opt/msc'
_damask_root = str(Path(__file__).parents[3])
diff --git a/python/tests/reference/VTK/polyData.vtp b/python/tests/reference/VTK/polyData.vtp
index dc4b5f149..5f4606535 100644
--- a/python/tests/reference/VTK/polyData.vtp
+++ b/python/tests/reference/VTK/polyData.vtp
@@ -16,6 +16,17 @@
+
+ AQAAAACAAAB4AAAAVgAAAA==eF5jYICBhv2WfY9tLfuS7Ypk3PeDaCDf7okF3/7Vq1bZrV6lZQ+k94HEgHL2QHovUM7+iUUfiG0LlQdhkH77Ipnj9iB5qFp7kBjQDiBmcADRANsaLXM=
+
+
+ 0.74535601471
+
+
+ 2.4494897428
+
+
+
diff --git a/python/tests/test_VTK.py b/python/tests/test_VTK.py
index b0a7ef4c5..58855c831 100644
--- a/python/tests/test_VTK.py
+++ b/python/tests/test_VTK.py
@@ -147,24 +147,24 @@ class TestVTK:
with pytest.raises(KeyError):
default.get('does_not_exist')
- def test_invalid_add_shape(self,default):
+ def test_invalid_set_shape(self,default):
with pytest.raises(ValueError):
- default.add('valid',np.ones(3))
+ default.set('valid',np.ones(3))
- def test_invalid_add_missing_label(self,default):
+ def test_invalid_set_missing_label(self,default):
data = np.random.randint(9,size=np.prod(np.array(default.vtk_data.GetDimensions())-1))
with pytest.raises(ValueError):
- default.add(data=data)
+ default.set(data=data)
- def test_invalid_add_type(self,default):
+ def test_invalid_set_type(self,default):
with pytest.raises(TypeError):
- default.add(label='valid',data='invalid_type')
+ default.set(label='valid',data='invalid_type')
with pytest.raises(TypeError):
- default.add(label='valid',table='invalid_type')
+ default.set(label='valid',table='invalid_type')
- def test_invalid_add_dual(self,default):
+ def test_invalid_set_dual(self,default):
with pytest.raises(KeyError):
- default.add(label='valid',data=0,table=0)
+ default.set(label='valid',data=0,table=0)
@pytest.mark.parametrize('data_type,shape',[(float,(3,)),
(float,(3,3)),
@@ -172,31 +172,31 @@ class TestVTK:
(int,(4,)),
(str,(1,))])
@pytest.mark.parametrize('N_values',[5*6*7,6*7*8])
- def test_add_get(self,default,data_type,shape,N_values):
+ def test_set_get(self,default,data_type,shape,N_values):
data = np.squeeze(np.random.randint(0,100,(N_values,)+shape)).astype(data_type)
- new = default.add('data',data)
+ new = default.set('data',data)
assert (np.squeeze(data.reshape(N_values,-1)) == new.get('data')).all()
@pytest.mark.parametrize('shapes',[{'scalar':(1,),'vector':(3,),'tensor':(3,3)},
{'vector':(6,),'tensor':(3,3)},
{'tensor':(3,3),'scalar':(1,)}])
- def test_add_table(self,default,shapes):
+ def test_set_table(self,default,shapes):
N = np.random.choice([default.N_points,default.N_cells])
d = dict()
for k,s in shapes.items():
d[k] = dict(shape = s,
data = np.random.random(N*np.prod(s)).reshape((N,-1)))
- new = default.add(table=Table(shapes,np.column_stack([d[k]['data'] for k in shapes.keys()])))
+ new = default.set(table=Table(shapes,np.column_stack([d[k]['data'] for k in shapes.keys()])))
for k,s in shapes.items():
assert np.allclose(np.squeeze(d[k]['data']),new.get(k),rtol=1e-7)
- def test_add_masked(self,default):
+ def test_set_masked(self,default):
data = np.random.rand(5*6*7,3)
masked = ma.MaskedArray(data,mask=data<.4,fill_value=42.)
- mask_auto = default.add('D',masked)
- mask_manual = default.add('D',np.where(masked.mask,masked.fill_value,masked))
+ mask_auto = default.set('D',masked)
+ mask_manual = default.set('D',np.where(masked.mask,masked.fill_value,masked))
assert mask_manual == mask_auto
@@ -210,7 +210,7 @@ class TestVTK:
data = np.squeeze(np.random.randint(0,100,(N_values,)+shape)).astype(data_type)
ALPHABET = np.array(list(string.ascii_lowercase + ' '))
label = ''.join(np.random.choice(ALPHABET, size=10))
- new = default.add(label,data)
+ new = default.set(label,data)
if N_values == default.N_points: assert label in new.labels['Point Data']
if N_values == default.N_cells: assert label in new.labels['Cell Data']
@@ -225,7 +225,7 @@ class TestVTK:
@pytest.mark.xfail(int(vtk.vtkVersion.GetVTKVersion().split('.')[0])<8, reason='missing METADATA')
def test_compare_reference_polyData(self,update,ref_path,tmp_path):
points=np.dstack((np.linspace(0.,1.,10),np.linspace(0.,2.,10),np.linspace(-1.,1.,10))).squeeze()
- polyData = VTK.from_poly_data(points).add('coordinates',points)
+ polyData = VTK.from_poly_data(points).set('coordinates',points)
if update:
polyData.save(ref_path/'polyData')
else:
@@ -242,8 +242,8 @@ class TestVTK:
c = coords[:-1,:-1,:-1,:].reshape(-1,3,order='F')
n = coords[:,:,:,:].reshape(-1,3,order='F')
rectilinearGrid = VTK.from_rectilinear_grid(grid) \
- .add('cell',np.ascontiguousarray(c)) \
- .add('node',np.ascontiguousarray(n))
+ .set('cell',np.ascontiguousarray(c)) \
+ .set('node',np.ascontiguousarray(n))
if update:
rectilinearGrid.save(ref_path/'rectilinearGrid')
else:
diff --git a/src/Marc/include/concom2022.1 b/src/Marc/include/concom2022.1
new file mode 100644
index 000000000..86cd4440c
--- /dev/null
+++ b/src/Marc/include/concom2022.1
@@ -0,0 +1,464 @@
+! common block definition file taken from respective MSC.Marc release and reformated to free format
+!***********************************************************************
+!
+! File: concom.cmn
+!
+! MSC.Marc include file
+!
+integer &
+ iacous, iasmbl, iautth, ibear, icompl, iconj, icreep, ideva, idyn, idynt,&
+ ielas, ielcma, ielect, iform, ifour, iharm, ihcps, iheat, iheatt, ihresp,&
+ ijoule, ilem, ilnmom, iloren, inc, incext, incsub, ipass, iplres, ipois,&
+ ipoist, irpflo, ismall, ismalt, isoil, ispect, ispnow, istore, iswep, ithcrp,&
+ itherm, iupblg, iupdat, jacflg, jel, jparks, largst, lfond, loadup, loaduq,&
+ lodcor, lovl, lsub, magnet, ncycle, newtnt, newton, noshr, linear, ivscpl,&
+ icrpim, iradrt, ipshft, itshr, iangin, iupmdr, iconjf, jincfl, jpermg, jhour,&
+ isolvr, jritz, jtable, jshell, jdoubl, jform, jcentr, imini, kautth, iautof,&
+ ibukty, iassum, icnstd, icnstt, kmakmas, imethvp, iradrte, iradrtp, iupdate, iupdatp,&
+ ncycnt, marmen , idynme, ihavca, ispf, kmini, imixex, largtt, kdoela, iautofg,&
+ ipshftp, idntrc, ipore, jtablm, jtablc, isnecma, itrnspo, imsdif, jtrnspo, mcnear,&
+ imech, imecht, ielcmat, ielectt, magnett, imsdift, noplas, jtabls, jactch, jtablth,&
+ kgmsto , jpzo, ifricsh, iremkin, iremfor, ishearp, jspf, machining, jlshell, icompsol,&
+ iupblgfo, jcondir, nstcrp, nactive, ipassref, nstspnt, ibeart, icheckmpc, noline, icuring,&
+ ishrink, ioffsflg, isetoff, ioffsetm,iharmt, inc_incdat, iautspc, ibrake, icbush, istream_input,&
+ iprsinp, ivlsinp, ifirst_time,ipin_m, jgnstr_glb, imarc_return,iqvcinp, nqvceid, istpnx, imicro1,&
+ iaxisymm, jbreakglue,iglstif, jfastasm,iwear, iwearcf, imixmeth, ielcmadyn, idinout, igena_meth,&
+ magf_meth, non_assumed, iredoboudry, ioffsz0,icomplt, mesh_dual, iactrp, mgnewton, iusedens,igsigd0,&
+ iaem, icosim, inodels, nlharm, iampini, iphasetr, inonlcl, inonlct, iforminp,ispecerror,&
+ icsprg, imol, imolt, idatafit,iharmpar, inclcase, imultifreq,init_elas, ifatig, iftgmat,&
+ nchybrid, ibuckle
+dimension :: ideva(60)
+integer num_concom
+parameter(num_concom=262)
+common/marc_concom/&
+ iacous, iasmbl, iautth, ibear, icompl, iconj, icreep, ideva, idyn, idynt,&
+ ielas, ielcma, ielect, iform, ifour, iharm, ihcps, iheat, iheatt, ihresp,&
+ ijoule, ilem, ilnmom, iloren, inc, incext, incsub, ipass, iplres, ipois,&
+ ipoist, irpflo, ismall, ismalt, isoil, ispect, ispnow, istore, iswep, ithcrp,&
+ itherm, iupblg, iupdat, jacflg, jel, jparks, largst, lfond, loadup, loaduq,&
+ lodcor, lovl, lsub, magnet, ncycle, newtnt, newton, noshr, linear, ivscpl,&
+ icrpim, iradrt, ipshft, itshr, iangin, iupmdr, iconjf, jincfl, jpermg, jhour,&
+ isolvr, jritz, jtable, jshell, jdoubl, jform, jcentr, imini, kautth, iautof,&
+ ibukty, iassum, icnstd, icnstt, kmakmas, imethvp, iradrte, iradrtp, iupdate, iupdatp,&
+ ncycnt, marmen, idynme, ihavca, ispf, kmini, imixex, largtt, kdoela, iautofg,&
+ ipshftp, idntrc, ipore, jtablm, jtablc, isnecma, itrnspo, imsdif, jtrnspo, mcnear,&
+ imech, imecht, ielcmat, ielectt, magnett, imsdift, noplas, jtabls, jactch, jtablth,&
+ kgmsto , jpzo, ifricsh, iremkin, iremfor, ishearp, jspf, machining, jlshell, icompsol,&
+ iupblgfo, jcondir, nstcrp, nactive, ipassref, nstspnt, ibeart, icheckmpc, noline, icuring,&
+ ishrink, ioffsflg, isetoff, ioffsetm,iharmt, inc_incdat, iautspc, ibrake, icbush, istream_input,&
+ iprsinp, ivlsinp, ifirst_time,ipin_m, jgnstr_glb, imarc_return,iqvcinp, nqvceid, istpnx, imicro1,&
+ iaxisymm, jbreakglue,iglstif, jfastasm,iwear, iwearcf, imixmeth, ielcmadyn, idinout, igena_meth,&
+ magf_meth, non_assumed, iredoboudry, ioffsz0,icomplt, mesh_dual, iactrp, mgnewton, iusedens,igsigd0,&
+ iaem, icosim, inodels, nlharm, iampini, iphasetr, inonlcl, inonlct, iforminp,ispecerror,&
+ icsprg, imol, imolt, idatafit,iharmpar, inclcase, imultifreq,init_elas, ifatig, iftgmat,&
+ nchybrid, ibuckle
+!
+! comments of variables:
+!
+! iacous Control flag for acoustic analysis. Input data.
+! iacous=1 modal acoustic analysis.
+! iacous=2 harmonic acoustic-structural analysis.
+! iasmbl Control flag to indicate that operator matrix should be
+! recalculated.
+! iautth Control flag for AUTO THERM option.
+! ibear Control flag for bearing analysis. Input data.
+! icompl Control variable to indicate that a complex analysis is
+! being performed. Either a Harmonic analysis with damping,
+! or a harmonic electro-magnetic analysis. Input data.
+! iconj Flag for EBE conjugate gradient solver (=solver 1, retired)
+! Also used for VKI iterative solver.
+! icreep Control flag for creep analysis. Input data.
+! ideva(60) - debug print out flag
+! 1 print element stiffness matrices, mass matrix
+! 2 output matrices used in tying
+! 3 force the solution of a nonpositive definite matrix
+! 4 print info of connections to each node
+! 5 info of gap convergence, internal heat generated, contact
+! touching and separation
+! 6 nodal value array during rezoning
+! 7 tying info in CONRAD GAP option, fluid element numbers in
+! CHANNEL option
+! 8 output incremental displacements in local coord. system
+! 9 latent heat output
+! 10 stress-strain in local coord. system
+! 11 additional info on interlaminar stress
+! 12 output right hand side and solution vector
+! 13 info of CPU resources used and memory available on NT
+! 14 info of mesh adaption process, 2D outline information
+! info of penetration checking for remeshing
+! save .fem files after afmesh3d meshing
+! print local adaptivity info
+! 15 surface energy balance flag
+! 16 print info regarding pyrolysis
+! 17 print info of "streamline topology"
+! 18 print mesh data changes after remeshing
+! 19 print material flow stress data read in from *.mat file
+! if unit flag is on, print out flow stress after conversion
+! 20 print information on table input
+! 21 print out information regarding kinematic boundary conditions
+! 22 print out information regarding dist loads, point loads, film
+! and foundations
+! 23 print out information about automatic domain decomposition
+! 24 print out iteration information in SuperForm status report file
+! 25 print out information for ablation
+! 26 print out information for films - Table input
+! 27 print out the tying forces
+! 28 print out for CASI solver, convection,
+! 29 DDM single file debug printout
+! 30 print out cavity debug info
+! 31 print out welding related info
+! 32 prints categorized DDM memory usage
+! 33 print out the cutting info regarding machining feature
+! 34 print out the list of quantities which can be defined via a table
+! and for each quantity the supported independent variables
+! 35 print out detailed coupling region info
+! 36 print out solver debug info level 1 (Least Detailed)
+! 37 print out solver debug info level 1 (Medium Detailed)
+! 38 print out solver debug info level 1 (Very Detailed)
+! 39 print detailed memory allocation info
+! 40 print out marc-adams debug info
+! 41 output rezone mapping post file for debugging
+! 42 output post file after calling oprofos() for debugging
+! 43 debug printout for vcct
+! 44 debug printout for progressive failure
+! 45 print out automatically generated midside node coordinates (arecrd)
+! 46 print out message about routine and location, where the ibort is raised (ibort_inc)
+! 47 print out summary message of element variables on a
+! group-basis after all the automatic changes have been
+! made (em_ellibp)
+! 48 Automatically generate check results based on max and min vals.
+! These vals are stored in the checkr file, which is inserted
+! into the *dat file by the generate_check_results script from /marc/tools
+! 49 Automatically generate check results based on the real calculated values
+! at the sppecified check result locations.
+! These vals are stored in the checkr file, which is inserted
+! into the *dat file by the update_check_results script from /marc/tools
+! 50 generate a file containing the resistance or capacity matrix;
+! this file can be used to compare results with a reference file
+! 51 print out detailed information for segment-to-segment contact
+! 52 print out detailed relative displacement information
+! for uniaxial sliding contact
+! 53 print out detailed sliding direction information for
+! uniaxial sliding contact
+! 54 print out detailed information for edges attached to a curve
+! 55 print information related to viscoelasticity calculations
+! 56 print out detailed information for element coloring for multithreading
+! 57 print out extra overheads due to multi-threading.
+! These overhead includes (i) time and (ii) memory.
+! The memory report will be summed over all the children.
+! 58 debug output for ELSTO usage
+! 59 print out contact body forces and nodes in contact
+!
+! idyn Control flag for dynamics. Input data.
+! 1 = eigenvalue extraction and / or modal superposition
+! 2 = Newmark Beta and Single Step Houbolt (ssh with idynme=1)
+! 3 = Houbolt
+! 4 = Central difference
+! 5 = Newer central difference
+! idynt Copy of idyn at begining of increment
+! ielas Control flag for ELASTIC analysis. Input data.
+! Set by user or automatically turned on by Fourier option.
+! Implies that each load case is treated separately.
+! In Adaptive meshing analysis , forces re-analysis until
+! convergence obtained.
+! Also seriously misused to indicate no convergence.
+! = 1 elastic option with fourier analysis
+! = 2 elastic option without fourier analysis
+! =-1 no convergence in recycles or max # increments reached
+! Set to 1 if ELASTIC or SUBSTRUC parameter cards are used,
+! or if fourier option is used.
+! Then set to 2 if not fourier analysis.
+! ielcma Control flag for electromagnetic analysis. Input data.
+! ielcma = 1 Harmonic formulation
+! ielcma = 2 Transient formulation
+! ielect Control flag for electrostatic option. Input data.
+! iform Control flag indicating that contact will be performed.
+! ifour Control flag for Fourier analysis.
+! 0 = Odd and even terms.
+! 1 = symmetric (cosine) terms
+! 2 = antisymmetric (sine) terms.
+! iharm Control flag to indicate that a harmonic analysis will
+! be performed. May change between passes.
+! ihcps Control flag for coupled thermal - stress analysis.
+! iheat Control flag for heat transfer analysis. Input data.
+! iheatt Permanent control flag for heat transfer analysis.
+! Note in coupled analysis iheatt will remain as one,
+! but iheat will be zero in stress pass.
+! ihresp Control flag to indicate to perform a harmonic subincrement.
+! ijoule Control flag for Joule heating.
+! ilem Control flag to determin which vector is to be transformed.
+! Control flag to see where one is:
+! ilem = 1 - elem.f
+! ilem = 2 - initst.f
+! ilem = 3 - pressr.f
+! ilem = 3 - fstif.f
+! ilem = 4 - jflux.f
+! ilem = 4 - strass.f
+! ilem = 5 - mass.f
+! ilem = 5 - osolty.f
+! ilnmom Control flag for soil - pore pressure calculation. Input data.
+! ilnmom = 0 - perform only pore pressure calculation.
+! = 1 - couples pore pressure - displacement analysis
+! iloren Control flag for DeLorenzi J-Integral evaluation. Input data.
+! inc Increment number.
+! incext Control flag indicating that currently working on a
+! subincrement.
+! Could be due to harmonics , damping component (bearing),
+! stiffness component (bearing), auto therm creep or
+! old viscoplaticity
+! incsub Sub-increment number.
+! inonlcl control flag for nonlocal pass
+! inonlct permanent control flag for nonlocal pass
+! ipass Control flag for which part of coupled analysis.
+! ipass = -1 - reset to base values
+! ipass = 0 - do nothing
+! ipass = 1 - stress part
+! ipass = 2 - heat transfer part
+! 3 - fluid pass
+! 4 - joule heating pass
+! 5 - pore pressure pass
+! 6 - electrostatic pass
+! 7 - magnetostatic pass
+! 8 - electromagnetic pass
+! 9 - diffusion pass
+! ipass = 10 - nonlocal part
+! iplres Flag indicating that either second matrix is stored.
+! dynamic analysis - mass matrix
+! heat transfer - specific heat matrix
+! buckle - initial stress stiffness
+! ipois Control flag indicating Poisson type analysis
+! ipois = 1 for heat transfer
+! = 1 for heat transfer part of coupled
+! = 1 for bearing
+! = 1 for electrostatic
+! = 1 for magnetostatic
+! = 1 for nonlocal part
+! ipoist Permanent copy of ipois. In coupled analysis , ipois = 0
+! in stress portion, yet ipoist will still =1.
+! irpflo global flag for rigid plastic flow analysis
+! = 1 eularian formulation
+! = 2 regular formulation; rigid material present in the analysis
+! ismall control flag to indicate small displacement analysis. input data.
+! ismall = 0 - large disp included.
+! ismall = 1 - small displacement.
+! the flag is changing between passes.
+! ismalt permanent copy of ismall . in heat transfer portion of
+! coupled analysis ismall =0 , but ismalt remains the same.
+! isoil control flag indicating that soil / pore pressure
+! calculation . input data.
+! ispect control flag for response spectrum calculation. input data.
+! ispnow control flag to indicate to perform a spectrum response
+! calculation now.
+! istore store stresses flag.
+! istore = 0 in elem.f and if first pass of creep
+! convergence checking in ogetst.f
+! or harmonic analysis or thruc.f if not
+! converged.
+! iswep control flag for eigenvalue analysis.
+! iswep=1 - go do extraction process
+! ithcrp control flag for auto therm creep option. input data.
+! itherm control flag for either temperature dependent material
+! properties and/or thermal loads.
+! iupblg control flag for follower force option. input data.
+! iupdat control flag for update lagrange option for current element.
+! jacflg control flag for lanczos iteration method. input data.
+! jel control flag indicating that total load applied in
+! increment, ignore previous solution.
+! jel = 1 in increment 0
+! = 1 if elastic or fourier
+! = 1 in subincrements with elastic and adaptive
+! jparks control flag for j integral by parks method. input data.
+! largst control flag for finite strain plasticity. input data.
+! lfond control variable that indicates if doing elastic
+! foundation or film calculation. influences whether
+! this is volumetric or surface integration.
+! loadup control flag that indicates that nonlinearity occurred
+! during previous increment.
+! loaduq control flag that indicates that nonlinearity occurred.
+! lodcor control flag for switching on the residual load correction.
+! notice in input stage lodcor=0 means no loadcor,
+! after omarc lodcor=1 means no loadcor
+! lovl control flag for determining which "overlay" is to
+! be called from ellib.
+! lovl = 1 omarc
+! = 2 oaread
+! = 3 opress
+! = 4 oasemb
+! = 5 osolty
+! = 6 ogetst
+! = 7 oscinc
+! = 8 odynam
+! = 9 opmesh
+! = 10 omesh2
+! = 11 osetz
+! = 12 oass
+! = 13 oincdt
+! = 14 oasmas
+! = 15 ofluas
+! = 16 ofluso
+! = 17 oshtra
+! = 18 ocass
+! = 19 osoltc
+! = 20 orezon
+! = 21 otest
+! = 22 oeigen
+! lsub control variable to determine which part of element
+! assembly function is being done.
+! lsub = 1 - no longer used
+! = 2 - beta*
+! = 3 - cons*
+! = 4 - ldef*
+! = 5 - posw*
+! = 6 - theta*
+! = 7 - tmarx*
+! = 8 - geom*
+! magnet control flag for magnetostatic analysis. input data.
+! ncycle cycle number. accumulated in osolty.f
+! note first time through oasemb.f , ncycle = 0.
+! newtnt control flag for permanent copy of newton.
+! newton iteration type. input data.
+! newton : = 1 full newton raphson
+! 2 modified newton raphson
+! 3 newton raphson with strain correct.
+! 4 direct substitution
+! 5 direct substitution followed by n.r.
+! 6 direct substitution with line search
+! 7 full newton raphson with secant initial stress
+! 8 secant method
+! 9 full newton raphson with line search
+! noshr control flag for calculation interlaminar shears for
+! elements 22,45, and 75. input data.
+!ees
+!
+! jactch = 1 or 2 if elements are activated or deactivated
+! = 3 if elements are adaptively remeshed or rezoned
+! = 0 normally / reset to 0 when assembly is done
+! ifricsh = 0 call to fricsh in otest not needed
+! = 1 call to fricsh (nodal friction) in otest needed
+! iremkin = 0 remove deactivated kinematic boundary conditions
+! immediately - only in new input format (this is default)
+! = 1 remove deactivated kinematic boundary conditions
+! gradually - only in new input format
+! iremfor = 0 remove force boundary conditions immediately -
+! only in new input format (this is default)
+! = 1 remove force boundary conditions gradually -
+! only in new input format (this is default)
+! ishearp set to 1 if shear panel elements are present in the model
+!
+! jspf = 0 not in spf loadcase
+! > 0 in spf loadcase (jspf=1 during first increment)
+! machining = 1 if the metal cutting feature is used, for memory allocation purpose
+! = 0 (default) if no metal cutting feature required
+!
+! jlshell = 1 if there is a shell element in the mesh
+! icompsol = 1 if there is a composite solid element in the mesh
+! iupblgfo = 1 if follower force for point loads
+! jcondir = 1 if contact priority option is used
+! nstcrp = 0 (default) steady state creep flag (undocumented feature.
+! if not 0, turns off special ncycle = 0 code in radial.f)
+! nactive = number of active passes, if =1 then it's not a coupled analysis
+! ipassref = reference ipass, if not in a multiphysics pass ipass=ipassref
+! icheckmpc = value of mpc-check parameter option
+! noline = set to 1 in osolty if no line seacrh should be done in ogetst
+! icuring = set to 1 if the curing is included for the heat transfer analysis.
+! ishrink = set to 1 if shrinkage strain is included for mechancial analysis.
+! ioffsflg = 1 for small displacement beam/shell offsets
+! = 2 for large displacement beam/shell offsets
+! isetoff = 0 - do not apply beam/shell offsets
+! = 1 - apply beam/shell offsets
+! ioffsetm = min. value of offset flag
+! iharmt = 1 global flag if a coupled analysis contains an harmonic pass
+! inc_incdat = flag to record increment number of a new loadcase in incdat.f
+! iautspc = flag for AutoSPC option
+! ibrake = brake squeal in this increment
+! icbush = set to 1 if cbush elements present in model
+! istream_input = set to 1 for streaming input calling Marc as library
+! iprsinp = set to 1 if pressure input, introduced so other variables
+! such as h could be a function of pressure
+! ivlsinp = set to 1 if velocity input, introduced so other variables
+! such as h could be a function of velocity
+! ipin_m = # of beam element with PIN flag
+! jgnstr_glb = global control over pre or fast integrated composite shells
+! imarc_return = Marc return flag for streaming input control
+! iqvcimp = if non-zero, then the number of QVECT boundary conditions
+! nqvceid = number of QVECT boundary conditions, where emisivity/absorbtion id entered
+! istpnx = 1 if to stop at end of increment
+! imicro1 = 1 if micro1 interface is used
+! iaxisymm = set to 1 if axisymmetric analysis
+! jbreakglue = set to 1 if breaking glued option is used
+! iglstif = 1 if ddm and global stiffness matrix formed (sgi solver 6 or solver9)
+! jfastasm = 1 do fast assembly using SuperForm code
+! iwear = set to 1 if wear model, set to 2 if wear model and coordinates updated
+! iwearcf = set to 1 to store nodal coefficient of friction for wear calculation
+! imixmeth = set=1 then use nonlinear mixture material - allocate memory
+! ielcmadyn = flag for magnetodynamics
+! 0 - electromagnetics using newmark beta
+! 1 - transient magnetics using backward euler
+! idinout = flag to control if inside out elements should be deactivated
+! igena_meth = 0 - generalized alpha parameters depend on whether or not contact
+! is flagged (dynamic,7)
+! 10 - generalized alpha parameters are optimized for a contact
+! analysis (dynamic,8)
+! 11 - generalized alpha parameters are optimized for an analysis
+! without contact (dynamic,8)
+! magf_meth = - Method to compute force in magnetostatic - structural
+! = 1 - Virtual work method based on finite difference for the force computation
+! = 2 - Maxwell stress tensor
+! = 3 - Virtual work method based on local derivative for the force computation
+! non_assumed = 1 no assumed strain formulation (forced)
+! iredoboudry set to 1 if contact boundary needs to be recalculated
+! ioffsz0 = 1 if composite are used with reference position.ne.0
+! icomplt = 1 global flag if a coupled analysis contains an complex pass
+! mesh_dual = 1 two independent meshes are used in magnetodynamic/thermal/structural
+! one for magnetodynamic and the other for the remaining passes
+! iactrp = 1 in an analysis with global remeshing, include inactive
+! rigid bodies on post file
+! mgnewton = 1 Use full Newton Raphson iteration for magnetostatic pass
+!
+! iusedens > 0 if mass density is used in the analysis (dynamics, mass dependent loading)
+! igsigd0 = 1 set varselem(igsigd) to zero in next oasemb
+! iaem = 1 if marc is called from aem (0 - off - default)
+! icosim = 1 if marc is used in co-simulation analysis with ADAMS using the CosimEngine
+! = 2 if marc is used in co-simulation analysis with ADAMS using the ACSI interface
+! = 3 if marc is used in co-simulation analysis with scFLOW using the CosimEngine
+! = 4 if marc is used in co-simulation analysis with scFLOW and ADAMS using the CosimEngine
+! inodels = 1 nodal integration elements 239/240/241 present
+! nlharm = 0 harmonic subincrements are linear
+! = 1 harmonic subincrements are nonlinear
+! iampini = 0 amplitude of previous harmonic subinc is initial estimate (default)
+! = 1 zero amplitude is initial estimate
+! iphasetr = 1 phase transformation material model is used
+! iforminp flag indicating that contact is switched on via the CONTACT
+! option in the input file (as opposed to the case that contact
+! is switched on internally due to cyclic symmetry or model
+! section creation)
+! ispecerror = a+10*b (only for spectrum response analysis with missing mass option)
+! a=0 or a=1 (modal shape with non-zero shift)
+! b=0 or b=1 (recover with new assembly of stiffness matrix)
+! icsprg = set to 1 if spring elements present in model
+! imol Control flag for molecualr diffusion pass
+! imolt Permanent control flag for molecualr diffusion pass
+! Note in coupled analysis imolt will remain as one,
+! but imol will be zero in stress pass or thermal pass.
+! idatafit = run Marc to fit parameters
+! iharmpar = 1 if harmonic parameter option is used
+! inclcase load case increment use for cyclic plasticity data fitting
+! imultifreq flag to indicate how many harmonic magnetodynamic passes are computed in coupled
+! magnetodynamic/thermal(/structural) analyses.
+! 0 or 1 one pass 2 two passes 3 or more is not supported
+! init_elas use elastic stress-strain law as the material tangent for
+! the first cycle of an increment
+! ifatig packed integer telling which fatigue mode is active
+! 1 = elastomer
+! 10 = stress-life
+! 100 = strain-life
+! = 2 strain-life fatigue
+! iftgmat = 0 no fatigue material properties in the dat file
+! = 1 fatigue material properties in the dat file
+! nchybrid cycle count used for hybrid contact; meant to force an extra iteration
+! if the overlap for a node in hybrid contact is too large
+! ibuckle buckle parameter option is active
+!
+!***********************************************************************
+!$omp threadprivate(/marc_concom/)
+!!
diff --git a/src/Marc/include/creeps2022.1 b/src/Marc/include/creeps2022.1
new file mode 100644
index 000000000..8fa4c8401
--- /dev/null
+++ b/src/Marc/include/creeps2022.1
@@ -0,0 +1,72 @@
+! common block definition file taken from respective MSC.Marc release and reformated to free format
+!***********************************************************************
+!
+! File: creeps.cmn
+!
+! MSC.Marc include file
+!
+real(pReal) cptim,timinc,timinc_p,timinc_s,timincm,timinc_a,timinc_b
+integer icfte,icfst,icfeq,icftm,icetem,mcreep,jcreep,icpa,icftmp,icfstr,&
+ icfqcp,icfcpm,icrppr,icrcha,icpb,iicpmt,iicpa
+real(pReal) time_beg_lcase,time_beg_inc,fractol,time_beg_pst
+real(pReal) fraction_donn,timinc_ol2
+!
+integer num_creepsr,num_creepsi,num_creeps2r
+parameter(num_creepsr=7)
+parameter(num_creepsi=17)
+parameter(num_creeps2r=6)
+common/marc_creeps/cptim,timinc,timinc_p,timinc_s,timincm,timinc_a,timinc_b,icfte,icfst,&
+ icfeq,icftm,icetem,mcreep,jcreep,icpa,icftmp,icfstr,icfqcp,icfcpm,icrppr,icrcha,icpb,iicpmt,iicpa
+common/marc_creeps2/time_beg_lcase,time_beg_inc,fractol,time_beg_pst,fraction_donn,timinc_ol2
+!
+! cptim Total time at begining of increment.
+! timinc Incremental time for this step.
+! icfte Local copy number of slopes of creep strain rate function
+! versus temperature. Is -1 if exponent law used.
+! icfst Local copy number of slopes of creep strain rate function
+! versus equivalent stress. Is -1 if exponent law used.
+! icfeq Local copy number of slopes of creep strain rate function
+! versus equivalent strain. Is -1 if exponent law used.
+! icftm Local copy number of slopes of creep strain rate function
+! versus time. Is -1 if exponent law used.
+! icetem Element number that needs to be checked for creep convergence
+! or, if negative, the number of elements that need to
+! be checked. In the latter case the elements to check
+! are stored in ielcp.
+! mcreep Maximum nuber of iterations for explicit creep.
+! jcreep Counter of number of iterations for explicit creep
+! procedure. jcreep must be .le. mcreep
+! icpa(1-6) Pointer to constants in creep strain rate expression.
+! icftmp Pointer to temperature dependent creep strain rate data.
+! icfstr Pointer to equivalent stress dependent creep strain rate data.
+! icfqcp Pointer to equivalent creep strain dependent creep strain
+! rate data.
+! icfcpm Pointer to equivalent creep strain rate dependent
+! creep strain rate data.
+! icrppr Permanent copy of icreep
+! icrcha Control flag for creep convergence checking , if set to
+! 1 then testing on absolute change in stress and creep
+! strain, not relative testing. Input data.
+! icpb(1-4) Pointer to storage of material id cross reference numbers.
+! iicpmt creep law type ID
+! =1 - power law
+! =2 - solder
+! =3 - steady-creep
+! =4 - hyperbolic steady-creep
+! iicpa Pointer to table IDs for constants in creep strain rate
+! expression
+!
+!
+! time_beg_lcase time at the beginning of the current load case
+! time_beg_inc time at the beginning of the current increment
+! fractol fraction of loadcase or increment time when we
+! consider it to be finished
+! time_beg_pst time corresponding to first increment to be
+! read in from thermal post file for auto step
+!
+! timinc_old Time step of the previous increment
+!
+!***********************************************************************
+!!$omp threadprivate(/marc_creeps/)
+!!$omp threadprivate(/marc_creeps2/)
+!!