diff --git a/Makefile b/Makefile index 19cb575..c11ac7d 100644 --- a/Makefile +++ b/Makefile @@ -8,47 +8,78 @@ CPP = icx USE_CUDA = 1 USE_CVODE = 0 USE_MATLAB = 1 -COMPILE_MICROMAG = 1 +USE_MICROMAG = 1 -CVODE_ROOT= /usr/local/sundials-4.1.0/instdir +CVODE_ROOT = /usr/local/sundials-4.1.0/instdir # MATLAB_INCLUDE = /usr/local/MATLAB/R2023b/extern/include # Linux MATLAB_INCLUDE = "C:\Program Files\MATLAB\R2023b\extern\include" # Win MKL_ROOT = ${CONDA_PREFIX} # Linux - mkl # MKL_ROOT = "C:\Program Files (x86)\Intel\oneAPI\mkl\latest" # Win - mkl (oneapi) # MKL_ROOT = ${CONDA_PREFIX}/Library # Win - mkl (conda) -ifeq (${FC}, ifort) +ifeq (${FC}, ifx) ifeq ($(OS),Windows_NT) - FFLAGS = /O3 /fpp /real-size:64 /assume:nocc_omp /Qopenmp \ - /fpe:0 /fp:source /libs:static /DUSE_CVODE=${USE_CVODE} \ - /DUSE_CUDA=${USE_CUDA} /DUSE_MATLAB=${USE_MATLAB} + FFLAGS = /O3 /fpp /real-size:64 /Qopenmp /assume:nocc_omp \ + /fpe:0 /fp:source /nologo /libs:static /DUSE_CVODE=${USE_CVODE} \ + /DUSE_MATLAB=${USE_MATLAB} /DUSE_MICROMAG=${USE_MICROMAG} + + LIB_SUFFIX = .lib else FFLAGS = -O3 -fpp -real-size 64 -assume nocc_omp -qopenmp \ - -fpe0 -fp-model=source -fpic -DUSE_CVODE=${USE_CVODE} \ - -DUSE_CUDA=${USE_CUDA} -DUSE_MATLAB=${USE_MATLAB} + -fpe0 -fp-model=source -fpic -nologo -DUSE_CVODE=${USE_CVODE} \ + -DUSE_MATLAB=${USE_MATLAB} -DUSE_MICROMAG=${USE_MICROMAG} + + LIB_SUFFIX = .a endif else ifeq (${FC}, gfortran) -FFLAGS = -O3 -fdefault-real-8 -fopenmp -ffree-line-length-512 -cpp -fPIC -DUSE_CVODE=${USE_CVODE} -USE_CUDA = 0 -COMPILE_MICROMAG= 0 + FFLAGS = -O3 -fdefault-real-8 -fopenmp -ffree-line-length-512 -cpp -fPIC \ + -DUSE_CVODE=${USE_CVODE} -DUSE_MICROMAG=0 -DUSE_CVODE=${USE_CVODE} endif -ifeq ($(USE_CUDA),0) - COMPILE_CUDA = +NUM_INT_PATH = source/NumericalIntegration/NumericalIntegration +TILE_DEMAG_TENSOR_PATH = source/TileDemagTensor/TileDemagTensor +DEMAG_FIELD_PATH = source/DemagField/DemagField +MICROMAG_PATH = source/MagTenseMicroMag +FORTRAN_CUDA_PATH = source/MagTenseFortranCuda/cuda +STANDALONE_PATH = source/MagTense_StandAlone/MagTense_StandAlone +FORCEINTEGRATOR_PATH = source/MagneticForceIntegrator/MagneticForceIntegrator + +ifeq ($(USE_MICROMAG),0) + MICROMAG = + ifeq ($(OS),Windows_NT) + CP_LIB = cp ${DEMAG_FIELD_PATH}/libDemagField${LIB_SUFFIX} . + else + CP_LIB = cp ${NUM_INT_PATH}/libNumericalIntegration${LIB_SUFFIX} . + CP_LIB += && cp ${TILE_DEMAG_TENSOR_PATH}/libTileDemagTensor${LIB_SUFFIX} . + CP_LIB += && cp ${DEMAG_FIELD_PATH}/libDemagField${LIB_SUFFIX} . + endif else - COMPILE_CUDA = cuda + MICROMAG = micromagnetism + ifeq ($(OS),Windows_NT) + LIB_OPT = -llibMagTenseMicroMag + CP_LIB = cp ${MICROMAG_PATH}/libMagTenseMicroMag${LIB_SUFFIX} . + + else + LIB_OPT += -lMagTenseMicroMag + CP_LIB = cp ${NUM_INT_PATH}/libNumericalIntegration${LIB_SUFFIX} . + CP_LIB += && cp ${TILE_DEMAG_TENSOR_PATH}/libTileDemagTensor${LIB_SUFFIX} . + CP_LIB += && cp ${DEMAG_FIELD_PATH}/libDemagField${LIB_SUFFIX} . + CP_LIB += && cp ${MICROMAG_PATH}/libMagTenseMicroMag${LIB_SUFFIX} . + endif endif ifeq ($(USE_MATLAB),0) FORCEINTEGRATOR = else FORCEINTEGRATOR = forceintegrator + CP_LIB += && cp ${FORCEINTEGRATOR_PATH}/libMagneticForceIntegrator${LIB_SUFFIX} . endif -ifeq ($(COMPILE_MICROMAG),0) - MICROMAG = +ifeq ($(USE_CUDA),0) + COMPILE_CUDA = else - MICROMAG = micromagnetism + COMPILE_CUDA = cuda + CP_LIB += && cp ${FORTRAN_CUDA_PATH}/libCuda${LIB_SUFFIX} . endif #======================================================================= # Targets @@ -58,30 +89,30 @@ endif all: magnetostatic ${MICROMAG} ${COMPILE_CUDA} ${FORCEINTEGRATOR} # standalone magnetostatic: - cd source/NumericalIntegration/NumericalIntegration && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) - cd source/TileDemagTensor/TileDemagTensor && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) - cd source/DemagField/DemagField && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) + cd ${NUM_INT_PATH} && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) + cd ${TILE_DEMAG_TENSOR_PATH} && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) + cd ${DEMAG_FIELD_PATH} && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) micromagnetism: - cd source/MagTenseMicroMag && $(MAKE) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) MKL_ROOT=$(MKL_ROOT) + cd ${MICROMAG_PATH} && $(MAKE) FFLAGS="$(FFLAGS)" USE_CVODE=$(USE_CVODE) CVODE_ROOT=$(CVODE_ROOT) USE_MATLAB=$(USE_MATLAB) MATLAB_INCLUDE=$(MATLAB_INCLUDE) cuda: - cd source/MagTenseFortranCuda/cuda && $(MAKE) CPP=$(CPP) + cd ${FORTRAN_CUDA_PATH} && $(MAKE) CPP=$(CPP) forceintegrator: - cd source/MagneticForceIntegrator/MagneticForceIntegrator && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" MATLAB_INCLUDE=$(MATLAB_INCLUDE) + cd $(FORCEINTEGRATOR_PATH) && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" MATLAB_INCLUDE=$(MATLAB_INCLUDE) standalone: - cd source/MagTense_StandAlone/MagTense_StandAlone && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" + cd $(STANDALONE_PATH) && $(MAKE) FC=$(FC) FFLAGS="$(FFLAGS)" mkdir build - cp source/MagTense_StandAlone/MagTense_StandAlone/MagTense.x build/MagTense.x + cp $(STANDALONE_PATH)/MagTense.x build/MagTense.x clean: - cd source/NumericalIntegration/NumericalIntegration && make clean - cd source/TileDemagTensor/TileDemagTensor && make clean - cd source/DemagField/DemagField && make clean - cd source/MagTenseMicroMag && make clean - cd source/MagTenseFortranCuda/cuda && make clean - cd source/MagTense_StandAlone/MagTense_StandAlone && make clean - cd source/MagneticForceIntegrator/MagneticForceIntegrator && make clean - rm -r build/ + cd ${NUM_INT_PATH} && make clean + cd ${TILE_DEMAG_TENSOR_PATH} && make clean + cd ${DEMAG_FIELD_PATH} && make clean + cd ${MICROMAG_PATH} && make clean + cd ${FORTRAN_CUDA_PATH} && make clean + cd $(STANDALONE_PATH) && make clean + cd $(FORCEINTEGRATOR_PATH) && make clean + rm *${LIB_SUFFIX} diff --git a/matlab/README.md b/matlab/README.md index 4bb2aba..acc40a6 100644 --- a/matlab/README.md +++ b/matlab/README.md @@ -36,13 +36,13 @@ If you want to compile MagTense with a Visual Studio project file for Windows, [ [ Linux ] `/usr/local/sundials-4.1.0/instdir` - A guide for custom installation of sundials-4.1.0 from this repository can be found [here].(#install-cvode-from-sundials-4.1.0) + A guide for custom installation of sundials-4.1.0 from this repository can be found [here](#install-cvode-from-sundials-4.1.0). **Note:** Shared libraries for Fortran modules are not distributed in conda package of [sundials](https://anaconda.org/conda-forge/sundials). CVODE has to be built beforehand locally when linked dynamically. During runtime, path has to be added to LD_LIBRARY_PATH on Linux. ### Compilation -Prepare your terminal, so that ifort compiler can be found: +Prepare your terminal, so that ifx compiler can be found: - [ Windows] @@ -60,12 +60,12 @@ Set flags and paths in [Makefile](https://github.com/cmt-dtu-energy/MagTense/blo ```bash cd path/to/MagTense/ -make USE_CUDA=1 USE_CVODE=1 USE_MATLAB=1 CVODE_ROOT=/usr/local/sundials-4.1.0/instdir MATLAB_INCLUDE=/usr/local/MATLAB/R2021b/extern/include MKL_ROOT=/opt/intel/oneapi/mkl/latest +make USE_CUDA=1 USE_CVODE=1 USE_MATLAB=1 CVODE_ROOT=/usr/local/sundials-4.1.0/instdir MATLAB_INCLUDE=/usr/local/MATLAB/R2023b/extern/include MKL_ROOT=/opt/intel/oneapi/mkl/latest ``` ## Building MEX-files -Prepare your terminal, so that ifort compiler can be found: +Prepare your terminal, so that `ifx` compiler can be found: - [ Windows] @@ -81,27 +81,16 @@ Prepare your terminal, so that ifort compiler can be found: . /opt/intel/oneapi/setvars.sh ``` - For static linking of MKL, the file `mex_FORTRAN_glnxa64.xml` located in `/home//.matlab/R2021b/` has to be adjusted as follows: - - ```bash - LINKLIBS="[...] -Wl,--start-group" - CMDLINE2="$LDF $LDFLAGS $LDTYPE $LINKOPTIM $LINKEXPORTVER $OBJS $FLIBS $LINKLIBS -Wl,--end-group -o $EXE" - ``` - - The reason for that is that Matlab recognizes `-Wl,--end-group` as `Error: Illegal use of reserved keyword "end".`, when running the build script. - - Start Matlab via command line and run build script: ```bash -cd path/to/MagTense/matlab -/usr/local/MATLAB/R2021b/bin/matlab -nodisplay -nosplash -nodesktop -run('buildMagTenseMEX.m') +/usr/local/MATLAB/R2023b/bin/matlab -nodisplay -nosplash -nodesktop +run('matlab/buildMagTenseMEX.m') ``` ## Runtime -Prepare your terminal, so that ifort compiler and required libraries can be found: +Prepare your terminal, so that `ifx` compiler and required libraries can be found: - [ Linux ] @@ -110,14 +99,13 @@ Prepare your terminal, so that ifort compiler and required libraries can be foun export LD_LIBRARY_PATH=::$LD_LIBRARY_PATH ``` - When MKL is statically linked, having [Runtime for IntelĀ® Fortran Compiler](https://anaconda.org/intel/intel-fortran-rt) is sufficient and no installation of `ifort` or `mkl` is required. + When MKL is statically linked, having [Runtime for IntelĀ® Fortran Compiler](https://anaconda.org/intel/intel-fortran-rt) is sufficient and no installation of `ifx` or `mkl` is required. - Test with standard problem #3 ```bash - cd path/to/MagTense/matlab/ - /usr/local/MATLAB/R2021b/bin/matlab -nodisplay -nosplash -nodesktop - run('examples/Micromagnetism/mumag_micromag_Std_problem_3/Standard_problem_3.m') + /usr/local/MATLAB/R2023b/bin/matlab -nodisplay -nosplash -nodesktop + run('matlab/examples/Micromagnetism/mumag_micromag_Std_problem_3/Standard_problem_3.m') ``` ## Install CVODE from sundials-4.1.0 diff --git a/matlab/buildMagTenseMEX.m b/matlab/buildMagTenseMEX.m index 31bb658..d764db6 100644 --- a/matlab/buildMagTenseMEX.m +++ b/matlab/buildMagTenseMEX.m @@ -3,7 +3,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE) arguments USE_RELEASE {mustBeNumericOrLogical} = true; - USE_CUDA {mustBeNumericOrLogical} = true; + USE_CUDA {mustBeNumericOrLogical} = false; USE_CVODE {mustBeNumericOrLogical} = true; end @@ -29,10 +29,10 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE) else VS_STUDIO = false; MKL_STATIC = false; - compiler_root = '/opt/intel/oneapi/compiler/latest'; - mkl_root = '/opt/intel/oneapi/mkl/latest'; - mkl_lib = '/opt/intel/oneapi/mkl/latest/lib/intel64'; - cuda_root = '/usr/local/cuda-12.3/lib64/'; + compiler_root = '/home/spol/miniconda3/envs/magtense-env-py12'; + mkl_root = '/home/spol/miniconda3/envs/magtense-env-py12'; + mkl_lib = '/home/spol/miniconda3/envs/magtense-env-py12/lib'; + cuda_root = '/home/spol/miniconda3/envs/magtense-env-py12/lib'; cvode_include = '/usr/local/sundials-4.1.0/instdir/fortran'; cvode_lib = '/usr/local/sundials-4.1.0/instdir/lib'; mex_suffix = 'a'; @@ -62,8 +62,9 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE) if (USE_CVODE) CVODE_include = join(['-I' cvode_include], ''); - CVODE = ['-L' cvode_lib ' -lsundials_nvecserial -lsundials_sunmatrixdense -lsundials_sunlinsoldense' ... - ' -lsundials_fnvecserial_mod -lsundials_cvode -lsundials_fsunnonlinsolfixedpoint_mod']; + CVODE = ['LINKLIBS="$LINKLIBS ' cvode_lib '/libsundials_nvecserial.a ' cvode_lib '/libsundials_sunmatrixdense.a ' ... + cvode_lib '/libsundials_sunlinsoldense.a ' cvode_lib '/libsundials_fnvecserial_mod.a ' ... + cvode_lib '/libsundials_cvode.a ' cvode_lib '/libsundials_fsunnonlinsolfixedpoint_mod.a"']; else CVODE_include = ''; CVODE = ''; @@ -82,7 +83,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE) if (ispc) DEFINES = '-R2018a'; - FFLAGS = 'COMPFLAGS="$COMPFLAGS /free /O3 /fpp /real-size:64 /Qopenmp /assume:nocc_omp /fpe:0 /fp:source"'; + FFLAGS = 'COMPFLAGS="$COMPFLAGS /free /O3 /fpp /real-size:64 /Qopenmp /assume:nocc_omp /fpe:0 /fp:source /nologo"'; if (USE_CUDA) FFLAGS = [FFLAGS(1:(end-1)) ' /libs:static"']; end @@ -98,7 +99,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE) MKL = ['-L' mkl_lib ' -lmkl_rt -lmkl_blas95_lp64']; end else - DEFINES = ['FC="' compiler_root '/bin/ifort" DEFINES="-DMATLAB_DEFAULT_RELEASE=R2018a"']; + DEFINES = ['FC="' compiler_root '/bin/ifx" DEFINES="-DMATLAB_DEFAULT_RELEASE=R2018a"']; INCLUDE = ['INCLUDE="$INCLUDE -I' mkl_root '/include -I' NumericalIntegration_path ' -I' DemagField_path ... ' -I' TileDemagTensor_path ' -I' MagTenseMicroMag_path ' -I' ForceIntegrator_path ' -I' mkl_root]; LIBS = ['-L' MagTenseMicroMag_path ' -lMagTenseMicroMag -L' DemagField_path ' -lDemagField -L' ... @@ -110,7 +111,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE) '/libmkl_core.a ' mkl_lib '/libmkl_blas95_lp64.a ' mkl_lib '/libmkl_intel_lp64.a"']; INCLUDE = [INCLUDE '/include/intel64/lp64 ']; else - MKL = ['-L' mkl_root '/lib/intel64 -lmkl_rt -lpthread -lm -ldl ']; + MKL = ['-L' mkl_lib ' -lmkl_rt -lpthread -lm -ldl ']; if (USE_CUDA) INCLUDE = [INCLUDE '/include/intel64/lp64 ']; MKL = [MKL '-lmkl_blas95_lp64']; @@ -121,7 +122,7 @@ function buildMagTenseMEX(USE_RELEASE, USE_CUDA, USE_CVODE) end end INCLUDE = [INCLUDE CVODE_include '"']; - FFLAGS = [FFLAGS '-O3 -fpp -real-size 64 -qopenmp -assume nocc_omp -fpe0 -fp-model=source -fpic -diag-disable 10006"']; + FFLAGS = [FFLAGS '-O3 -fpp -real-size 64 -qopenmp -assume nocc_omp -fpe0 -fp-model=source -fpic -nologo -diag-disable 10006"']; end %%------------------------------------------------------------------ diff --git a/python/README.md b/python/README.md index 300f80e..ccecc24 100644 --- a/python/README.md +++ b/python/README.md @@ -16,9 +16,9 @@ For MacOS ARM architectures, currently only magnetostatics with the `gfortran` c conda create -y -n magtense-env conda activate magtense-env conda config --env --add channels conda-forge + conda install -y python conda config --env --add channels nvidia/label/cuda-12.6.3 conda config --env --add channels https://software.repos.intel.com/python/conda/ - conda install -y python conda install -y numpy matplotlib meson charset-normalizer ncurses git notebook h5py tqdm ``` diff --git a/python/src/magtense/lib/Makefile b/python/src/magtense/lib/Makefile index 1514917..1223855 100644 --- a/python/src/magtense/lib/Makefile +++ b/python/src/magtense/lib/Makefile @@ -85,15 +85,6 @@ ifeq ($(USE_MKL),0) MKL = endif -ifeq (${USE_CVODE},0) - CVODE = - CVODE_OPT = -else - CVODE = -L${CVODE_ROOT}/lib -lsundials_nvecserial -lsundials_sunmatrixdense \ - -lsundials_sunlinsoldense -lsundials_fnvecserial_mod -lsundials_cvode \ - -lsundials_fsunnonlinsolfixedpoint_mod - CVODE_OPT = -I${CVODE_ROOT}/fortran -endif ifeq ($(USE_MICROMAG),0) MICROMAG = @@ -191,7 +182,7 @@ clean_build: ${CLEAN_FOLDER} magnetostatic: - cd ${NUM_INT_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}' CVODE_OPT=${CVODE_OPT} USE_MATLAB=0 + cd ${NUM_INT_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}' USE_CVODE=${USE_CVODE} CVODE_ROOT=${CVODE_ROOT} USE_MATLAB=0 cd ${TILE_DEMAG_TENSOR_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}' cd ${DEMAG_FIELD_PATH} && ${MAKE} FC=${FC} FFLAGS='${FFLAGS}' USE_MATLAB=0