diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 58da1db1d..5fdd9869c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,29 +46,18 @@ variables: # Names of module files to load # =============================================================================================== # ++++++++++++ Compiler +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - IntelCompiler19_1: "Compiler/Intel/19.1.2 Libraries/IMKL/2020" - GNUCompiler10: "Compiler/GNU/10" - # ------------ Defaults ---------------------------------------------- - IntelCompiler: "$IntelCompiler19_1" - GNUCompiler: "$GNUCompiler10" + IntelCompiler: "Compiler/Intel/19.1.2 Libraries/IMKL/2020" + GNUCompiler: "Compiler/GNU/10" # ++++++++++++ MPI ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - IMPI2020Intel19_1: "MPI/Intel/19.1.2/IntelMPI/2019" - OMPI4_0GNU10: "MPI/GNU/10/OpenMPI/4.0.5" - # ------------ Defaults ---------------------------------------------- - MPI_Intel: "$IMPI2020Intel19_1" - MPI_GNU: "$OMPI4_0GNU10" + MPI_Intel: "MPI/Intel/19.1.2/IntelMPI/2019" + MPI_GNU: "MPI/GNU/10/OpenMPI/4.1.1" # ++++++++++++ PETSc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - PETSc3_14_2IMPI2020Intel19_1: "Libraries/PETSc/3.14.2/Intel-19.1.2-IntelMPI-2019" - PETSc3_14_2OMPI4_0GNU10: "Libraries/PETSc/3.14.2/GNU-10-OpenMPI-4.0.5" - # ------------ Defaults ---------------------------------------------- - PETSc_Intel: "$PETSc3_14_2IMPI2020Intel19_1" - PETSc_GNU: "$PETSc3_14_2OMPI4_0GNU10" - # ++++++++++++ commercial FEM ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - MSC2021: "FEM/MSC/2021.2" - # ------------ Defaults ---------------------------------------------- - MSC: "$MSC2021" - IntelMarc: "$IntelCompiler19_1" - HDF5Marc: "HDF5/1.12.0/Intel-19.1.2" + PETSc_Intel: "Libraries/PETSc/3.16.1/Intel-19.1.2-IntelMPI-2019" + PETSc_GNU: "Libraries/PETSc/3.16.1/GNU-10-OpenMPI-4.1.1" + # ++++++++++++ MSC Marc +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + MSC: "FEM/MSC/2021.2" + IntelMarc: "Compiler/Intel/19.1.2 Libraries/IMKL/2020" + HDF5Marc: "HDF5/1.12.1/Intel-19.1.2" ################################################################################################### checkout: @@ -92,7 +81,7 @@ checkout: - release ################################################################################################### -processing: +pytest: stage: python script: - cd $DAMASKROOT/python @@ -102,6 +91,15 @@ processing: - master - release +mypy: + stage: python + script: + - cd $DAMASKROOT/python + - mypy -m damask + except: + - master + - release + ################################################################################################### compile_grid_Intel: diff --git a/CMakeLists.txt b/CMakeLists.txt index 856b430cd..56416d0fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,117 +1,117 @@ -cmake_minimum_required (VERSION 3.12.0) -include (FindPkgConfig REQUIRED) +cmake_minimum_required(VERSION 3.12.0) +include(FindPkgConfig REQUIRED) -if (DEFINED ENV{PETSC_DIR}) - message ("PETSC_DIR:\n$ENV{PETSC_DIR}\n") -else () - message (FATAL_ERROR "PETSc location (PETSC_DIR) is not defined") -endif () +if(DEFINED ENV{PETSC_DIR}) + message("PETSC_DIR:\n$ENV{PETSC_DIR}\n") +else() + message(FATAL_ERROR "PETSc location (PETSC_DIR) is not defined") +endif() # Dummy project to determine compiler names and version -project (Prerequisites LANGUAGES) +project(Prerequisites LANGUAGES) set(ENV{PKG_CONFIG_PATH} "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/pkgconfig") -pkg_check_modules (PETSC REQUIRED PETSc>=3.12.0 PETSc<3.17.0) -pkg_get_variable (CMAKE_Fortran_COMPILER PETSc fcompiler) -pkg_get_variable (CMAKE_C_COMPILER PETSc ccompiler) +pkg_check_modules(PETSC REQUIRED PETSc>=3.12.0 PETSc<3.17.0) +pkg_get_variable(CMAKE_Fortran_COMPILER PETSc fcompiler) +pkg_get_variable(CMAKE_C_COMPILER PETSc ccompiler) # Solver determines name of project string(TOUPPER "${DAMASK_SOLVER}" DAMASK_SOLVER) -if (DAMASK_SOLVER STREQUAL "GRID") - project (damask-grid HOMEPAGE_URL https://damask.mpie.de LANGUAGES Fortran C) -elseif (DAMASK_SOLVER STREQUAL "MESH") - project (damask-mesh HOMEPAGE_URL https://damask.mpie.de LANGUAGES Fortran C) -else () - message (FATAL_ERROR "Invalid solver: DAMASK_SOLVER=${DAMASK_SOLVER}") -endif () -add_definitions ("-D${DAMASK_SOLVER}") +if(DAMASK_SOLVER STREQUAL "GRID") + project(damask-grid HOMEPAGE_URL https://damask.mpie.de LANGUAGES Fortran C) +elseif(DAMASK_SOLVER STREQUAL "MESH") + project(damask-mesh HOMEPAGE_URL https://damask.mpie.de LANGUAGES Fortran C) +else() + message(FATAL_ERROR "Invalid solver: DAMASK_SOLVER=${DAMASK_SOLVER}") +endif() +add_definitions("-D${DAMASK_SOLVER}") -file (STRINGS ${PROJECT_SOURCE_DIR}/VERSION DAMASK_VERSION) +file(STRINGS ${PROJECT_SOURCE_DIR}/VERSION DAMASK_VERSION) -message ("\nBuilding ${CMAKE_PROJECT_NAME} ${DAMASK_VERSION}\n") +message("\nBuilding ${CMAKE_PROJECT_NAME} ${DAMASK_VERSION}\n") -add_definitions (-DPETSC) -add_definitions (-DDAMASKVERSION="${DAMASK_VERSION}") -add_definitions (-DCMAKE_SYSTEM="${CMAKE_SYSTEM}") +add_definitions(-DPETSC) +add_definitions(-DDAMASKVERSION="${DAMASK_VERSION}") +add_definitions(-DCMAKE_SYSTEM="${CMAKE_SYSTEM}") -if (CMAKE_BUILD_TYPE STREQUAL "") - set (CMAKE_BUILD_TYPE "RELEASE") -endif () +if(CMAKE_BUILD_TYPE STREQUAL "") + set(CMAKE_BUILD_TYPE "RELEASE") +endif() string(TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE) # Predefined sets for OPTIMIZATION/OPENMP based on BUILD_TYPE -if (CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") - set (DEBUG_FLAGS "${DEBUG_FLAGS} -DDEBUG") - set (PARALLEL "OFF") - set (OPTI "OFF") -elseif (CMAKE_BUILD_TYPE STREQUAL "RELEASE") - set (PARALLEL "ON") - set (OPTI "DEFENSIVE") -elseif (CMAKE_BUILD_TYPE STREQUAL "DEBUGRELEASE") - set (DEBUG_FLAGS "${DEBUG_FLAGS} -DDEBUG") - set (PARALLEL "ON") - set (OPTI "DEFENSIVE") -elseif (CMAKE_BUILD_TYPE STREQUAL "PERFORMANCE") - set (PARALLEL "ON") - set (OPTI "AGGRESSIVE") -else () - message (FATAL_ERROR "Invalid build type: CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") -endif () +if(CMAKE_BUILD_TYPE STREQUAL "DEBUG" OR CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") + set(DEBUG_FLAGS "${DEBUG_FLAGS} -DDEBUG") + set(PARALLEL "OFF") + set(OPTI "OFF") +elseif(CMAKE_BUILD_TYPE STREQUAL "RELEASE") + set(PARALLEL "ON") + set(OPTI "DEFENSIVE") +elseif(CMAKE_BUILD_TYPE STREQUAL "DEBUGRELEASE") + set(DEBUG_FLAGS "${DEBUG_FLAGS} -DDEBUG") + set(PARALLEL "ON") + set(OPTI "DEFENSIVE") +elseif(CMAKE_BUILD_TYPE STREQUAL "PERFORMANCE") + set(PARALLEL "ON") + set(OPTI "AGGRESSIVE") +else() + message(FATAL_ERROR "Invalid build type: CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") +endif() # $OPTIMIZATION takes precedence over $BUILD_TYPE defaults -if (OPTIMIZATION STREQUAL "" OR NOT DEFINED OPTIMIZATION) - set (OPTIMIZATION "${OPTI}") -else () - set (OPTIMIZATION "${OPTIMIZATION}") -endif () +if(OPTIMIZATION STREQUAL "" OR NOT DEFINED OPTIMIZATION) + set(OPTIMIZATION "${OPTI}") +else() + set(OPTIMIZATION "${OPTIMIZATION}") +endif() # $OPENMP takes precedence over $BUILD_TYPE defaults -if (OPENMP STREQUAL "" OR NOT DEFINED OPENMP) - set (OPENMP "${PARALLEL}") -else () +if(OPENMP STREQUAL "" OR NOT DEFINED OPENMP) + set(OPENMP "${PARALLEL}") +else() set(OPENMP "${OPENMP}") -endif () +endif() -# syntax check only (mainly for pre-receive hook) -if (CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") - set (BUILDCMD_POST "${BUILDCMD_POST} -fsyntax-only") -endif () +# syntax check only(mainly for pre-receive hook) +if(CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") + set(BUILDCMD_POST "${BUILDCMD_POST} -fsyntax-only") +endif() list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") - include (Compiler-Intel) +if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") + include(Compiler-Intel) elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") - include (Compiler-GNU) -else () - message (FATAL_ERROR "Compiler type (CMAKE_Fortran_COMPILER_ID) not recognized") -endif () + include(Compiler-GNU) +else() + message(FATAL_ERROR "Compiler type(CMAKE_Fortran_COMPILER_ID) not recognized") +endif() -file (STRINGS "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/petsc/conf/petscvariables" PETSC_EXTERNAL_LIB REGEX "PETSC_WITH_EXTERNAL_LIB = .*$?") -string (REGEX MATCHALL "-[lLW]([^\" ]+)" PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB}") -list (REMOVE_DUPLICATES PETSC_EXTERNAL_LIB) -string (REPLACE ";" " " PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB}") -message ("PETSC_EXTERNAL_LIB:\n${PETSC_EXTERNAL_LIB}\n") +file(STRINGS "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/petsc/conf/petscvariables" PETSC_EXTERNAL_LIB REGEX "PETSC_WITH_EXTERNAL_LIB = .*$?") +string(REGEX MATCHALL "-[lLW]([^\" ]+)" PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB}") +list(REMOVE_DUPLICATES PETSC_EXTERNAL_LIB) +string(REPLACE ";" " " PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB}") +message("PETSC_EXTERNAL_LIB:\n${PETSC_EXTERNAL_LIB}\n") -file (STRINGS "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/petsc/conf/petscvariables" PETSC_INCLUDES REGEX "PETSC_FC_INCLUDES = .*$?") -string (REGEX MATCHALL "-I([^\" ]+)" PETSC_INCLUDES "${PETSC_INCLUDES}") -list (REMOVE_DUPLICATES PETSC_INCLUDES) -string (REPLACE ";" " " PETSC_INCLUDES "${PETSC_INCLUDES}") -message ("PETSC_INCLUDES:\n${PETSC_INCLUDES}\n") +file(STRINGS "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/petsc/conf/petscvariables" PETSC_INCLUDES REGEX "PETSC_FC_INCLUDES = .*$?") +string(REGEX MATCHALL "-I([^\" ]+)" PETSC_INCLUDES "${PETSC_INCLUDES}") +list(REMOVE_DUPLICATES PETSC_INCLUDES) +string(REPLACE ";" " " PETSC_INCLUDES "${PETSC_INCLUDES}") +message("PETSC_INCLUDES:\n${PETSC_INCLUDES}\n") -set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${BUILDCMD_PRE} ${OPENMP_FLAGS} ${STANDARD_CHECK} ${OPTIMIZATION_FLAGS} ${COMPILE_FLAGS} ${PRECISION_FLAGS}") -set (CMAKE_Fortran_LINK_EXECUTABLE "${BUILDCMD_PRE} ${CMAKE_Fortran_COMPILER} ${OPENMP_FLAGS} ${OPTIMIZATION_FLAGS} ${LINKER_FLAGS}") +set(CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${BUILDCMD_PRE} ${OPENMP_FLAGS} ${STANDARD_CHECK} ${OPTIMIZATION_FLAGS} ${COMPILE_FLAGS} ${PRECISION_FLAGS}") +set(CMAKE_Fortran_LINK_EXECUTABLE "${BUILDCMD_PRE} ${CMAKE_Fortran_COMPILER} ${OPENMP_FLAGS} ${OPTIMIZATION_FLAGS} ${LINKER_FLAGS}") -if (CMAKE_BUILD_TYPE STREQUAL "DEBUG") - set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}} ${DEBUG_FLAGS}") - set (CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} ${DEBUG_FLAGS}") -endif () +if(CMAKE_BUILD_TYPE STREQUAL "DEBUG") + set(CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}} ${DEBUG_FLAGS}") + set(CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} ${DEBUG_FLAGS}") +endif() -set (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}} ${PETSC_INCLUDES} ${BUILDCMD_POST}") -set (CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} -o ${PETSC_EXTERNAL_LIB} -lz ${BUILDCMD_POST}") +set(CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE} "${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}} ${PETSC_INCLUDES} ${BUILDCMD_POST}") +set(CMAKE_Fortran_LINK_EXECUTABLE "${CMAKE_Fortran_LINK_EXECUTABLE} -o ${PETSC_EXTERNAL_LIB} -lz ${BUILDCMD_POST}") -message ("Fortran Compiler Flags:\n${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}}\n") -message ("C Compiler Flags:\n${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}\n") -message ("Fortran Linker Command:\n${CMAKE_Fortran_LINK_EXECUTABLE}\n") +message("Fortran Compiler Flags:\n${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}}\n") +message("C Compiler Flags:\n${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}\n") +message("Fortran Linker Command:\n${CMAKE_Fortran_LINK_EXECUTABLE}\n") # location of code -add_subdirectory (src) +add_subdirectory(src) diff --git a/PRIVATE b/PRIVATE index fabe69749..532cfadc1 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit fabe69749425e8a7aceb3b7c2758b40d97d8b809 +Subproject commit 532cfadc1fda4f0f7f6a993e2bd029f14a50668f diff --git a/examples/Marc/material.yaml b/examples/Marc/material.yaml index bebd5dd81..c0a7be647 100644 --- a/examples/Marc/material.yaml +++ b/examples/Marc/material.yaml @@ -24,8 +24,403 @@ phase: xi_inf_sl: [63.e+6] material: - - homogenization: SX - constituents: - - phase: Aluminum + - constituents: + - O: [0.31638628373524325, 0.4606971763404367, -0.25136671882289513, 0.7902357900300152] + phase: Aluminum v: 1.0 - O: [0.9330127018922194, 0.25, 0.06698729810778066, 0.25] + homogenization: SX + - constituents: + - O: [0.17926942151539643, -0.8129164299504208, -0.5453207208299451, -0.09825814907531387] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.11156578191572807, -0.4904242197947781, -0.8051447086471791, 0.3142915192646224] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.050875167730042026, -0.4676541613791777, -0.3231762099798638, -0.8211385022980162] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5736388730744205, 0.030011807121272376, 0.1793738934298104, -0.7986630961094017] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.3524596363123286, 0.8260984090345517, 0.4361208241824434, 0.05596650851705724] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.1475195192105493, -0.2681290123533707, -0.8885681859138441, -0.3417475722928759] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.3878621882257487, -0.4133490094014299, -0.5962575110690821, 0.5684914246189594] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.44765430421636465, 0.1688301032261743, 0.5590033642770855, 0.6772128608407416] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.3154783988579777, -0.893128078628195, 0.126738882437621, 0.294504449369408] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.01177697706652547, -0.8423157700616575, 0.4660610852557732, -0.2704672089677829] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.6023412506865766, 0.33897759335409144, -0.587639839755177, 0.42066450724741294] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.1457746940340264, 0.33010317541439926, 0.7204157567665017, 0.592269169857055] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.10885124011262147, 0.38223867611365064, -0.5398450127934588, -0.7420325896959369] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.3329465044039982, 0.005520408719519113, 0.4218135102429913, 0.843320527954356] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.2773927866814888, 0.282254093261412, -0.9094550709020325, -0.12758268983226237] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.22508894523834683, 0.3481870269276267, -0.6119961977184769, -0.673469683793499] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.7972172843203117, -0.42474780085647684, -0.2632560619322889, 0.3387183979420616] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.1856727896017474, 0.5407410320424911, 0.8064864929236231, 0.15067942194898976] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.35572128347826554, -0.21063165012009927, 0.7164748021511587, -0.561925737380588] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.951689791582057, -0.18424932026485139, 0.24330606914616992, 0.03377699360630425] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.7518830912041409, -0.6350086418080308, 0.03666967302842633, -0.17346808660504054] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.45893176203555247, -0.10107069709110554, -0.8532524342056044, -0.22611199770616278] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.6863555826979106, 0.7132418012703317, -0.12068837363804946, -0.07507638436064179] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5031196491913161, 0.7534072343296819, -0.418000862383123, 0.0672565008327974] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5354367280219723, 0.1489275079865293, -0.5066200327507001, 0.6591390218047527] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.7481103019200436, -0.6384221488364733, 0.14256832672505068, -0.11145585785834745] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.02565565294273664, 0.5032076562445432, -0.10524431346049941, -0.8573490984734187] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.09677483527453862, 0.42211465960588607, 0.39550590793620377, -0.8099561236208737] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5682732488475628, -0.018709507415836685, 0.5596636589678777, 0.6029030252098423] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.520651625785196, 0.5331055583395244, -0.1753591314180096, 0.6434046341634921] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.7323990700263593, 0.5135195038892626, -0.28947480564659256, -0.34072519461542217] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.2379144266672964, 0.9451799147482833, -0.022386636015155, 0.2225544716870999] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.6929401940723844, 0.6921675787458842, 0.04806193711709397, 0.196030560302569] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.114679536930033, -0.02786128070118354, -0.2458076367959361, -0.9621075607955694] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5536359330028813, 0.3398797644491804, 0.6552731815916284, -0.3854686198548249] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.9501825140749718, -0.17348508997627773, -0.023693401768133945, 0.2578657329207251] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5269902873788485, -0.38600076480335854, 0.7335400729523406, -0.18762624537269798] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.16353281877366127, -0.8502634877258836, 0.2921682908502614, -0.4061363175656595] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.2506727462997232, 0.38078481221063915, -0.8812340677720474, -0.12487040822466101] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.53797656304294, 0.04453446570800863, -0.73466834243862, -0.41092618023082744] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5147765687773858, -0.012009003671292302, 0.8506194553313438, -0.10633630744205957] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.45770418863630163, 0.46122438992768267, -0.5413625109006552, 0.5335780820385708] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.12028049877433303, 0.5509971760365859, 0.5424247126754088, 0.6226637493007807] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.1208751835697386, -0.11646202949704858, 0.1842663733100575, -0.9684377570859003] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.24961872240151486, 0.29610154171987574, -0.885460753706652, 0.2568533123457741] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.4494732523235404, 0.8130366919200476, -0.22342614248113637, -0.2950015116798619] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.3566054427707518, 0.6009999195769142, 0.6204413194609187, 0.35592727341468655] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.041340362458678996, -0.7766310224212297, -0.446615292586641, 0.4423460295656439] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.3143906305984617, 0.637462215667549, -0.06250872515926072, -0.7006376483369167] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.15960096982054908, 0.0154505822997579, -0.6938445646590042, 0.7020459600568152] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.10937013835716297, 0.005361991476876583, 0.07892487169799395, -0.9908482661389645] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.5566919673747123, 0.12234937037008195, 0.03295758799282205, 0.8209984667611823] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.03242357741517866, -0.1003019572329824, -0.25727891603352054, -0.9605705535604615] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.07439180141351488, 0.222039714860086, 0.9710557663706901, 0.04706297382800665] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.386406745139845, -0.3485065110202708, 0.0213726326755233, -0.8536839284298527] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.9148730990764601, 0.0859699947503276, -0.2653710064737939, 0.29188114278237975] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.05351534255347124, -0.47484306303499174, -0.4424245873225889, -0.7588943655946909] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.1850990827256794, -0.7850365894615515, 0.5790701003651098, 0.11888524569444774] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.2293488176462691, 0.8155102586104775, 0.36252844203460916, -0.3884781418063178] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.6824605981608404, -0.07237666863890763, 0.6154543161215582, 0.38758887311431783] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.7240310183899645, -0.1492281437355668, -0.5793271457602446, 0.3433512832533411] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.4130306435878869, -0.08991141120131982, -0.8934593257803132, 0.15182904455126872] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.9217038188689652, -0.2551303946186847, 0.2760910380891145, 0.09562578475994342] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.49248590418849286, 0.7555385277692129, 0.01782522408264428, -0.4316264920256593] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.288763491302084, 0.26595000602129804, -0.8721581902166229, 0.29193549223478765] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.18741690177717063, -0.959586229086916, -0.01605960190298382, -0.2093114021302156] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.6141655879532604, 0.44351951295059505, 0.35530824864623534, 0.5475829806066271] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.2814752417920179, 0.7638077896809081, -0.5255180392616715, 0.24738661865884956] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.16603578951305883, -0.6913575628365758, -0.6767106315334661, -0.1911009107226411] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.7317089905438434, -0.4610621713555634, -0.01149547471101715, -0.5018879171322728] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.12911750380868442, -0.775968622433847, -0.5524437669202766, -0.27569412688569794] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.18347252569039887, -0.3000323311682173, -0.9120086722006003, -0.21108911483411225] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.2453327661435727, -0.041601186144862225, -0.967732952958631, 0.039675016391321906] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.9885220121542625, 0.08409037295425872, -0.06115390693360882, -0.1096049284004023] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.3506668690363713, 0.8300197131399097, 0.3314704911076744, -0.2796915019878287] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.43424700094705143, -0.6863040633023977, -0.3990882505417852, -0.4256111407642043] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.09516090822469872, -0.09694359326006573, 0.7244026181255996, -0.6758603318174947] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.6299976256081414, -0.6188326478138776, 0.4105304204739873, 0.22718697056217957] + phase: Aluminum + v: 1.0 + homogenization: SX + - constituents: + - O: [0.1624065072613073, -0.6001819140771016, 0.5096769212668724, -0.5946723739521216] + phase: Aluminum + v: 1.0 + homogenization: SX diff --git a/examples/Marc/sheet_r-value.dat b/examples/Marc/r-value_texture.dat similarity index 55% rename from examples/Marc/sheet_r-value.dat rename to examples/Marc/r-value_texture.dat index 176bd34eb..e8e77a1e6 100644 --- a/examples/Marc/sheet_r-value.dat +++ b/examples/Marc/r-value_texture.dat @@ -1,5 +1,5 @@ -title r-value -$....MARC input file produced by Marc Mentat 2019 (64bit) +title R-Wert +$....MARC input file produced by Marc Mentat 2021.2 (64bit) $................................... $....input file using extended precision extended @@ -7,11 +7,11 @@ $................................... sizing 0 80 165 0 alloc 25 elements 7 -version 14 1 0 1 +version 15 1 0 1 table 0 0 2 1 1 0 0 1 processor 1 1 1 0 $no list -large stra 2 1 0 0 0 0 0 +large stra 2 1 0 0 0 0 0 0 all points no echo 1 2 3 4 state vars 2 @@ -269,8 +269,6 @@ coordinates 163 3.999999999999999+1 9.999999999999996+0-5.000000000000000-1 164 3.999999999999999+1 9.999999999999996+0 0.000000000000000+0 165 3.999999999999999+1 9.999999999999996+0 5.000000000000000-1 -define element set DAMASK_elements - 1 to 80 define node set unten_y_nodes 2 5 8 11 14 define node set oben_y_nodes @@ -283,6 +281,166 @@ define node set unten_z_nodes 7 to 9 define node set oben_z_nodes 157 to 159 +define element set material0_elements + 1 +define element set material1_elements + 2 +define element set material2_elements + 3 +define element set material3_elements + 4 +define element set material4_elements + 5 +define element set material5_elements + 6 +define element set material6_elements + 7 +define element set material7_elements + 8 +define element set material8_elements + 9 +define element set material9_elements + 10 +define element set material10_elements + 11 +define element set material11_elements + 12 +define element set material12_elements + 13 +define element set material13_elements + 14 +define element set material14_elements + 15 +define element set material15_elements + 16 +define element set material16_elements + 17 +define element set material17_elements + 18 +define element set material18_elements + 19 +define element set material19_elements + 20 +define element set material20_elements + 21 +define element set material21_elements + 22 +define element set material22_elements + 23 +define element set material23_elements + 24 +define element set material24_elements + 25 +define element set material25_elements + 26 +define element set material26_elements + 27 +define element set material27_elements + 28 +define element set material28_elements + 29 +define element set material29_elements + 30 +define element set material30_elements + 31 +define element set material31_elements + 32 +define element set material32_elements + 33 +define element set material33_elements + 34 +define element set material34_elements + 35 +define element set material35_elements + 36 +define element set material36_elements + 37 +define element set material37_elements + 38 +define element set material38_elements + 39 +define element set material39_elements + 40 +define element set material40_elements + 41 +define element set material41_elements + 42 +define element set material42_elements + 43 +define element set material43_elements + 44 +define element set material44_elements + 45 +define element set material45_elements + 46 +define element set material46_elements + 47 +define element set material47_elements + 48 +define element set material48_elements + 49 +define element set material49_elements + 50 +define element set material50_elements + 51 +define element set material51_elements + 52 +define element set material52_elements + 53 +define element set material53_elements + 54 +define element set material54_elements + 55 +define element set material55_elements + 56 +define element set material56_elements + 57 +define element set material57_elements + 58 +define element set material58_elements + 59 +define element set material59_elements + 60 +define element set material60_elements + 61 +define element set material61_elements + 62 +define element set material62_elements + 63 +define element set material63_elements + 64 +define element set material64_elements + 65 +define element set material65_elements + 66 +define element set material66_elements + 67 +define element set material67_elements + 68 +define element set material68_elements + 69 +define element set material69_elements + 70 +define element set material70_elements + 71 +define element set material71_elements + 72 +define element set material72_elements + 73 +define element set material73_elements + 74 +define element set material74_elements + 75 +define element set material75_elements + 76 +define element set material76_elements + 77 +define element set material77_elements + 78 +define element set material78_elements + 79 +define element set material79_elements + 80 hypoelastic 1 0 1 0 1TKS 0 @@ -294,13 +452,13 @@ mat color 1 1 230 0 0 table weg_x 1 1 0 0 2 - 1 2 2 0 0 2 0 0 2 0 0 2 + 1 2 2 0 0 2 0 0 2 0 0 2 0 0 0 0 0.000000000000000+0 0.000000000000000+0 2.000000000000000+2 1.600000000000000+1 geometry 0 0 2 1 9 1 230 0 0 -r-value-sample +r-wert-probe 0.000000000000000+0 0.000000000000000+0 0.000000000000000+0 0.000000000000000+0 0.000000000000000+0 0.000000000000000+0 0.000000000000000+0 usdata 1 @@ -344,20 +502,655 @@ unten_fest_nodes oben_ziehen_nodes initial state - 2 6 1 0 0 0DAMASK + 2 6 1 0 0 0material0 0.000000000000000+0 0 1 -DAMASK_elements -loadcase r-value - 5 -DAMASK +material0_elements +initial state + + 2 6 1 0 0 0material1 + 1.000000000000000+0 + 0 + 1 +material1_elements +initial state + + 2 6 1 0 0 0material2 + 2.000000000000000+0 + 0 + 1 +material2_elements +initial state + + 2 6 1 0 0 0material3 + 3.000000000000000+0 + 0 + 1 +material3_elements +initial state + + 2 6 1 0 0 0material4 + 4.000000000000000+0 + 0 + 1 +material4_elements +initial state + + 2 6 1 0 0 0material5 + 5.000000000000000+0 + 0 + 1 +material5_elements +initial state + + 2 6 1 0 0 0material6 + 6.000000000000000+0 + 0 + 1 +material6_elements +initial state + + 2 6 1 0 0 0material7 + 7.000000000000000+0 + 0 + 1 +material7_elements +initial state + + 2 6 1 0 0 0material8 + 8.000000000000000+0 + 0 + 1 +material8_elements +initial state + + 2 6 1 0 0 0material9 + 9.000000000000000+0 + 0 + 1 +material9_elements +initial state + + 2 6 1 0 0 0material10 + 10.000000000000000+0 + 0 + 1 +material10_elements +initial state + + 2 6 1 0 0 0material11 + 11.000000000000000+0 + 0 + 1 +material11_elements +initial state + + 2 6 1 0 0 0material12 + 12.000000000000000+0 + 0 + 1 +material12_elements +initial state + + 2 6 1 0 0 0material13 + 13.000000000000000+0 + 0 + 1 +material13_elements +initial state + + 2 6 1 0 0 0material14 + 14.000000000000000+0 + 0 + 1 +material14_elements +initial state + + 2 6 1 0 0 0material15 + 15.000000000000000+0 + 0 + 1 +material15_elements +initial state + + 2 6 1 0 0 0material16 + 16.000000000000000+0 + 0 + 1 +material16_elements +initial state + + 2 6 1 0 0 0material17 + 17.000000000000000+0 + 0 + 1 +material17_elements +initial state + + 2 6 1 0 0 0material18 + 18.000000000000000+0 + 0 + 1 +material18_elements +initial state + + 2 6 1 0 0 0material19 + 19.000000000000000+0 + 0 + 1 +material19_elements +initial state + + 2 6 1 0 0 0material20 + 20.000000000000000+0 + 0 + 1 +material20_elements +initial state + + 2 6 1 0 0 0material21 + 21.000000000000000+0 + 0 + 1 +material21_elements +initial state + + 2 6 1 0 0 0material22 + 22.000000000000000+0 + 0 + 1 +material22_elements +initial state + + 2 6 1 0 0 0material23 + 23.000000000000000+0 + 0 + 1 +material23_elements +initial state + + 2 6 1 0 0 0material24 + 24.000000000000000+0 + 0 + 1 +material24_elements +initial state + + 2 6 1 0 0 0material25 + 25.000000000000000+0 + 0 + 1 +material25_elements +initial state + + 2 6 1 0 0 0material26 + 26.000000000000000+0 + 0 + 1 +material26_elements +initial state + + 2 6 1 0 0 0material27 + 27.000000000000000+0 + 0 + 1 +material27_elements +initial state + + 2 6 1 0 0 0material28 + 28.000000000000000+0 + 0 + 1 +material28_elements +initial state + + 2 6 1 0 0 0material29 + 29.000000000000000+0 + 0 + 1 +material29_elements +initial state + + 2 6 1 0 0 0material30 + 30.000000000000000+0 + 0 + 1 +material30_elements +initial state + + 2 6 1 0 0 0material31 + 31.000000000000000+0 + 0 + 1 +material31_elements +initial state + + 2 6 1 0 0 0material32 + 32.000000000000000+0 + 0 + 1 +material32_elements +initial state + + 2 6 1 0 0 0material33 + 33.000000000000000+0 + 0 + 1 +material33_elements +initial state + + 2 6 1 0 0 0material34 + 34.000000000000000+0 + 0 + 1 +material34_elements +initial state + + 2 6 1 0 0 0material35 + 35.000000000000000+0 + 0 + 1 +material35_elements +initial state + + 2 6 1 0 0 0material36 + 36.000000000000000+0 + 0 + 1 +material36_elements +initial state + + 2 6 1 0 0 0material37 + 37.000000000000000+0 + 0 + 1 +material37_elements +initial state + + 2 6 1 0 0 0material38 + 38.000000000000000+0 + 0 + 1 +material38_elements +initial state + + 2 6 1 0 0 0material39 + 39.000000000000000+0 + 0 + 1 +material39_elements +initial state + + 2 6 1 0 0 0material40 + 40.000000000000000+0 + 0 + 1 +material40_elements +initial state + + 2 6 1 0 0 0material41 + 41.000000000000000+0 + 0 + 1 +material41_elements +initial state + + 2 6 1 0 0 0material42 + 42.000000000000000+0 + 0 + 1 +material42_elements +initial state + + 2 6 1 0 0 0material43 + 43.000000000000000+0 + 0 + 1 +material43_elements +initial state + + 2 6 1 0 0 0material44 + 44.000000000000000+0 + 0 + 1 +material44_elements +initial state + + 2 6 1 0 0 0material45 + 45.000000000000000+0 + 0 + 1 +material45_elements +initial state + + 2 6 1 0 0 0material46 + 46.000000000000000+0 + 0 + 1 +material46_elements +initial state + + 2 6 1 0 0 0material47 + 47.000000000000000+0 + 0 + 1 +material47_elements +initial state + + 2 6 1 0 0 0material48 + 48.000000000000000+0 + 0 + 1 +material48_elements +initial state + + 2 6 1 0 0 0material49 + 49.000000000000000+0 + 0 + 1 +material49_elements +initial state + + 2 6 1 0 0 0material50 + 50.000000000000000+0 + 0 + 1 +material50_elements +initial state + + 2 6 1 0 0 0material51 + 51.000000000000000+0 + 0 + 1 +material51_elements +initial state + + 2 6 1 0 0 0material52 + 52.000000000000000+0 + 0 + 1 +material52_elements +initial state + + 2 6 1 0 0 0material53 + 53.000000000000000+0 + 0 + 1 +material53_elements +initial state + + 2 6 1 0 0 0material54 + 54.000000000000000+0 + 0 + 1 +material54_elements +initial state + + 2 6 1 0 0 0material55 + 55.000000000000000+0 + 0 + 1 +material55_elements +initial state + + 2 6 1 0 0 0material56 + 56.000000000000000+0 + 0 + 1 +material56_elements +initial state + + 2 6 1 0 0 0material57 + 57.000000000000000+0 + 0 + 1 +material57_elements +initial state + + 2 6 1 0 0 0material58 + 58.000000000000000+0 + 0 + 1 +material58_elements +initial state + + 2 6 1 0 0 0material59 + 59.000000000000000+0 + 0 + 1 +material59_elements +initial state + + 2 6 1 0 0 0material60 + 60.000000000000000+0 + 0 + 1 +material60_elements +initial state + + 2 6 1 0 0 0material61 + 61.000000000000000+0 + 0 + 1 +material61_elements +initial state + + 2 6 1 0 0 0material62 + 62.000000000000000+0 + 0 + 1 +material62_elements +initial state + + 2 6 1 0 0 0material63 + 63.000000000000000+0 + 0 + 1 +material63_elements +initial state + + 2 6 1 0 0 0material64 + 64.000000000000000+0 + 0 + 1 +material64_elements +initial state + + 2 6 1 0 0 0material65 + 65.000000000000000+0 + 0 + 1 +material65_elements +initial state + + 2 6 1 0 0 0material66 + 66.000000000000000+0 + 0 + 1 +material66_elements +initial state + + 2 6 1 0 0 0material67 + 67.000000000000000+0 + 0 + 1 +material67_elements +initial state + + 2 6 1 0 0 0material68 + 68.000000000000000+0 + 0 + 1 +material68_elements +initial state + + 2 6 1 0 0 0material69 + 69.000000000000000+0 + 0 + 1 +material69_elements +initial state + + 2 6 1 0 0 0material70 + 70.000000000000000+0 + 0 + 1 +material70_elements +initial state + + 2 6 1 0 0 0material71 + 71.000000000000000+0 + 0 + 1 +material71_elements +initial state + + 2 6 1 0 0 0material72 + 72.000000000000000+0 + 0 + 1 +material72_elements +initial state + + 2 6 1 0 0 0material73 + 73.000000000000000+0 + 0 + 1 +material73_elements +initial state + + 2 6 1 0 0 0material74 + 74.000000000000000+0 + 0 + 1 +material74_elements +initial state + + 2 6 1 0 0 0material75 + 75.000000000000000+0 + 0 + 1 +material75_elements +initial state + + 2 6 1 0 0 0material76 + 76.000000000000000+0 + 0 + 1 +material76_elements +initial state + + 2 6 1 0 0 0material77 + 77.000000000000000+0 + 0 + 1 +material77_elements +initial state + + 2 6 1 0 0 0material78 + 78.000000000000000+0 + 0 + 1 +material78_elements +initial state + + 2 6 1 0 0 0material79 + 79.000000000000000+0 + 0 + 1 +material79_elements +loadcase R-Wert + 83 +material0 +material1 +material2 +material3 +material4 +material5 +material6 +material7 +material8 +material9 +material10 +material11 +material12 +material13 +material14 +material15 +material16 +material17 +material18 +material19 +material20 +material21 +material22 +material23 +material24 +material25 +material26 +material27 +material28 +material29 +material30 +material31 +material32 +material33 +material34 +material35 +material36 +material37 +material38 +material39 +material40 +material41 +material42 +material43 +material44 +material45 +material46 +material47 +material48 +material49 +material50 +material51 +material52 +material53 +material54 +material55 +material56 +material57 +material58 +material59 +material60 +material61 +material62 +material63 +material64 +material65 +material66 +material67 +material68 +material69 +material70 +material71 +material72 +material73 +material74 +material75 +material76 +material77 +material78 +material79 unten_z unten_y unten_fest no print post - 6 16 17 0 0 19 20 0 1 0 0 0 0 0 0 0 + 3 16 17 0 0 19 20 0 1 0 0 0 0 0 0 0 + 17 0 + 301 0 + 311 0 parameters 1.000000000000000+0 1.000000000000000+9 1.000000000000000+2 1.000000000000000+6 2.500000000000000-1 5.000000000000000-1 1.500000000000000+0-5.000000000000000-1 8.625000000000000+0 2.000000000000000+1 1.000000000000000-4 1.000000000000000-6 1.000000000000000+0 1.000000000000000-4 @@ -367,9 +1160,9 @@ parameters 3.000000000000000+0 4.000000000000000-1 end option $................... -$....start of loadcase Tensile -title Tensile -loadcase Tensile +$....start of loadcase Ziehen +title Ziehen +loadcase Ziehen 6 unten_z unten_y @@ -392,5 +1185,5 @@ auto load time step 2.000000000000000+0 continue -$....end of loadcase Tensile +$....end of loadcase Ziehen $................... diff --git a/examples/config/Phase_Dislotungsten_W.yaml b/examples/config/Phase_Dislotungsten_W.yaml deleted file mode 100644 index bf8796cfa..000000000 --- a/examples/config/Phase_Dislotungsten_W.yaml +++ /dev/null @@ -1,26 +0,0 @@ -type: dislotungsten - -N_sl: [12] - -rho_mob_0: [1.0e+9] -rho_dip_0: [1.0] - -nu_a: [9.1e+11] -b_sl: [2.72e-10] -Delta_H_kp,0: [2.61154e-19] # 1.63 eV, Delta_H0 - -tau_Peierls: [2.03e+9] -p_sl: [0.86] -q_sl: [1.69] -h: [2.566e-10] -w: [2.992e-09] -B: [8.3e-5] -D_a: 1.0 # d_edge - -# climb (disabled) -D_0: 0.0 -Q_cl: 0.0 -V_cl: [0.0] - -h_sl-sl: [0.009, 0.72, 0.009, 0.05, 0.05, 0.06, 0.09] -a_nonSchmid: [0.938, 0.71, 4.43] diff --git a/examples/config/phase/W.yaml b/examples/config/phase/W.yaml index 8be7d38a6..740fe0992 100644 --- a/examples/config/phase/W.yaml +++ b/examples/config/phase/W.yaml @@ -1,4 +1,4 @@ references: - https://en.wikipedia.org/wiki/Tungsten -lattice: cF +lattice: cI rho: 19300.0 diff --git a/examples/config/phase/mechanical/plastic/dislotungsten_W.yaml b/examples/config/phase/mechanical/plastic/dislotungsten_W.yaml new file mode 100644 index 000000000..55814c3f8 --- /dev/null +++ b/examples/config/phase/mechanical/plastic/dislotungsten_W.yaml @@ -0,0 +1,35 @@ +type: dislotungsten +references: + - D. Cereceda et al., + International Journal of Plasticity 78:242-265, 2016, + http://dx.doi.org/10.1016/j.ijplas.2015.09.002 + - R. Gröger et al., + Acta Materialia 56(19):5412-5425, 2008, + https://doi.org/10.1016/j.actamat.2008.07.037 +output: [Lambda_sl] +N_sl: [12] +b_sl: [2.72e-10] +rho_mob_0: [1.0e+9] # estimated from section 3.2 +rho_dip_0: [1.0] # not given +Q_s: [2.61154e-19] # 1.63 eV, Delta_H0 +B: [8.3e-5] +omega: [9.1e+11] # nu_0 +p_sl: [0.86] +q_sl: [1.69] +tau_Peierls: [2.03e+9] +h: [2.566e-10] +h_sl-sl: [0.009, 0.72, 0.009, 0.05, 0.05, 0.06, 0.09] +w: [2.992e-09] # 11b + +# values in Cereceda et al. are high, using parameters from Gröger et al. +a_nonSchmid: [0.0, 0.56, 0.75] # Table 2 + +# (almost) no annhilation, adjustment needed for simulations beyond the yield point +i_sl: [1] # c, eq. (25) +D: 1.0e+20 # d_g, eq. (25) +D_a: 1.0 # d_edge = D_a*b + +# disable climb (not discussed in Cereceda et al.) +D_0: 0.0 +f_at: 1 +Q_cl: 1.0 diff --git a/python/damask/VERSION b/python/damask/VERSION index 6ca7886a4..7b46fdedc 100644 --- a/python/damask/VERSION +++ b/python/damask/VERSION @@ -1 +1 @@ -v3.0.0-alpha5-7-gee537ff5e +v3.0.0-alpha5-72-g8138d3a18 diff --git a/python/damask/__init__.py b/python/damask/__init__.py index 001e46276..231fa8b30 100644 --- a/python/damask/__init__.py +++ b/python/damask/__init__.py @@ -14,8 +14,8 @@ from . import tensor # noqa from . import mechanics # noqa from . import solver # noqa from . import grid_filters # noqa -#Modules that contain only one class (of the same name), are prefixed by a '_'. -#For example, '_colormap' containsa class called 'Colormap' which is imported as 'damask.Colormap'. +# Modules that contain only one class (of the same name), are prefixed by a '_'. +# For example, '_colormap' contains a class called 'Colormap' which is imported as 'damask.Colormap'. from ._rotation import Rotation # noqa from ._crystal import Crystal # noqa from ._orientation import Orientation # noqa diff --git a/python/damask/_orientation.py b/python/damask/_orientation.py index a568eb0f1..bb14fd38b 100644 --- a/python/damask/_orientation.py +++ b/python/damask/_orientation.py @@ -9,27 +9,6 @@ from . import util from . import tensor -lattice_symmetries = { - 'aP': 'triclinic', - - 'mP': 'monoclinic', - 'mS': 'monoclinic', - - 'oP': 'orthorhombic', - 'oS': 'orthorhombic', - 'oI': 'orthorhombic', - 'oF': 'orthorhombic', - - 'tP': 'tetragonal', - 'tI': 'tetragonal', - - 'hP': 'hexagonal', - - 'cP': 'cubic', - 'cI': 'cubic', - 'cF': 'cubic', - } - _parameter_doc = \ """ family : {'triclinic', 'monoclinic', 'orthorhombic', 'tetragonal', 'hexagonal', 'cubic'}, optional. @@ -146,7 +125,7 @@ class Orientation(Rotation,Crystal): """Create deep copy.""" dup = copy.deepcopy(self) if rotation is not None: - dup.quaternion = Orientation(rotation,family='cubic').quaternion + dup.quaternion = Rotation(rotation).quaternion return dup copy = __copy__ diff --git a/python/damask/_rotation.py b/python/damask/_rotation.py index 74a3f7419..ac921d70a 100644 --- a/python/damask/_rotation.py +++ b/python/damask/_rotation.py @@ -1,3 +1,5 @@ +import copy + import numpy as np from . import tensor @@ -85,9 +87,12 @@ class Rotation: + str(self.quaternion) - def __copy__(self,**kwargs): + def __copy__(self,rotation=None): """Create deep copy.""" - return self.__class__(rotation=kwargs['rotation'] if 'rotation' in kwargs else self.quaternion) + dup = copy.deepcopy(self) + if rotation is not None: + dup.quaternion = Rotation(rotation).quaternion + return dup copy = __copy__ diff --git a/python/damask/grid_filters.py b/python/damask/grid_filters.py index 816c727cd..42b5a16c4 100644 --- a/python/damask/grid_filters.py +++ b/python/damask/grid_filters.py @@ -11,10 +11,14 @@ the following operations are required for tensorial data: - D1 = D3.reshape(cells+(-1,)).reshape(-1,9,order='F') """ + +from typing import Sequence, Tuple, Union + from scipy import spatial as _spatial import numpy as _np -def _ks(size,cells,first_order=False): + +def _ks(size: _np.ndarray, cells: Union[_np.ndarray,Sequence[int]], first_order: bool = False) -> _np.ndarray: """ Get wave numbers operator. @@ -41,7 +45,7 @@ def _ks(size,cells,first_order=False): return _np.stack(_np.meshgrid(k_sk,k_sj,k_si,indexing = 'ij'), axis=-1) -def curl(size,f): +def curl(size: _np.ndarray, f: _np.ndarray) -> _np.ndarray: u""" Calculate curl of a vector or tensor field in Fourier space. @@ -72,7 +76,7 @@ def curl(size,f): return _np.fft.irfftn(curl_,axes=(0,1,2),s=f.shape[:3]) -def divergence(size,f): +def divergence(size: _np.ndarray, f: _np.ndarray) -> _np.ndarray: u""" Calculate divergence of a vector or tensor field in Fourier space. @@ -99,7 +103,7 @@ def divergence(size,f): return _np.fft.irfftn(div_,axes=(0,1,2),s=f.shape[:3]) -def gradient(size,f): +def gradient(size: _np.ndarray, f: _np.ndarray) -> _np.ndarray: u""" Calculate gradient of a scalar or vector fieldin Fourier space. @@ -126,7 +130,9 @@ def gradient(size,f): return _np.fft.irfftn(grad_,axes=(0,1,2),s=f.shape[:3]) -def coordinates0_point(cells,size,origin=_np.zeros(3)): +def coordinates0_point(cells: Union[ _np.ndarray,Sequence[int]], + size: _np.ndarray, + origin: _np.ndarray = _np.zeros(3)) -> _np.ndarray: """ Cell center positions (undeformed). @@ -145,8 +151,8 @@ def coordinates0_point(cells,size,origin=_np.zeros(3)): Undeformed cell center coordinates. """ - start = origin + size/cells*.5 - end = origin + size - size/cells*.5 + start = origin + size/_np.array(cells)*.5 + end = origin + size - size/_np.array(cells)*.5 return _np.stack(_np.meshgrid(_np.linspace(start[0],end[0],cells[0]), _np.linspace(start[1],end[1],cells[1]), @@ -154,7 +160,7 @@ def coordinates0_point(cells,size,origin=_np.zeros(3)): axis = -1) -def displacement_fluct_point(size,F): +def displacement_fluct_point(size: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Cell center displacement field from fluctuation part of the deformation gradient field. @@ -186,7 +192,7 @@ def displacement_fluct_point(size,F): return _np.fft.irfftn(displacement,axes=(0,1,2),s=F.shape[:3]) -def displacement_avg_point(size,F): +def displacement_avg_point(size: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Cell center displacement field from average part of the deformation gradient field. @@ -207,7 +213,7 @@ def displacement_avg_point(size,F): return _np.einsum('ml,ijkl->ijkm',F_avg - _np.eye(3),coordinates0_point(F.shape[:3],size)) -def displacement_point(size,F): +def displacement_point(size: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Cell center displacement field from deformation gradient field. @@ -227,7 +233,7 @@ def displacement_point(size,F): return displacement_avg_point(size,F) + displacement_fluct_point(size,F) -def coordinates_point(size,F,origin=_np.zeros(3)): +def coordinates_point(size: _np.ndarray, F: _np.ndarray, origin: _np.ndarray = _np.zeros(3)) -> _np.ndarray: """ Cell center positions. @@ -249,7 +255,8 @@ def coordinates_point(size,F,origin=_np.zeros(3)): return coordinates0_point(F.shape[:3],size,origin) + displacement_point(size,F) -def cellsSizeOrigin_coordinates0_point(coordinates0,ordered=True): +def cellsSizeOrigin_coordinates0_point(coordinates0: _np.ndarray, + ordered: bool = True) -> Tuple[_np.ndarray,_np.ndarray,_np.ndarray]: """ Return grid 'DNA', i.e. cells, size, and origin from 1D array of point positions. @@ -292,13 +299,15 @@ def cellsSizeOrigin_coordinates0_point(coordinates0,ordered=True): raise ValueError('Regular cell spacing violated.') if ordered and not _np.allclose(coordinates0.reshape(tuple(cells)+(3,),order='F'), - coordinates0_point(cells,size,origin),atol=atol): + coordinates0_point(list(cells),size,origin),atol=atol): raise ValueError('Input data is not ordered (x fast, z slow).') return (cells,size,origin) -def coordinates0_node(cells,size,origin=_np.zeros(3)): +def coordinates0_node(cells: Union[_np.ndarray,Sequence[int]], + size: _np.ndarray, + origin: _np.ndarray = _np.zeros(3)) -> _np.ndarray: """ Nodal positions (undeformed). @@ -323,7 +332,7 @@ def coordinates0_node(cells,size,origin=_np.zeros(3)): axis = -1) -def displacement_fluct_node(size,F): +def displacement_fluct_node(size: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Nodal displacement field from fluctuation part of the deformation gradient field. @@ -343,7 +352,7 @@ def displacement_fluct_node(size,F): return point_to_node(displacement_fluct_point(size,F)) -def displacement_avg_node(size,F): +def displacement_avg_node(size: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Nodal displacement field from average part of the deformation gradient field. @@ -364,7 +373,7 @@ def displacement_avg_node(size,F): return _np.einsum('ml,ijkl->ijkm',F_avg - _np.eye(3),coordinates0_node(F.shape[:3],size)) -def displacement_node(size,F): +def displacement_node(size: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Nodal displacement field from deformation gradient field. @@ -384,7 +393,7 @@ def displacement_node(size,F): return displacement_avg_node(size,F) + displacement_fluct_node(size,F) -def coordinates_node(size,F,origin=_np.zeros(3)): +def coordinates_node(size: _np.ndarray, F: _np.ndarray, origin: _np.ndarray = _np.zeros(3)) -> _np.ndarray: """ Nodal positions. @@ -406,7 +415,8 @@ def coordinates_node(size,F,origin=_np.zeros(3)): return coordinates0_node(F.shape[:3],size,origin) + displacement_node(size,F) -def cellsSizeOrigin_coordinates0_node(coordinates0,ordered=True): +def cellsSizeOrigin_coordinates0_node(coordinates0: _np.ndarray, + ordered: bool = True) -> Tuple[_np.ndarray,_np.ndarray,_np.ndarray]: """ Return grid 'DNA', i.e. cells, size, and origin from 1D array of nodal positions. @@ -441,13 +451,13 @@ def cellsSizeOrigin_coordinates0_node(coordinates0,ordered=True): raise ValueError('Regular cell spacing violated.') if ordered and not _np.allclose(coordinates0.reshape(tuple(cells+1)+(3,),order='F'), - coordinates0_node(cells,size,origin),atol=atol): + coordinates0_node(list(cells),size,origin),atol=atol): raise ValueError('Input data is not ordered (x fast, z slow).') return (cells,size,origin) -def point_to_node(cell_data): +def point_to_node(cell_data: _np.ndarray) -> _np.ndarray: """ Interpolate periodic point data to nodal data. @@ -469,7 +479,7 @@ def point_to_node(cell_data): return _np.pad(n,((0,1),(0,1),(0,1))+((0,0),)*len(cell_data.shape[3:]),mode='wrap') -def node_to_point(node_data): +def node_to_point(node_data: _np.ndarray) -> _np.ndarray: """ Interpolate periodic nodal data to point data. @@ -491,7 +501,7 @@ def node_to_point(node_data): return c[1:,1:,1:] -def coordinates0_valid(coordinates0): +def coordinates0_valid(coordinates0: _np.ndarray) -> bool: """ Check whether coordinates form a regular grid. @@ -513,7 +523,7 @@ def coordinates0_valid(coordinates0): return False -def regrid(size,F,cells): +def regrid(size: _np.ndarray, F: _np.ndarray, cells: Union[_np.ndarray,Sequence[int]]) -> _np.ndarray: """ Return mapping from coordinates in deformed configuration to a regular grid. diff --git a/python/damask/mechanics.py b/python/damask/mechanics.py index 0e160523b..1a03f390b 100644 --- a/python/damask/mechanics.py +++ b/python/damask/mechanics.py @@ -5,13 +5,15 @@ All routines operate on numpy.ndarrays of shape (...,3,3). """ -from . import tensor as _tensor -from . import _rotation +from typing import Sequence import numpy as _np +from . import tensor as _tensor +from . import _rotation -def deformation_Cauchy_Green_left(F): + +def deformation_Cauchy_Green_left(F: _np.ndarray) -> _np.ndarray: """ Calculate left Cauchy-Green deformation tensor (Finger deformation tensor). @@ -29,7 +31,7 @@ def deformation_Cauchy_Green_left(F): return _np.matmul(F,_tensor.transpose(F)) -def deformation_Cauchy_Green_right(F): +def deformation_Cauchy_Green_right(F: _np.ndarray) -> _np.ndarray: """ Calculate right Cauchy-Green deformation tensor. @@ -47,7 +49,7 @@ def deformation_Cauchy_Green_right(F): return _np.matmul(_tensor.transpose(F),F) -def equivalent_strain_Mises(epsilon): +def equivalent_strain_Mises(epsilon: _np.ndarray) -> _np.ndarray: """ Calculate the Mises equivalent of a strain tensor. @@ -65,7 +67,7 @@ def equivalent_strain_Mises(epsilon): return _equivalent_Mises(epsilon,2.0/3.0) -def equivalent_stress_Mises(sigma): +def equivalent_stress_Mises(sigma: _np.ndarray) -> _np.ndarray: """ Calculate the Mises equivalent of a stress tensor. @@ -83,7 +85,7 @@ def equivalent_stress_Mises(sigma): return _equivalent_Mises(sigma,3.0/2.0) -def maximum_shear(T_sym): +def maximum_shear(T_sym: _np.ndarray) -> _np.ndarray: """ Calculate the maximum shear component of a symmetric tensor. @@ -102,7 +104,7 @@ def maximum_shear(T_sym): return (w[...,0] - w[...,2])*0.5 -def rotation(T): +def rotation(T: _np.ndarray) -> _rotation.Rotation: """ Calculate the rotational part of a tensor. @@ -120,7 +122,7 @@ def rotation(T): return _rotation.Rotation.from_matrix(_polar_decomposition(T,'R')[0]) -def strain(F,t,m): +def strain(F: _np.ndarray, t: str, m: float) -> _np.ndarray: """ Calculate strain tensor (Seth–Hill family). @@ -160,7 +162,7 @@ def strain(F,t,m): return eps -def stress_Cauchy(P,F): +def stress_Cauchy(P: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Calculate the Cauchy stress (true stress). @@ -182,7 +184,7 @@ def stress_Cauchy(P,F): return _tensor.symmetric(_np.einsum('...,...ij,...kj',1.0/_np.linalg.det(F),P,F)) -def stress_second_Piola_Kirchhoff(P,F): +def stress_second_Piola_Kirchhoff(P: _np.ndarray, F: _np.ndarray) -> _np.ndarray: """ Calculate the second Piola-Kirchhoff stress. @@ -205,7 +207,7 @@ def stress_second_Piola_Kirchhoff(P,F): return _tensor.symmetric(_np.einsum('...ij,...jk',_np.linalg.inv(F),P)) -def stretch_left(T): +def stretch_left(T: _np.ndarray) -> _np.ndarray: """ Calculate left stretch of a tensor. @@ -223,7 +225,7 @@ def stretch_left(T): return _polar_decomposition(T,'V')[0] -def stretch_right(T): +def stretch_right(T: _np.ndarray) -> _np.ndarray: """ Calculate right stretch of a tensor. @@ -241,7 +243,7 @@ def stretch_right(T): return _polar_decomposition(T,'U')[0] -def _polar_decomposition(T,requested): +def _polar_decomposition(T: _np.ndarray, requested: Sequence[str]) -> tuple: """ Perform singular value decomposition. @@ -257,21 +259,21 @@ def _polar_decomposition(T,requested): u, _, vh = _np.linalg.svd(T) R = _np.einsum('...ij,...jk',u,vh) - output = () + output = [] if 'R' in requested: - output+=(R,) + output+=[R] if 'V' in requested: - output+=(_np.einsum('...ij,...kj',T,R),) + output+=[_np.einsum('...ij,...kj',T,R)] if 'U' in requested: - output+=(_np.einsum('...ji,...jk',R,T),) + output+=[_np.einsum('...ji,...jk',R,T)] if len(output) == 0: raise ValueError('output needs to be out of V, R, U') - return output + return tuple(output) -def _equivalent_Mises(T_sym,s): +def _equivalent_Mises(T_sym: _np.ndarray, s: float) -> _np.ndarray: """ Base equation for Mises equivalent of a stress or strain tensor. diff --git a/python/damask/seeds.py b/python/damask/seeds.py index 26aa3084b..4d5a8c624 100644 --- a/python/damask/seeds.py +++ b/python/damask/seeds.py @@ -1,5 +1,7 @@ """Functionality for generation of seed points for Voronoi or Laguerre tessellation.""" +from typing import Sequence,Tuple + from scipy import spatial as _spatial import numpy as _np @@ -7,7 +9,7 @@ from . import util as _util from . import grid_filters as _grid_filters -def from_random(size,N_seeds,cells=None,rng_seed=None): +def from_random(size: _np.ndarray, N_seeds: int, cells: _np.ndarray = None, rng_seed=None) -> _np.ndarray: """ Place seeds randomly in space. @@ -41,7 +43,8 @@ def from_random(size,N_seeds,cells=None,rng_seed=None): return coords -def from_Poisson_disc(size,N_seeds,N_candidates,distance,periodic=True,rng_seed=None): +def from_Poisson_disc(size: _np.ndarray, N_seeds: int, N_candidates: int, distance: float, + periodic: bool = True, rng_seed=None) -> _np.ndarray: """ Place seeds according to a Poisson disc distribution. @@ -75,18 +78,17 @@ def from_Poisson_disc(size,N_seeds,N_candidates,distance,periodic=True,rng_seed= i = 0 progress = _util._ProgressBar(N_seeds+1,'',50) while s < N_seeds: + i += 1 candidates = rng.random((N_candidates,3))*_np.broadcast_to(size,(N_candidates,3)) tree = _spatial.cKDTree(coords[:s],boxsize=size) if periodic else \ _spatial.cKDTree(coords[:s]) distances = tree.query(candidates)[0] best = distances.argmax() if distances[best] > distance: # require minimum separation + i = 0 coords[s] = candidates[best] # maximum separation to existing point cloud s += 1 progress.update(s) - i = 0 - else: - i += 1 if i == 100: raise ValueError('Seeding not possible') @@ -94,22 +96,23 @@ def from_Poisson_disc(size,N_seeds,N_candidates,distance,periodic=True,rng_seed= return coords -def from_grid(grid,selection=None,invert=False,average=False,periodic=True): +def from_grid(grid, selection: Sequence[int] = None, + invert: bool = False, average: bool = False, periodic: bool = True) -> Tuple[_np.ndarray, _np.ndarray]: """ Create seeds from grid description. Parameters ---------- grid : damask.Grid - Grid, from which the material IDs are used as seeds. + Grid from which the material IDs are used as seeds. selection : iterable of integers, optional Material IDs to consider. invert : boolean, false - Do not consider the material IDs given in selection. Defaults to False. + Consider all material IDs except those in selection. Defaults to False. average : boolean, optional Seed corresponds to center of gravity of material ID cloud. periodic : boolean, optional - Center of gravity with periodic boundaries. + Center of gravity accounts for periodic boundaries. Returns ------- diff --git a/python/damask/tensor.py b/python/damask/tensor.py index cf5d94020..a735b355e 100644 --- a/python/damask/tensor.py +++ b/python/damask/tensor.py @@ -8,7 +8,7 @@ All routines operate on numpy.ndarrays of shape (...,3,3). import numpy as _np -def deviatoric(T): +def deviatoric(T: _np.ndarray) -> _np.ndarray: """ Calculate deviatoric part of a tensor. @@ -26,7 +26,7 @@ def deviatoric(T): return T - spherical(T,tensor=True) -def eigenvalues(T_sym): +def eigenvalues(T_sym: _np.ndarray) -> _np.ndarray: """ Eigenvalues, i.e. principal components, of a symmetric tensor. @@ -45,7 +45,7 @@ def eigenvalues(T_sym): return _np.linalg.eigvalsh(symmetric(T_sym)) -def eigenvectors(T_sym,RHS=False): +def eigenvectors(T_sym: _np.ndarray, RHS: bool = False) -> _np.ndarray: """ Eigenvectors of a symmetric tensor. @@ -70,7 +70,7 @@ def eigenvectors(T_sym,RHS=False): return v -def spherical(T,tensor=True): +def spherical(T: _np.ndarray, tensor: bool = True) -> _np.ndarray: """ Calculate spherical part of a tensor. @@ -92,7 +92,7 @@ def spherical(T,tensor=True): return _np.einsum('...jk,...',_np.eye(3),sph) if tensor else sph -def symmetric(T): +def symmetric(T: _np.ndarray) -> _np.ndarray: """ Symmetrize tensor. @@ -110,7 +110,7 @@ def symmetric(T): return (T+transpose(T))*0.5 -def transpose(T): +def transpose(T: _np.ndarray) -> _np.ndarray: """ Transpose tensor. diff --git a/python/mypy.ini b/python/mypy.ini new file mode 100644 index 000000000..01001daa6 --- /dev/null +++ b/python/mypy.ini @@ -0,0 +1,14 @@ +[mypy-scipy.*] +ignore_missing_imports = True +[mypy-h5py.*] +ignore_missing_imports = True +[mypy-vtk.*] +ignore_missing_imports = True +[mypy-PIL.*] +ignore_missing_imports = True +[mypy-matplotlib.*] +ignore_missing_imports = True +[mypy-pandas.*] +ignore_missing_imports = True +[mypy-wx.*] +ignore_missing_imports = True diff --git a/python/tests/test_Orientation.py b/python/tests/test_Orientation.py index 686ed66c2..9f623fc6c 100644 --- a/python/tests/test_Orientation.py +++ b/python/tests/test_Orientation.py @@ -7,9 +7,9 @@ from damask import Orientation from damask import Table from damask import util from damask import grid_filters -from damask import _orientation +from damask import _crystal -crystal_families = set(_orientation.lattice_symmetries.values()) +crystal_families = set(_crystal.lattice_symmetries.values()) @pytest.fixture diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6ffa26441..82efe8748 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,5 @@ # special flags for some files -if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") +if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") # long lines for interaction matrix SET_SOURCE_FILES_PROPERTIES("lattice.f90" PROPERTIES COMPILE_FLAGS "-ffree-line-length-240") endif() @@ -12,25 +12,24 @@ list(FILTER damask-sources EXCLUDE REGEX ".*DAMASK_Marc.*.f90") list(FILTER damask-sources EXCLUDE REGEX ".*commercialFEM_fileList.*.f90") -if (PROJECT_NAME STREQUAL "damask-grid") +if(PROJECT_NAME STREQUAL "damask-grid") + set(executable-name "DAMASK_grid") + file(GLOB solver-sources CONFIGURE_DEPENDS grid/*.f90) +elseif(PROJECT_NAME STREQUAL "damask-mesh") + set(executable-name "DAMASK_mesh") + file(GLOB solver-sources CONFIGURE_DEPENDS mesh/*.f90) +endif() - file(GLOB grid-sources CONFIGURE_DEPENDS grid/*.f90) +if(NOT CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") + add_executable(${executable-name} ${damask-sources} ${solver-sources}) + install(TARGETS ${executable-name} RUNTIME DESTINATION bin) +else() + add_library(${executable-name} OBJECT ${damask-sources} ${solver-sources}) + exec_program(mktemp OUTPUT_VARIABLE nothing) + exec_program(mktemp ARGS -d OUTPUT_VARIABLE black_hole) + install(PROGRAMS ${nothing} DESTINATION ${black_hole}) +endif() - if (NOT CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") - add_executable(DAMASK_grid ${damask-sources} ${grid-sources}) - install (TARGETS DAMASK_grid RUNTIME DESTINATION bin) - else () - add_library(DAMASK_grid OBJECT ${damask-sources} ${grid-sources}) - exec_program (mktemp OUTPUT_VARIABLE nothing) - exec_program (mktemp ARGS -d OUTPUT_VARIABLE black_hole) - install (PROGRAMS ${nothing} DESTINATION ${black_hole}) - endif () - -elseif (PROJECT_NAME STREQUAL "damask-mesh") - - file(GLOB mesh-sources CONFIGURE_DEPENDS mesh/*.f90) - - add_executable(DAMASK_mesh ${damask-sources} ${mesh-sources}) - install (TARGETS DAMASK_mesh RUNTIME DESTINATION bin) - -endif () +string(REPLACE ";" "\n" sources "${damask-sources};${solver-sources}") +message(${CMAKE_BINARY_DIR}) +file(WRITE ${CMAKE_BINARY_DIR}/sources.txt ${sources}) diff --git a/src/IO.f90 b/src/IO.f90 index cd7c09c75..717493006 100644 --- a/src/IO.f90 +++ b/src/IO.f90 @@ -432,7 +432,7 @@ subroutine IO_error(error_ID,el,ip,g,instance,ext_msg) msg = 'Nconstituents mismatch between homogenization and material' !-------------------------------------------------------------------------------------------------- -! material error messages and related messages in mesh +! material error messages and related messages in geometry case (150) msg = 'index out of bounds' case (153) @@ -499,6 +499,11 @@ subroutine IO_error(error_ID,el,ip,g,instance,ext_msg) case (710) msg = 'Closing quotation mark missing in string' +!------------------------------------------------------------------------------------------------- +! errors related to the mesh solver + case (821) + msg = 'order not supported' + !------------------------------------------------------------------------------------------------- ! errors related to the grid solver case (831) diff --git a/src/grid/discretization_grid.f90 b/src/grid/discretization_grid.f90 index e16001feb..69746bbe3 100644 --- a/src/grid/discretization_grid.f90 +++ b/src/grid/discretization_grid.f90 @@ -75,7 +75,7 @@ subroutine discretization_grid_init(restart) print'(/,a)', ' <<<+- discretization_grid init -+>>>'; flush(IO_STDOUT) - if(worldrank == 0) then + if (worldrank == 0) then fileContent = IO_read(interface_geomFile) call readVTI(grid,geomSize,origin,materialAt_global,fileContent) fname = interface_geomFile @@ -85,7 +85,7 @@ subroutine discretization_grid_init(restart) call results_closeJobFile else allocate(materialAt_global(0)) ! needed for IntelMPI - endif + end if call MPI_Bcast(grid,3,MPI_INTEGER,0,MPI_COMM_WORLD, ierr) @@ -100,7 +100,7 @@ subroutine discretization_grid_init(restart) print'(a,3(es12.5))', ' size x y z: ', geomSize print'(a,3(es12.5))', ' origin x y z: ', origin - if(worldsize>grid(3)) call IO_error(894, ext_msg='number of processes exceeds grid(3)') + if (worldsize>grid(3)) call IO_error(894, ext_msg='number of processes exceeds grid(3)') call fftw_mpi_init devNull = fftw_mpi_local_size_3d(int(grid(3),C_INTPTR_T), & @@ -109,7 +109,7 @@ subroutine discretization_grid_init(restart) PETSC_COMM_WORLD, & z, & ! domain grid size along z z_offset) ! domain grid offset along z - if(z==0_C_INTPTR_T) call IO_error(894, ext_msg='Cannot distribute MPI processes') + if (z==0_C_INTPTR_T) call IO_error(894, ext_msg='Cannot distribute MPI processes') grid3 = int(z) grid3Offset = int(z_offset) @@ -136,14 +136,14 @@ subroutine discretization_grid_init(restart) !-------------------------------------------------------------------------------------------------- ! store geometry information for post processing - if(.not. restart) then + if (.not. restart) then call results_openJobFile call results_closeGroup(results_addGroup('geometry')) call results_addAttribute('cells', grid, '/geometry') call results_addAttribute('size', geomSize,'/geometry') call results_addAttribute('origin',origin, '/geometry') call results_closeJobFile - endif + end if !-------------------------------------------------------------------------------------------------- ! geometry information required by the nonlocal CP model @@ -202,20 +202,20 @@ subroutine readVTI(grid,geomSize,origin,material, & if (endPos < startPos) endPos = len(fileContent,kind=pI64) ! end of file without new line if (.not. inFile) then - if(index(fileContent(startPos:endPos),'',kind=pI64) /= 0_pI64) then + if (index(fileContent(startPos:endPos),'',kind=pI64) == 0_pI64) if (index(fileContent(startPos:endPos),' 1e-16) then call math_invert(A_inv, err, A) temp33_complex = cmplx(A_inv(1:3,1:3),A_inv(1:3,4:6),pReal) @@ -509,8 +509,8 @@ subroutine utilities_fourierGammaConvolution(fieldAim) xiDyad_cmplx(l,m) = conjg(-xi1st(l,i,j,k))*xi1st(m,i,j,k) forall(l = 1:3, m = 1:3) & temp33_complex(l,m) = sum(cmplx(C_ref(l,1:3,m,1:3),0.0_pReal)*xiDyad_cmplx) - A(1:3,1:3) = real(temp33_complex); A(4:6,4:6) = real(temp33_complex) - A(1:3,4:6) = aimag(temp33_complex); A(4:6,1:3) = -aimag(temp33_complex) + A(1:3,1:3) = temp33_complex%re; A(4:6,4:6) = temp33_complex%re + A(1:3,4:6) = temp33_complex%im; A(4:6,1:3) = -temp33_complex%im if (abs(math_det33(A(1:3,1:3))) > 1e-16) then call math_invert(A_inv, err, A) temp33_complex = cmplx(A_inv(1:3,1:3),A_inv(1:3,4:6),pReal) @@ -630,7 +630,7 @@ real(pReal) function utilities_curlRMS() -tensorField_fourier(l,1,i,j,k)*xi1st(2,i,j,k)*rescaledGeom(2)) enddo utilities_curlRMS = utilities_curlRMS & - +2.0_pReal*sum(real(curl_fourier)**2.0_pReal+aimag(curl_fourier)**2.0_pReal)! Has somewhere a conj. complex counterpart. Therefore count it twice. + +2.0_pReal*sum(curl_fourier%re**2.0_pReal+curl_fourier%im**2.0_pReal) ! Has somewhere a conj. complex counterpart. Therefore count it twice. enddo do l = 1, 3 curl_fourier = (+tensorField_fourier(l,3,1,j,k)*xi1st(2,1,j,k)*rescaledGeom(2) & @@ -641,7 +641,7 @@ real(pReal) function utilities_curlRMS() -tensorField_fourier(l,1,1,j,k)*xi1st(2,1,j,k)*rescaledGeom(2)) enddo utilities_curlRMS = utilities_curlRMS & - + sum(real(curl_fourier)**2.0_pReal + aimag(curl_fourier)**2.0_pReal) ! this layer (DC) does not have a conjugate complex counterpart (if grid(1) /= 1) + + sum(curl_fourier%re**2.0_pReal + curl_fourier%im**2.0_pReal) ! this layer (DC) does not have a conjugate complex counterpart (if grid(1) /= 1) do l = 1, 3 curl_fourier = (+tensorField_fourier(l,3,grid1Red,j,k)*xi1st(2,grid1Red,j,k)*rescaledGeom(2) & -tensorField_fourier(l,2,grid1Red,j,k)*xi1st(3,grid1Red,j,k)*rescaledGeom(3)) @@ -651,7 +651,7 @@ real(pReal) function utilities_curlRMS() -tensorField_fourier(l,1,grid1Red,j,k)*xi1st(2,grid1Red,j,k)*rescaledGeom(2)) enddo utilities_curlRMS = utilities_curlRMS & - + sum(real(curl_fourier)**2.0_pReal + aimag(curl_fourier)**2.0_pReal) ! this layer (Nyquist) does not have a conjugate complex counterpart (if grid(1) /= 1) + + sum(curl_fourier%re**2.0_pReal + curl_fourier%im**2.0_pReal) ! this layer (Nyquist) does not have a conjugate complex counterpart (if grid(1) /= 1) enddo; enddo call MPI_Allreduce(MPI_IN_PLACE,utilities_curlRMS,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD,ierr) diff --git a/src/mesh/FEM_utilities.f90 b/src/mesh/FEM_utilities.f90 index 64bcc3896..fde8831db 100644 --- a/src/mesh/FEM_utilities.f90 +++ b/src/mesh/FEM_utilities.f90 @@ -19,6 +19,7 @@ module FEM_utilities use IO use discretization_mesh use homogenization + use FEM_quadrature implicit none private @@ -29,8 +30,8 @@ module FEM_utilities !-------------------------------------------------------------------------------------------------- ! field labels information - character(len=*), parameter, public :: & - FIELD_MECH_label = 'mechanical' + character(len=*), parameter, public :: & + FIELD_MECH_label = 'mechanical' enum, bind(c); enumerator :: & FIELD_UNDEFINED_ID, & @@ -86,7 +87,9 @@ subroutine FEM_utilities_init class(tNode), pointer :: & num_mesh, & debug_mesh ! pointer to mesh debug options - integer :: structOrder !< order of displacement shape functions + integer :: & + p_s, & !< order of shape functions + p_i !< integration order (quadrature rule) character(len=*), parameter :: & PETSCDEBUG = ' -snes_view -snes_monitor ' PetscErrorCode :: ierr @@ -96,7 +99,14 @@ subroutine FEM_utilities_init print'(/,a)', ' <<<+- FEM_utilities init -+>>>' num_mesh => config_numerics%get('mesh',defaultVal=emptyDict) - structOrder = num_mesh%get_asInt('structOrder', defaultVal = 2) + + p_s = num_mesh%get_asInt('p_s',defaultVal = 2) + p_i = num_mesh%get_asInt('p_i',defaultVal = p_s) + + if (p_s < 1_pInt .or. p_s > size(FEM_nQuadrature,2)) & + call IO_error(821,ext_msg='shape function order (p_s) out of bounds') + if (p_i < max(1_pInt,p_s-1_pInt) .or. p_i > p_s) & + call IO_error(821,ext_msg='integration order (p_i) out of bounds') debug_mesh => config_debug%get('mesh',defaultVal=emptyList) debugPETSc = debug_mesh%contains('PETSc') @@ -113,13 +123,11 @@ subroutine FEM_utilities_init call PetscOptionsInsertString(PETSC_NULL_OPTIONS,'-mechanical_snes_type newtonls & &-mechanical_snes_linesearch_type cp -mechanical_snes_ksp_ew & &-mechanical_snes_ksp_ew_rtol0 0.01 -mechanical_snes_ksp_ew_rtolmax 0.01 & - &-mechanical_ksp_type fgmres -mechanical_ksp_max_it 25 & - &-mechanical_pc_type ml -mechanical_mg_levels_ksp_type chebyshev & - &-mechanical_mg_levels_pc_type sor -mechanical_pc_ml_nullspace user',ierr) + &-mechanical_ksp_type fgmres -mechanical_ksp_max_it 25', ierr) CHKERRQ(ierr) call PetscOptionsInsertString(PETSC_NULL_OPTIONS,num_mesh%get_asString('PETSc_options',defaultVal=''),ierr) CHKERRQ(ierr) - write(petsc_optionsOrder,'(a,i0)') '-mechFE_petscspace_degree ', structOrder + write(petsc_optionsOrder,'(a,i0)') '-mechFE_petscspace_degree ', p_s call PetscOptionsInsertString(PETSC_NULL_OPTIONS,trim(petsc_optionsOrder),ierr) CHKERRQ(ierr) @@ -141,6 +149,7 @@ subroutine utilities_constitutiveResponse(timeinc,P_av,forwardData) PetscErrorCode :: ierr + print'(/,a)', ' ... evaluating constitutive response ......................................' call homogenization_mechanical_response(timeinc,[1,mesh_maxNips],[1,mesh_NcpElems]) ! calculate P field @@ -168,6 +177,7 @@ subroutine utilities_projectBCValues(localVec,section,field,comp,bcPointsIS,BCVa PetscScalar :: BCValue,BCDotValue,timeinc PetscErrorCode :: ierr + call PetscSectionGetFieldComponents(section,field,numComp,ierr); CHKERRQ(ierr) call ISGetSize(bcPointsIS,nBcPoints,ierr); CHKERRQ(ierr) if (nBcPoints > 0) call ISGetIndicesF90(bcPointsIS,bcPoints,ierr) @@ -179,8 +189,8 @@ subroutine utilities_projectBCValues(localVec,section,field,comp,bcPointsIS,BCVa CHKERRQ(ierr) do dof = offset+comp+1, offset+numDof, numComp localArray(dof) = localArray(dof) + BCValue + BCDotValue*timeinc - enddo - enddo + end do + end do call VecRestoreArrayF90(localVec,localArray,ierr); CHKERRQ(ierr) call VecAssemblyBegin(localVec, ierr); CHKERRQ(ierr) call VecAssemblyEnd (localVec, ierr); CHKERRQ(ierr) diff --git a/src/mesh/discretization_mesh.f90 b/src/mesh/discretization_mesh.f90 index e5f989484..f1d38760d 100644 --- a/src/mesh/discretization_mesh.f90 +++ b/src/mesh/discretization_mesh.f90 @@ -85,7 +85,7 @@ subroutine discretization_mesh_init(restart) materialAt class(tNode), pointer :: & num_mesh - integer :: integrationOrder !< order of quadrature rule required + integer :: p_i !< integration order (quadrature rule) type(tvec) :: coords_node0 print'(/,a)', ' <<<+- discretization_mesh init -+>>>' @@ -93,7 +93,7 @@ subroutine discretization_mesh_init(restart) !-------------------------------------------------------------------------------- ! read numerics parameter num_mesh => config_numerics%get('mesh',defaultVal=emptyDict) - integrationOrder = num_mesh%get_asInt('integrationorder',defaultVal = 2) + p_i = num_mesh%get_asInt('p_i',defaultVal = 2) !--------------------------------------------------------------------------------- ! read debug parameters @@ -150,9 +150,9 @@ subroutine discretization_mesh_init(restart) call VecGetArrayF90(coords_node0, mesh_node0_temp,ierr) CHKERRQ(ierr) - mesh_maxNips = FEM_nQuadrature(dimPlex,integrationOrder) + mesh_maxNips = FEM_nQuadrature(dimPlex,p_i) - call mesh_FEM_build_ipCoordinates(dimPlex,FEM_quadrature_points(dimPlex,integrationOrder)%p) + call mesh_FEM_build_ipCoordinates(dimPlex,FEM_quadrature_points(dimPlex,p_i)%p) call mesh_FEM_build_ipVolumes(dimPlex) allocate(materialAt(mesh_NcpElems)) diff --git a/src/mesh/mesh_mech_FEM.f90 b/src/mesh/mesh_mech_FEM.f90 index d6d314a42..496a82fc5 100644 --- a/src/mesh/mesh_mech_FEM.f90 +++ b/src/mesh/mesh_mech_FEM.f90 @@ -41,7 +41,7 @@ module mesh_mechanical_FEM type, private :: tNumerics integer :: & - integrationOrder, & !< order of quadrature rule required + p_i, & !< integration order (quadrature rule) itmax logical :: & BBarStabilisation @@ -118,7 +118,7 @@ subroutine FEM_mechanical_init(fieldBC) !----------------------------------------------------------------------------- ! read numerical parametes and do sanity checks num_mesh => config_numerics%get('mesh',defaultVal=emptyDict) - num%integrationOrder = num_mesh%get_asInt('integrationorder',defaultVal = 2) + num%p_i = num_mesh%get_asInt('p_i',defaultVal = 2) num%itmax = num_mesh%get_asInt('itmax',defaultVal=250) num%BBarStabilisation = num_mesh%get_asBool('bbarstabilisation',defaultVal = .false.) num%eps_struct_atol = num_mesh%get_asFloat('eps_struct_atol', defaultVal = 1.0e-10_pReal) @@ -135,9 +135,9 @@ subroutine FEM_mechanical_init(fieldBC) !-------------------------------------------------------------------------------------------------- ! Setup FEM mech discretization - qPoints = FEM_quadrature_points( dimPlex,num%integrationOrder)%p - qWeights = FEM_quadrature_weights(dimPlex,num%integrationOrder)%p - nQuadrature = FEM_nQuadrature( dimPlex,num%integrationOrder) + qPoints = FEM_quadrature_points( dimPlex,num%p_i)%p + qWeights = FEM_quadrature_weights(dimPlex,num%p_i)%p + nQuadrature = FEM_nQuadrature( dimPlex,num%p_i) qPointsP => qPoints qWeightsP => qWeights call PetscQuadratureCreate(PETSC_COMM_SELF,mechQuad,ierr); CHKERRQ(ierr) @@ -146,7 +146,7 @@ subroutine FEM_mechanical_init(fieldBC) call PetscQuadratureSetData(mechQuad,dimPlex,nc,nQuadrature,qPointsP,qWeightsP,ierr) CHKERRQ(ierr) call PetscFECreateDefault(PETSC_COMM_SELF,dimPlex,nc,PETSC_TRUE,prefix, & - num%integrationOrder,mechFE,ierr); CHKERRQ(ierr) + num%p_i,mechFE,ierr); CHKERRQ(ierr) call PetscFESetQuadrature(mechFE,mechQuad,ierr); CHKERRQ(ierr) call PetscFEGetDimension(mechFE,nBasis,ierr); CHKERRQ(ierr) nBasis = nBasis/nc diff --git a/src/phase_mechanical_plastic_dislotungsten.f90 b/src/phase_mechanical_plastic_dislotungsten.f90 index 1e5e120e5..c759cdaad 100644 --- a/src/phase_mechanical_plastic_dislotungsten.f90 +++ b/src/phase_mechanical_plastic_dislotungsten.f90 @@ -24,7 +24,6 @@ submodule(phase:plastic) dislotungsten tau_Peierls, & !< Peierls stress !* mobility law parameters Q_s, & !< activation energy for glide [J] - v_0, & !< dislocation velocity prefactor [m/s] p, & !< p-exponent in glide velocity q, & !< q-exponent in glide velocity B, & !< friction coefficient @@ -148,7 +147,7 @@ module function plastic_dislotungsten_init() result(myPlasticity) else prm%P_nS_pos = prm%P_sl prm%P_nS_neg = prm%P_sl - endif + end if prm%h_sl_sl = lattice_interaction_SlipBySlip(N_sl,pl%get_as1dFloat('h_sl-sl'), & phase_lattice(ph)) @@ -158,7 +157,6 @@ module function plastic_dislotungsten_init() result(myPlasticity) rho_mob_0 = pl%get_as1dFloat('rho_mob_0', requiredSize=size(N_sl)) rho_dip_0 = pl%get_as1dFloat('rho_dip_0', requiredSize=size(N_sl)) - prm%v_0 = pl%get_as1dFloat('v_0', requiredSize=size(N_sl)) prm%b_sl = pl%get_as1dFloat('b_sl', requiredSize=size(N_sl)) prm%Q_s = pl%get_as1dFloat('Q_s', requiredSize=size(N_sl)) @@ -189,18 +187,16 @@ module function plastic_dislotungsten_init() result(myPlasticity) prm%w = math_expand(prm%w, N_sl) prm%omega = math_expand(prm%omega, N_sl) prm%tau_Peierls = math_expand(prm%tau_Peierls, N_sl) - prm%v_0 = math_expand(prm%v_0, N_sl) prm%B = math_expand(prm%B, N_sl) prm%i_sl = math_expand(prm%i_sl, N_sl) prm%f_at = math_expand(prm%f_at, N_sl) prm%d_caron = pl%get_asFloat('D_a') * prm%b_sl ! sanity checks - if ( prm%D_0 <= 0.0_pReal) extmsg = trim(extmsg)//' D_0' + if ( prm%D_0 < 0.0_pReal) extmsg = trim(extmsg)//' D_0' if ( prm%Q_cl <= 0.0_pReal) extmsg = trim(extmsg)//' Q_cl' if (any(rho_mob_0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho_mob_0' if (any(rho_dip_0 < 0.0_pReal)) extmsg = trim(extmsg)//' rho_dip_0' - if (any(prm%v_0 < 0.0_pReal)) extmsg = trim(extmsg)//' v_0' if (any(prm%b_sl <= 0.0_pReal)) extmsg = trim(extmsg)//' b_sl' if (any(prm%Q_s <= 0.0_pReal)) extmsg = trim(extmsg)//' Q_s' if (any(prm%tau_Peierls < 0.0_pReal)) extmsg = trim(extmsg)//' tau_Peierls' @@ -209,13 +205,13 @@ module function plastic_dislotungsten_init() result(myPlasticity) if (any(prm%f_at <= 0.0_pReal)) extmsg = trim(extmsg)//' f_at or b_sl' else slipActive - rho_mob_0= emptyRealArray; rho_dip_0 = emptyRealArray + rho_mob_0 = emptyRealArray; rho_dip_0 = emptyRealArray allocate(prm%b_sl,prm%d_caron,prm%i_sl,prm%f_at,prm%tau_Peierls, & - prm%Q_s,prm%v_0,prm%p,prm%q,prm%B,prm%h,prm%w,prm%omega, & + prm%Q_s,prm%p,prm%q,prm%B,prm%h,prm%w,prm%omega, & source = emptyRealArray) allocate(prm%forestProjection(0,0)) allocate(prm%h_sl_sl (0,0)) - endif slipActive + end if slipActive !-------------------------------------------------------------------------------------------------- ! allocate state arrays @@ -258,7 +254,7 @@ module function plastic_dislotungsten_init() result(myPlasticity) ! exit if any parameter is out of range if (extmsg /= '') call IO_error(211,ext_msg=trim(extmsg)//'(dislotungsten)') - enddo + end do end function plastic_dislotungsten_init @@ -267,7 +263,7 @@ end function plastic_dislotungsten_init !> @brief Calculate plastic velocity gradient and its tangent. !-------------------------------------------------------------------------------------------------- pure module subroutine dislotungsten_LpAndItsTangent(Lp,dLp_dMp, & - Mp,T,ph,en) + Mp,T,ph,en) real(pReal), dimension(3,3), intent(out) :: & Lp !< plastic velocity gradient real(pReal), dimension(3,3,3,3), intent(out) :: & @@ -287,19 +283,20 @@ pure module subroutine dislotungsten_LpAndItsTangent(Lp,dLp_dMp, & dot_gamma_pos,dot_gamma_neg, & ddot_gamma_dtau_pos,ddot_gamma_dtau_neg + Lp = 0.0_pReal dLp_dMp = 0.0_pReal associate(prm => param(ph)) - call kinetics(Mp,T,ph,en,dot_gamma_pos,dot_gamma_neg,ddot_gamma_dtau_pos,ddot_gamma_dtau_neg) - do i = 1, prm%sum_N_sl - Lp = Lp + (dot_gamma_pos(i)+dot_gamma_neg(i))*prm%P_sl(1:3,1:3,i) - forall (k=1:3,l=1:3,m=1:3,n=1:3) & - dLp_dMp(k,l,m,n) = dLp_dMp(k,l,m,n) & - + ddot_gamma_dtau_pos(i) * prm%P_sl(k,l,i) * prm%P_nS_pos(m,n,i) & - + ddot_gamma_dtau_neg(i) * prm%P_sl(k,l,i) * prm%P_nS_neg(m,n,i) - enddo + call kinetics(Mp,T,ph,en,dot_gamma_pos,dot_gamma_neg,ddot_gamma_dtau_pos,ddot_gamma_dtau_neg) + do i = 1, prm%sum_N_sl + Lp = Lp + (dot_gamma_pos(i)+dot_gamma_neg(i))*prm%P_sl(1:3,1:3,i) + forall (k=1:3,l=1:3,m=1:3,n=1:3) & + dLp_dMp(k,l,m,n) = dLp_dMp(k,l,m,n) & + + ddot_gamma_dtau_pos(i) * prm%P_sl(k,l,i) * prm%P_nS_pos(m,n,i) & + + ddot_gamma_dtau_neg(i) * prm%P_sl(k,l,i) * prm%P_nS_neg(m,n,i) + end do end associate @@ -328,35 +325,36 @@ module subroutine dislotungsten_dotState(Mp,T,ph,en) dot_rho_dip_climb, & d_hat + associate(prm => param(ph), stt => state(ph), dot => dotState(ph), dst => dependentState(ph)) - call kinetics(Mp,T,ph,en,& - dot_gamma_pos,dot_gamma_neg, & - tau_pos_out = tau_pos,tau_neg_out = tau_neg) + call kinetics(Mp,T,ph,en,& + dot_gamma_pos,dot_gamma_neg, & + tau_pos_out = tau_pos,tau_neg_out = tau_neg) - dot%gamma_sl(:,en) = abs(dot_gamma_pos+dot_gamma_neg) + dot%gamma_sl(:,en) = abs(dot_gamma_pos+dot_gamma_neg) - where(dEq0(tau_pos)) ! ToDo: use avg of +/- - dot_rho_dip_formation = 0.0_pReal - dot_rho_dip_climb = 0.0_pReal - else where - d_hat = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos)), & ! ToDo: use avg of +/- - prm%d_caron, & ! lower limit - dst%Lambda_sl(:,en)) ! upper limit - dot_rho_dip_formation = merge(2.0_pReal*(d_hat-prm%d_caron)*stt%rho_mob(:,en)*dot%gamma_sl(:,en)/prm%b_sl, & - 0.0_pReal, & - prm%dipoleformation) - v_cl = (3.0_pReal*prm%mu*prm%D_0*exp(-prm%Q_cl/(kB*T))*prm%f_at/(2.0_pReal*PI*kB*T)) & - * (1.0_pReal/(d_hat+prm%d_caron)) - dot_rho_dip_climb = (4.0_pReal*v_cl*stt%rho_dip(:,en))/(d_hat-prm%d_caron) ! ToDo: Discuss with Franz: Stress dependency? - end where + where(dEq0((tau_pos+tau_neg)*0.5_pReal)) + dot_rho_dip_formation = 0.0_pReal + dot_rho_dip_climb = 0.0_pReal + else where + d_hat = math_clip(3.0_pReal*prm%mu*prm%b_sl/(16.0_pReal*PI*abs(tau_pos+tau_neg)*0.5_pReal), & + prm%d_caron, & ! lower limit + dst%Lambda_sl(:,en)) ! upper limit + dot_rho_dip_formation = merge(2.0_pReal*(d_hat-prm%d_caron)*stt%rho_mob(:,en)*dot%gamma_sl(:,en)/prm%b_sl, & + 0.0_pReal, & + prm%dipoleformation) + v_cl = (3.0_pReal*prm%mu*prm%D_0*exp(-prm%Q_cl/(kB*T))*prm%f_at/(2.0_pReal*PI*kB*T)) & + * (1.0_pReal/(d_hat+prm%d_caron)) + dot_rho_dip_climb = (4.0_pReal*v_cl*stt%rho_dip(:,en))/(d_hat-prm%d_caron) ! ToDo: Discuss with Franz: Stress dependency? + end where - dot%rho_mob(:,en) = dot%gamma_sl(:,en)/(prm%b_sl*dst%Lambda_sl(:,en)) & ! multiplication - - dot_rho_dip_formation & - - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_mob(:,en)*dot%gamma_sl(:,en) ! Spontaneous annihilation of 2 edges - dot%rho_dip(:,en) = dot_rho_dip_formation & - - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_dip(:,en)*dot%gamma_sl(:,en) & ! Spontaneous annihilation of an edge with a dipole - - dot_rho_dip_climb + dot%rho_mob(:,en) = dot%gamma_sl(:,en)/(prm%b_sl*dst%Lambda_sl(:,en)) & ! multiplication + - dot_rho_dip_formation & + - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_mob(:,en)*dot%gamma_sl(:,en) ! Spontaneous annihilation of 2 edges + dot%rho_dip(:,en) = dot_rho_dip_formation & + - (2.0_pReal*prm%d_caron)/prm%b_sl*stt%rho_dip(:,en)*dot%gamma_sl(:,en) & ! Spontaneous annihilation of an edge with a dipole + - dot_rho_dip_climb end associate @@ -368,21 +366,22 @@ end subroutine dislotungsten_dotState !-------------------------------------------------------------------------------------------------- module subroutine dislotungsten_dependentState(ph,en) - integer, intent(in) :: & + integer, intent(in) :: & ph, & en real(pReal), dimension(param(ph)%sum_N_sl) :: & - dislocationSpacing + Lambda_sl_inv associate(prm => param(ph), stt => state(ph), dst => dependentState(ph)) - dislocationSpacing = sqrt(matmul(prm%forestProjection,stt%rho_mob(:,en)+stt%rho_dip(:,en))) dst%tau_pass(:,en) = prm%mu*prm%b_sl & * sqrt(matmul(prm%h_sl_sl,stt%rho_mob(:,en)+stt%rho_dip(:,en))) - dst%Lambda_sl(:,en) = prm%D/(1.0_pReal+prm%D*dislocationSpacing/prm%i_sl) + Lambda_sl_inv = 1.0_pReal/prm%D & + + sqrt(matmul(prm%forestProjection,stt%rho_mob(:,en)+stt%rho_dip(:,en)))/prm%i_sl + dst%Lambda_sl(:,en) = Lambda_sl_inv**(-1.0_pReal) end associate @@ -423,7 +422,7 @@ module subroutine plastic_dislotungsten_results(ph,group) 'threshold stress for slip','Pa',prm%systems_sl) end select - enddo + end do end associate @@ -456,88 +455,91 @@ pure subroutine kinetics(Mp,T,ph,en, & ddot_gamma_dtau_neg, & tau_pos_out, & tau_neg_out + real(pReal), dimension(param(ph)%sum_N_sl) :: & StressRatio, & StressRatio_p,StressRatio_pminus1, & - dvel, vel, & - tau_pos,tau_neg, & + dvel, & + tau_pos, tau_neg, tau_eff, & t_n, t_k, dtk,dtn integer :: j + associate(prm => param(ph), stt => state(ph), dst => dependentState(ph)) - do j = 1, prm%sum_N_sl - tau_pos(j) = math_tensordot(Mp,prm%P_nS_pos(1:3,1:3,j)) - tau_neg(j) = math_tensordot(Mp,prm%P_nS_neg(1:3,1:3,j)) - enddo + do j = 1, prm%sum_N_sl + tau_pos(j) = math_tensordot(Mp,prm%P_nS_pos(1:3,1:3,j)) + tau_neg(j) = math_tensordot(Mp,prm%P_nS_neg(1:3,1:3,j)) + end do + if (present(tau_pos_out)) tau_pos_out = tau_pos + if (present(tau_neg_out)) tau_neg_out = tau_neg - if (present(tau_pos_out)) tau_pos_out = tau_pos - if (present(tau_neg_out)) tau_neg_out = tau_neg + associate(BoltzmannRatio => prm%Q_s/(kB*T), & + b_rho_half => stt%rho_mob(:,en) * prm%b_sl * 0.5_pReal, & + effectiveLength => dst%Lambda_sl(:,en) - prm%w) - associate(BoltzmannRatio => prm%Q_s/(kB*T), & - dot_gamma_0 => stt%rho_mob(:,en)*prm%b_sl*prm%v_0, & - effectiveLength => dst%Lambda_sl(:,en) - prm%w) + tau_eff = abs(tau_pos)-dst%tau_pass(:,en) - significantPositiveTau: where(abs(tau_pos)-dst%tau_pass(:,en) > tol_math_check) - StressRatio = (abs(tau_pos)-dst%tau_pass(:,en))/prm%tau_Peierls - StressRatio_p = StressRatio** prm%p - StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal) + significantPositiveTau: where(tau_eff > tol_math_check) + StressRatio = tau_eff/prm%tau_Peierls + StressRatio_p = StressRatio** prm%p + StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal) - t_n = prm%b_sl/(exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)*prm%omega*effectiveLength) - t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_pos) + t_n = prm%b_sl*exp(BoltzmannRatio*(1.0_pReal-StressRatio_p) ** prm%q) & + / (prm%omega*effectiveLength) + t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_eff) ! corrected eq. (14) - vel = prm%h/(t_n + t_k) + dot_gamma_pos = b_rho_half * sign(prm%h/(t_n + t_k),tau_pos) + else where significantPositiveTau + dot_gamma_pos = 0.0_pReal + end where significantPositiveTau - dot_gamma_pos = dot_gamma_0 * sign(vel,tau_pos) * 0.5_pReal - else where significantPositiveTau - dot_gamma_pos = 0.0_pReal - end where significantPositiveTau + if (present(ddot_gamma_dtau_pos)) then + significantPositiveTau2: where(abs(tau_pos)-dst%tau_pass(:,en) > tol_math_check) + dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) & + * StressRatio_pminus1 / prm%tau_Peierls + dtk = -1.0_pReal * t_k / tau_pos - if (present(ddot_gamma_dtau_pos)) then - significantPositiveTau2: where(abs(tau_pos)-dst%tau_pass(:,en) > tol_math_check) - dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) & - * (StressRatio)**(prm%p - 1.0_pReal) / prm%tau_Peierls - dtk = -1.0_pReal * t_k / tau_pos + dvel = -1.0_pReal * prm%h * (dtk + dtn) / (t_n + t_k)**2.0_pReal - dvel = -1.0_pReal * prm%h * (dtk + dtn) / (t_n + t_k)**2.0_pReal + ddot_gamma_dtau_pos = b_rho_half * dvel + else where significantPositiveTau2 + ddot_gamma_dtau_pos = 0.0_pReal + end where significantPositiveTau2 + end if - ddot_gamma_dtau_pos = dot_gamma_0 * dvel* 0.5_pReal - else where significantPositiveTau2 - ddot_gamma_dtau_pos = 0.0_pReal - end where significantPositiveTau2 - endif + tau_eff = abs(tau_neg)-dst%tau_pass(:,en) - significantNegativeTau: where(abs(tau_neg)-dst%tau_pass(:,en) > tol_math_check) - StressRatio = (abs(tau_neg)-dst%tau_pass(:,en))/prm%tau_Peierls - StressRatio_p = StressRatio** prm%p - StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal) + significantNegativeTau: where(tau_eff > tol_math_check) + StressRatio = tau_eff/prm%tau_Peierls + StressRatio_p = StressRatio** prm%p + StressRatio_pminus1 = StressRatio**(prm%p-1.0_pReal) - t_n = prm%b_sl/(exp(-BoltzmannRatio*(1-StressRatio_p) ** prm%q)*prm%omega*effectiveLength) - t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_pos) + t_n = prm%b_sl*exp(BoltzmannRatio*(1.0_pReal-StressRatio_p) ** prm%q) & + / (prm%omega*effectiveLength) + t_k = effectiveLength * prm%B /(2.0_pReal*prm%b_sl*tau_eff) ! corrected eq. (14) - vel = prm%h/(t_n + t_k) + dot_gamma_neg = b_rho_half * sign(prm%h/(t_n + t_k),tau_neg) + else where significantNegativeTau + dot_gamma_neg = 0.0_pReal + end where significantNegativeTau - dot_gamma_neg = dot_gamma_0 * sign(vel,tau_neg) * 0.5_pReal - else where significantNegativeTau - dot_gamma_neg = 0.0_pReal - end where significantNegativeTau + if (present(ddot_gamma_dtau_neg)) then + significantNegativeTau2: where(abs(tau_neg)-dst%tau_pass(:,en) > tol_math_check) + dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) & + * StressRatio_pminus1 / prm%tau_Peierls + dtk = -1.0_pReal * t_k / tau_neg - if (present(ddot_gamma_dtau_neg)) then - significantNegativeTau2: where(abs(tau_neg)-dst%tau_pass(:,en) > tol_math_check) - dtn = -1.0_pReal * t_n * BoltzmannRatio * prm%p * prm%q * (1.0_pReal-StressRatio_p)**(prm%q - 1.0_pReal) & - * (StressRatio)**(prm%p - 1.0_pReal) / prm%tau_Peierls - dtk = -1.0_pReal * t_k / tau_neg + dvel = -1.0_pReal * prm%h * (dtk + dtn) / (t_n + t_k)**2.0_pReal - dvel = -1.0_pReal * prm%h * (dtk + dtn) / (t_n + t_k)**2.0_pReal + ddot_gamma_dtau_neg = b_rho_half * dvel + else where significantNegativeTau2 + ddot_gamma_dtau_neg = 0.0_pReal + end where significantNegativeTau2 + end if - ddot_gamma_dtau_neg = dot_gamma_0 * dvel * 0.5_pReal - else where significantNegativeTau2 - ddot_gamma_dtau_neg = 0.0_pReal - end where significantNegativeTau2 - end if - - end associate + end associate end associate end subroutine kinetics diff --git a/src/phase_mechanical_plastic_dislotwin.f90 b/src/phase_mechanical_plastic_dislotwin.f90 index ac179d775..de73cee04 100644 --- a/src/phase_mechanical_plastic_dislotwin.f90 +++ b/src/phase_mechanical_plastic_dislotwin.f90 @@ -890,7 +890,8 @@ pure subroutine kinetics_sl(Mp,T,ph,en, & stressRatio = tau_eff/prm%tau_0 StressRatio_p = stressRatio** prm%p Q_kB_T = prm%Q_sl/(kB*T) - v_wait_inverse = prm%v_0**(-1.0_pReal) * exp(Q_kB_T*(1.0_pReal-StressRatio_p)** prm%q) + v_wait_inverse = exp(Q_kB_T*(1.0_pReal-StressRatio_p)** prm%q) & + / prm%v_0 v_run_inverse = prm%B/(tau_eff*prm%b_sl) dot_gamma_sl = sign(stt%rho_mob(:,en)*prm%b_sl/(v_wait_inverse+v_run_inverse),tau) diff --git a/src/prec.f90 b/src/prec.f90 index 2e67ae76a..063a0d565 100644 --- a/src/prec.f90 +++ b/src/prec.f90 @@ -101,7 +101,7 @@ logical elemental pure function dEq(a,b,tol) dEq = abs(a-b) <= tol else dEq = abs(a-b) <= PREAL_EPSILON * maxval(abs([a,b])) - endif + end if end function dEq @@ -139,7 +139,7 @@ logical elemental pure function dEq0(a,tol) dEq0 = abs(a) <= tol else dEq0 = abs(a) <= PREAL_MIN * 10.0_pReal - endif + end if end function dEq0 @@ -178,7 +178,7 @@ logical elemental pure function cEq(a,b,tol) cEq = abs(a-b) <= tol else cEq = abs(a-b) <= PREAL_EPSILON * maxval(abs([a,b])) - endif + end if end function cEq @@ -273,27 +273,27 @@ subroutine selfTest realloc_lhs_test = [1,2] - if (any(realloc_lhs_test/=[1,2])) error stop 'LHS allocation' + if (any(realloc_lhs_test/=[1,2])) error stop 'LHS allocation' call random_number(r) r = r/minval(r) - if(.not. all(dEq(r,r+PREAL_EPSILON))) error stop 'dEq' - if(dEq(r(1),r(2)) .and. dNeq(r(1),r(2))) error stop 'dNeq' - if(.not. all(dEq0(r-(r+PREAL_MIN)))) error stop 'dEq0' + if (.not. all(dEq(r,r+PREAL_EPSILON))) error stop 'dEq' + if (dEq(r(1),r(2)) .and. dNeq(r(1),r(2))) error stop 'dNeq' + if (.not. all(dEq0(r-(r+PREAL_MIN)))) error stop 'dEq0' ! https://www.binaryconvert.com ! https://www.rapidtables.com/convert/number/binary-to-decimal.html f = real(prec_bytesToC_FLOAT(int([-65,+11,-102,+75],C_SIGNED_CHAR)),pReal) - if(dNeq(f(1),20191102.0_pReal,0.0_pReal)) error stop 'prec_bytesToC_FLOAT' + if (dNeq(f(1),20191102.0_pReal,0.0_pReal)) error stop 'prec_bytesToC_FLOAT' f = real(prec_bytesToC_DOUBLE(int([0,0,0,-32,+119,+65,+115,65],C_SIGNED_CHAR)),pReal) - if(dNeq(f(1),20191102.0_pReal,0.0_pReal)) error stop 'prec_bytesToC_DOUBLE' + if (dNeq(f(1),20191102.0_pReal,0.0_pReal)) error stop 'prec_bytesToC_DOUBLE' i = int(prec_bytesToC_INT32_T(int([+126,+23,+52,+1],C_SIGNED_CHAR)),pInt) - if(i(1) /= 20191102_pInt) error stop 'prec_bytesToC_INT32_T' + if (i(1) /= 20191102_pInt) error stop 'prec_bytesToC_INT32_T' i = int(prec_bytesToC_INT64_T(int([+126,+23,+52,+1,0,0,0,0],C_SIGNED_CHAR)),pInt) - if(i(1) /= 20191102_pInt) error stop 'prec_bytesToC_INT64_T' + if (i(1) /= 20191102_pInt) error stop 'prec_bytesToC_INT64_T' end subroutine selfTest