diff --git a/CMakeLists.txt b/CMakeLists.txt index 533b14e85..a6a133fe4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,12 @@ cmake_minimum_required (VERSION 3.10.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 () + # Dummy project to determine compiler names and version project (Prerequisites LANGUAGES) set(ENV{PKG_CONFIG_PATH} "$ENV{PETSC_DIR}/$ENV{PETSC_ARCH}/lib/pkgconfig") @@ -8,81 +14,8 @@ pkg_check_modules (PETSC REQUIRED PETSc>=3.12.0 PETSc<3.16.0) pkg_get_variable (CMAKE_Fortran_COMPILER PETSc fcompiler) pkg_get_variable (CMAKE_C_COMPILER PETSc ccompiler) -find_program (CAT_EXECUTABLE NAMES cat) -execute_process (COMMAND ${CAT_EXECUTABLE} ${PROJECT_SOURCE_DIR}/VERSION - RESULT_VARIABLE DAMASK_VERSION_RETURN - OUTPUT_VARIABLE DAMASK_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - -#--------------------------------------------------------------------------------------- -# Find PETSc from system environment -set(PETSC_DIR $ENV{PETSC_DIR}) -if (PETSC_DIR STREQUAL "") - message (FATAL_ERROR "PETSc location (PETSC_DIR) is not defined") -endif () - -set (petsc_conf_variables "${PETSC_DIR}/lib/petsc/conf/variables") -set (petsc_conf_rules "${PETSC_DIR}/lib/petsc/conf/rules" ) - -# Use existing variables from PETSc -# https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake - -# Generate a temporary makefile to probe the PETSc configuration -# This file will be deleted once the settings from PETSc are parsed into CMake -exec_program (mktemp ARGS -d OUTPUT_VARIABLE TEMPDIR) -set (petsc_config_makefile "${TEMPDIR}/Makefile.petsc") -file (WRITE -"${petsc_config_makefile}" -"## This file was auto generated by CMake -# PETSC_DIR = ${PETSC_DIR} -SHELL = /bin/sh -include ${petsc_conf_rules} -include ${petsc_conf_variables} -INCLUDE_DIRS := \${PETSC_FC_INCLUDES} -LIBRARIES := \${PETSC_WITH_EXTERNAL_LIB} -includes: -\t@echo \${INCLUDE_DIRS} -extlibs: -\t@echo \${LIBRARIES} -") - -# CMake will execute each target in the ${petsc_config_makefile} -# to acquire corresponding PETSc Variables. -find_program (MAKE_EXECUTABLE NAMES gmake make) -# Find the PETSc includes directory settings -execute_process (COMMAND ${MAKE_EXECUTABLE} --no-print-directory -f ${petsc_config_makefile} "includes" - RESULT_VARIABLE PETSC_INCLUDES_RETURN - OUTPUT_VARIABLE petsc_includes - OUTPUT_STRIP_TRAILING_WHITESPACE) -# Find the PETSc external linking directory settings -execute_process (COMMAND ${MAKE_EXECUTABLE} --no-print-directory -f ${petsc_config_makefile} "extlibs" - RESULT_VARIABLE PETSC_EXTERNAL_LIB_RETURN - OUTPUT_VARIABLE petsc_external_lib - OUTPUT_STRIP_TRAILING_WHITESPACE) -# Remove temporary makefile, no need to keep it anymore. -file (REMOVE_RECURSE ${TEMPDIR}) - -# Remove duplicate compiler and linker flags -string (REGEX MATCHALL "-I([^\" ]+)" TMP_LIST "${petsc_includes}") -list (REMOVE_DUPLICATES TMP_LIST) -foreach (dir ${TMP_LIST}) - set (PETSC_INCLUDES "${PETSC_INCLUDES} ${dir}") -endforeach (dir) -string (REGEX MATCHALL "-[lLW]([^\" ]+)" TMP_LIST "${petsc_external_lib}") -list (REMOVE_DUPLICATES TMP_LIST) -foreach (exlib ${TMP_LIST}) - set (PETSC_EXTERNAL_LIB "${PETSC_EXTERNAL_LIB} ${exlib}") -endforeach (exlib) - -message ("Found PETSC_DIR:\n${PETSC_DIR}\n" ) -message ("Found PETSC_INCLUDES:\n${PETSC_INCLUDES}\n" ) -message ("Found PETSC_EXTERNAL_LIB:\n${PETSC_EXTERNAL_LIB}\n") - -#--------------------------------------------------------------------------------------- -# Now start to care about DAMASK - -# DAMASK solver defines project to build -string(TOLOWER ${DAMASK_SOLVER} DAMASK_SOLVER) +# Solver determines name of project +string(TOLOWER "${DAMASK_SOLVER}" DAMASK_SOLVER) if (DAMASK_SOLVER STREQUAL "grid") project (damask-grid HOMEPAGE_URL https://damask.mpie.de LANGUAGES Fortran C) add_definitions (-DGrid) @@ -92,10 +25,13 @@ elseif (DAMASK_SOLVER STREQUAL "mesh") else () message (FATAL_ERROR "Build target (DAMASK_SOLVER) is not defined") endif () -add_definitions (-DDAMASKVERSION="${DAMASK_VERSION}") -add_definitions (-DPETSc) -message ("\nBuilding ${CMAKE_PROJECT_NAME}\n") +file (STRINGS ${PROJECT_SOURCE_DIR}/VERSION DAMASK_VERSION) + +message ("\nBuilding ${CMAKE_PROJECT_NAME} ${DAMASK_VERSION}\n") + +add_definitions (-DPETSc) +add_definitions (-DDAMASKVERSION="${DAMASK_VERSION}") if (CMAKE_BUILD_TYPE STREQUAL "") set (CMAKE_BUILD_TYPE "RELEASE") @@ -139,12 +75,22 @@ if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") include (Compiler-Intel) elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") include (Compiler-GNU) -elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "PGI") - include (Compiler-PGI) 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_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}") diff --git a/PRIVATE b/PRIVATE index be37e81b9..185cb53be 160000 --- a/PRIVATE +++ b/PRIVATE @@ -1 +1 @@ -Subproject commit be37e81b9fde6d75d0e2283be6e2389347f48622 +Subproject commit 185cb53be76eded17565c5fa91bd9b4499cda4b8 diff --git a/VERSION b/VERSION index 7567c1527..e4f75ea49 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v3.0.0-alpha3-137-g0b80252d9 +v3.0.0-alpha3-166-g4eb78249e diff --git a/cmake/Compiler-PGI.cmake b/cmake/Compiler-PGI.cmake deleted file mode 100644 index 8ca8cfc5c..000000000 --- a/cmake/Compiler-PGI.cmake +++ /dev/null @@ -1,52 +0,0 @@ -################################################################################################### -# PGI Compiler -################################################################################################### - -if (OPENMP) - set (OPENMP_FLAGS "-mp") -else () - set (OPENMP_FLAGS "-nomp") -endif () - - -if (OPTIMIZATION STREQUAL "OFF") - set (OPTIMIZATION_FLAGS "-O0" ) -elseif (OPTIMIZATION STREQUAL "DEFENSIVE") - set (OPTIMIZATION_FLAGS "-O2 -fast") -elseif (OPTIMIZATION STREQUAL "AGGRESSIVE") - set (OPTIMIZATION_FLAGS "-O4 -fast -Mvect=sse") -endif () - -set (STANDARD_CHECK "-Mallocatable=03 -Mstandard") - -#------------------------------------------------------------------------------------------------ -# Fine tuning compilation options -set (COMPILE_FLAGS "${COMPILE_FLAGS} -Mpreprocess") -# preprocessor - -set (COMPILE_FLAGS "${COMPILE_FLAGS} -Minfo=all") -# instructs the compiler to produce information on standard error - -set (COMPILE_FLAGS "${COMPILE_FLAGS} -Minform=warn") -# instructs the compiler to display error messages at the specified and higher levels - -set (COMPILE_FLAGS "${COMPILE_FLAGS} -Mdclchk") -# instructs the compiler to require that all program variables be declared - -#------------------------------------------------------------------------------------------------O -# Runtime debugging -set (DEBUG_FLAGS "${DEBUG_FLAGS} -g") -# Includes debugging information in the object module; sets the optimization level to zero unless a -⁠O option is present on the command line -set (DEBUG_FLAGS "${DEBUG_FLAGS} -C") -# Generates code to check array bounds -set (DEBUG_FLAGS "${DEBUG_FLAGS} -Mchkptr") -# Check for NULL pointers (pgf95, pgfortran only) -set (DEBUG_FLAGS "${DEBUG_FLAGS} -Mchkstk") -# Check the stack for available space upon entry to and before the start of a parallel region. Useful when many private variables are declared -set (DEBUG_FLAGS "${DEBUG_FLAGS} -Mbounds") -# Specifies whether array bounds checking is enabled or disabled - -#------------------------------------------------------------------------------------------------ -# precision settings -set (PRECISION_FLAGS "${PRECISION_FLAGS} -r8") -# Determines whether the compiler promotes REAL variables and constants to DOUBLE PRECISION diff --git a/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml b/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml index 610421886..f5353b3b6 100644 --- a/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml +++ b/examples/config/Phase_Dislotwin_TWIP-Steel-FeMnC.yaml @@ -1,7 +1,7 @@ TWIP_Steel_FeMnC: lattice: cF mechanical: - elastic: {type: hooke, C_11: 175.0e9, C_12: 115.0e9, C_44: 135.0e9} + elastic: {type: Hooke, C_11: 175.0e9, C_12: 115.0e9, C_44: 135.0e9} plastic: type: dislotwin output: [rho_mob, rho_dip, gamma_sl, Lambda_sl, tau_pass, f_tw, Lambda_tw, tau_hat_tw, f_tr] diff --git a/examples/config/Phase_Dislotwin_Tungsten.yaml b/examples/config/Phase_Dislotwin_Tungsten.yaml index d49149017..397cfb662 100644 --- a/examples/config/Phase_Dislotwin_Tungsten.yaml +++ b/examples/config/Phase_Dislotwin_Tungsten.yaml @@ -1,7 +1,7 @@ Tungsten: lattice: cI mechanical: - elastic: {type: hooke, C_11: 523.0e9, C_12: 202.0e9, C_44: 161.0e9} # Marinica et al. Journal of Physics: Condensed Matter(2013) + elastic: {type: Hooke, C_11: 523.0e9, C_12: 202.0e9, C_44: 161.0e9} # Marinica et al. Journal of Physics: Condensed Matter(2013) plastic: type: dislotwin D: 2.0e-5 # Average grain size / m diff --git a/examples/config/Phase_Isotropic_AluminumIsotropic.yaml b/examples/config/Phase_Isotropic_AluminumIsotropic.yaml deleted file mode 100644 index 684b6dbb2..000000000 --- a/examples/config/Phase_Isotropic_AluminumIsotropic.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# Kuo, J. C., Mikrostrukturmechanik von Bikristallen mit Kippkorngrenzen. Shaker-Verlag 2004. http://edoc.mpg.de/204079 -Aluminum: - lattice: aP - mechanical: - output: [F, P, F_e, F_p, L_p] - elastic: {type: hooke, C_11: 110.9e9, C_12: 58.34e9} - plastic: - type: isotropic - output: [xi] - xi_0: 31e6 - xi_inf: 63e6 - dot_gamma_0: 0.001 - n: 20 - M: 3 - h_0: 75e6 - a: 2.25 diff --git a/examples/config/Phase_Isotropic_FreeSurface.yaml b/examples/config/Phase_Isotropic_FreeSurface.yaml index 8d8d1354d..649baf992 100644 --- a/examples/config/Phase_Isotropic_FreeSurface.yaml +++ b/examples/config/Phase_Isotropic_FreeSurface.yaml @@ -1,8 +1,8 @@ FreeSurface: - lattice: aP + lattice: cI mechanical: output: [F, P, F_e, F_p, L_p] - elastic: {type: hooke, C_11: 1e8, C_12: 1e6} + elastic: {type: Hooke, C_11: 1e8, C_12: 1e6, C_44: 4.95e7} plastic: type: isotropic output: [xi] diff --git a/examples/config/Phase_Phenopowerlaw_Aluminum.yaml b/examples/config/Phase_Phenopowerlaw_Aluminum.yaml index 24da127fc..f05c18272 100644 --- a/examples/config/Phase_Phenopowerlaw_Aluminum.yaml +++ b/examples/config/Phase_Phenopowerlaw_Aluminum.yaml @@ -2,7 +2,7 @@ Aluminum: lattice: cF mechanical: output: [F, P, F_e, F_p, L_p, O] - elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} plastic: N_sl: [12] a_sl: 2.25 diff --git a/examples/config/Phase_Phenopowerlaw_BCC-Ferrite.yaml b/examples/config/Phase_Phenopowerlaw_BCC-Ferrite.yaml index 03b7e2013..609414dad 100644 --- a/examples/config/Phase_Phenopowerlaw_BCC-Ferrite.yaml +++ b/examples/config/Phase_Phenopowerlaw_BCC-Ferrite.yaml @@ -4,7 +4,7 @@ Ferrite: lattice: cI mechanical: - elastic: {C_11: 233.3e9, C_12: 135.5e9, C_44: 118.0e9, type: hooke} + elastic: {C_11: 233.3e9, C_12: 135.5e9, C_44: 118.0e9, type: Hooke} plastic: N_sl: [12, 12] a_sl: 2.0 diff --git a/examples/config/Phase_Phenopowerlaw_BCC-Martensite.yaml b/examples/config/Phase_Phenopowerlaw_BCC-Martensite.yaml index d2667f111..a14a9a182 100644 --- a/examples/config/Phase_Phenopowerlaw_BCC-Martensite.yaml +++ b/examples/config/Phase_Phenopowerlaw_BCC-Martensite.yaml @@ -4,7 +4,7 @@ Martensite: lattice: cI mechanical: - elastic: {C_11: 417.4e9, C_12: 242.4e9, C_44: 211.1e9, type: hooke} + elastic: {C_11: 417.4e9, C_12: 242.4e9, C_44: 211.1e9, type: Hooke} plastic: N_sl: [12, 12] a_sl: 2.0 diff --git a/examples/config/Phase_Phenopowerlaw_Magnesium.yaml b/examples/config/Phase_Phenopowerlaw_Magnesium.yaml index d42cca09f..050ad0790 100644 --- a/examples/config/Phase_Phenopowerlaw_Magnesium.yaml +++ b/examples/config/Phase_Phenopowerlaw_Magnesium.yaml @@ -4,7 +4,7 @@ Magnesium: c/a: 1.62350 mechanical: output: [F, P, F_e, F_p, L_p, O] - elastic: {C_11: 59.3e9, C_12: 25.7e9, C_13: 21.4e9, C_33: 61.5e9, C_44: 16.4e9, type: hooke} + elastic: {C_11: 59.3e9, C_12: 25.7e9, C_13: 21.4e9, C_33: 61.5e9, C_44: 16.4e9, type: Hooke} plastic: N_sl: [3, 3, 0, 6, 0, 6] N_tw: [6, 0, 0, 6] diff --git a/examples/config/Phase_Phenopowerlaw_cpTi.yaml b/examples/config/Phase_Phenopowerlaw_cpTi.yaml index 2a444d570..6300a74e1 100644 --- a/examples/config/Phase_Phenopowerlaw_cpTi.yaml +++ b/examples/config/Phase_Phenopowerlaw_cpTi.yaml @@ -6,7 +6,7 @@ cpTi: c/a: 1.587 mechanical: output: [F, P, F_e, F_p, L_p, O] - elastic: {C_11: 160.0e9, C_12: 90.0e9, C_13: 66.0e9, C_33: 181.7e9, C_44: 46.5e9, type: hooke} + elastic: {C_11: 160.0e9, C_12: 90.0e9, C_13: 66.0e9, C_33: 181.7e9, C_44: 46.5e9, type: Hooke} plastic: N_sl: [3, 3, 0, 6, 12] a_sl: 2.0 diff --git a/examples/config/phase/Al.yaml b/examples/config/phase/Al.yaml index 9d6daf88f..57004df14 100644 --- a/examples/config/phase/Al.yaml +++ b/examples/config/phase/Al.yaml @@ -1,4 +1,4 @@ -lattice: cF -rho: 2700 references: - en.wikipedia.org/wiki/Aluminium +lattice: cF +rho: 2700.0 diff --git a/examples/config/phase/Au.yaml b/examples/config/phase/Au.yaml new file mode 100644 index 000000000..23c1f30f1 --- /dev/null +++ b/examples/config/phase/Au.yaml @@ -0,0 +1,4 @@ +references: + - en.wikipedia.org/wiki/Gold +lattice: cF +rho: 19300.0 diff --git a/examples/config/phase/Cu.yaml b/examples/config/phase/Cu.yaml new file mode 100644 index 000000000..bcf9e8717 --- /dev/null +++ b/examples/config/phase/Cu.yaml @@ -0,0 +1,4 @@ +references: + - en.wikipedia.org/wiki/Copper +lattice: cF +rho: 8960.0 diff --git a/examples/config/phase/Fe.yaml b/examples/config/phase/Fe.yaml index e8d39fdbe..cce09d634 100644 --- a/examples/config/phase/Fe.yaml +++ b/examples/config/phase/Fe.yaml @@ -1,4 +1,4 @@ -lattice: cI -rho: 7874 references: - en.wikipedia.org/wiki/Iron +lattice: cI +rho: 7874.0 diff --git a/examples/config/phase/Ni.yaml b/examples/config/phase/Ni.yaml index 49adb9e11..1f9316118 100644 --- a/examples/config/phase/Ni.yaml +++ b/examples/config/phase/Ni.yaml @@ -1,4 +1,4 @@ -lattice: cF -rho: 8908 references: - en.wikipedia.org/wiki/Nickel +lattice: cF +rho: 8908.0 diff --git a/examples/config/phase/Ti.yaml b/examples/config/phase/Ti.yaml new file mode 100644 index 000000000..a9811786b --- /dev/null +++ b/examples/config/phase/Ti.yaml @@ -0,0 +1,6 @@ +references: + - www.totalmateria.com/page.aspx?ID=CheckArticle&site=ktn&NM=221 + - en.wikipedia.org/wiki/Titanium +lattice: hP +c/a: 1.587 +rho: 4506.0 diff --git a/examples/config/phase/W.yaml b/examples/config/phase/W.yaml new file mode 100644 index 000000000..c770bb891 --- /dev/null +++ b/examples/config/phase/W.yaml @@ -0,0 +1,4 @@ +references: + - en.wikipedia.org/wiki/Tungsten +lattice: cF +rho: 19300.0 diff --git a/examples/config/phase/alpha-Ti.yaml b/examples/config/phase/alpha-Ti.yaml deleted file mode 100644 index 5bd2580a2..000000000 --- a/examples/config/phase/alpha-Ti.yaml +++ /dev/null @@ -1,2 +0,0 @@ -lattice: hP -c/a: 1.587 diff --git a/examples/config/phase/mechanical/eigen/thermalexpansion_Al.yaml b/examples/config/phase/mechanical/eigen/thermalexpansion_Al.yaml new file mode 100644 index 000000000..1876141f6 --- /dev/null +++ b/examples/config/phase/mechanical/eigen/thermalexpansion_Al.yaml @@ -0,0 +1,5 @@ +type: thermalexpansion +references: + - en.wikipedia.org/wiki/Thermal_expansion +A_11: [23.1e-6] +T_ref: 293.15 diff --git a/examples/config/phase/mechanical/eigen/thermalexpansion_Au.yaml b/examples/config/phase/mechanical/eigen/thermalexpansion_Au.yaml new file mode 100644 index 000000000..5d8030e1e --- /dev/null +++ b/examples/config/phase/mechanical/eigen/thermalexpansion_Au.yaml @@ -0,0 +1,5 @@ +type: thermalexpansion +references: + - en.wikipedia.org/wiki/Thermal_expansion +A_11: [14e-6] +T_ref: 293.15 diff --git a/examples/config/phase/mechanical/eigen/thermalexpansion_C35E.yaml b/examples/config/phase/mechanical/eigen/thermalexpansion_C35E.yaml new file mode 100644 index 000000000..dea09aa43 --- /dev/null +++ b/examples/config/phase/mechanical/eigen/thermalexpansion_C35E.yaml @@ -0,0 +1,5 @@ +type: thermalexpansion +references: + - en.wikipedia.org/wiki/Thermal_expansion, fitted from image description +A_11: [12.70371e-6, 7.54e-9, -1.0e-11] +T_ref: 273.0 diff --git a/examples/config/phase/mechanical/eigen/thermalexpansion_Cu.yaml b/examples/config/phase/mechanical/eigen/thermalexpansion_Cu.yaml new file mode 100644 index 000000000..3eb41aa90 --- /dev/null +++ b/examples/config/phase/mechanical/eigen/thermalexpansion_Cu.yaml @@ -0,0 +1,5 @@ +type: thermalexpansion +references: + - en.wikipedia.org/wiki/Thermal_expansion +A_11: [17e-6] +T_ref: 293.15 diff --git a/examples/config/phase/mechanical/eigen/thermalexpansion_Fe.yaml b/examples/config/phase/mechanical/eigen/thermalexpansion_Fe.yaml new file mode 100644 index 000000000..f36250490 --- /dev/null +++ b/examples/config/phase/mechanical/eigen/thermalexpansion_Fe.yaml @@ -0,0 +1,5 @@ +type: thermalexpansion +references: + - en.wikipedia.org/wiki/Thermal_expansion +A_11: [11.8e-6] +T_ref: 293.15 diff --git a/examples/config/phase/mechanical/eigen/thermalexpansion_W.yaml b/examples/config/phase/mechanical/eigen/thermalexpansion_W.yaml new file mode 100644 index 000000000..a6d069bd3 --- /dev/null +++ b/examples/config/phase/mechanical/eigen/thermalexpansion_W.yaml @@ -0,0 +1,5 @@ +type: thermalexpansion +references: + - en.wikipedia.org/wiki/Thermal_expansion +A_11: [4.5e-6] +T_ref: 293.15 diff --git a/examples/config/phase/mechanical/eigen/thermalexpansion_X20Cr13.yaml b/examples/config/phase/mechanical/eigen/thermalexpansion_X20Cr13.yaml new file mode 100644 index 000000000..7842b9d6d --- /dev/null +++ b/examples/config/phase/mechanical/eigen/thermalexpansion_X20Cr13.yaml @@ -0,0 +1,5 @@ +type: thermalexpansion +references: + - en.wikipedia.org/wiki/Thermal_expansion, fitted from image description +A_11: [11.365e-6, 5.0e-9] +T_ref: 273.0 diff --git a/examples/config/phase/mechanical/elastic/Hooke_Cu.yaml b/examples/config/phase/mechanical/elastic/Hooke_Cu.yaml new file mode 100644 index 000000000..b55c83bdf --- /dev/null +++ b/examples/config/phase/mechanical/elastic/Hooke_Cu.yaml @@ -0,0 +1,6 @@ +type: Hooke +references: + - www.mit.edu/~6.777/matprops/copper.htm, fixed typo +C_11: 168.3e9 +C_12: 122.1e9 +C_44: 75.7e9 diff --git a/examples/config/phase/mechanical/elastic/Hooke_cpTi.yaml b/examples/config/phase/mechanical/elastic/Hooke_Ti.yaml similarity index 100% rename from examples/config/phase/mechanical/elastic/Hooke_cpTi.yaml rename to examples/config/phase/mechanical/elastic/Hooke_Ti.yaml diff --git a/examples/config/phase/mechanical/elastic/Hooke_W.yaml b/examples/config/phase/mechanical/elastic/Hooke_W.yaml new file mode 100644 index 000000000..58561106a --- /dev/null +++ b/examples/config/phase/mechanical/elastic/Hooke_W.yaml @@ -0,0 +1,8 @@ +type: Hooke +references: + - D. Cereceda et al., + International Journal of Plasticity, 78, 242-265, 2016, + 10.1016/j.ijplas.2015.09.002 +C_11: 523.e9 +C_12: 202.e9 +C_44: 161.e9 diff --git a/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml b/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml index b5defb6db..3da7038a2 100644 --- a/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml +++ b/examples/config/phase/mechanical/plastic/dislotwin_IF-steel.yaml @@ -1,7 +1,7 @@ type: dislotwin references: - K. Sedighiani et al., - International Journal of Plasticity, 134, 102779, 2020 + International Journal of Plasticity, 134, 102779, 2020, 10.1016/j.ijplas.2020.102779 - K. Sedighiani et al., Mechanics of Materials, submitted diff --git a/examples/config/phase/mechanical/plastic/phenopowerlaw_Au.yaml b/examples/config/phase/mechanical/plastic/phenopowerlaw_Au.yaml index 840f3ff30..baf7c7c14 100644 --- a/examples/config/phase/mechanical/plastic/phenopowerlaw_Au.yaml +++ b/examples/config/phase/mechanical/plastic/phenopowerlaw_Au.yaml @@ -1,14 +1,17 @@ -# parameters fitted by D. Ma to: -# On the mathematical description of the tensile stress-strain curves of polycrystalline face centered cubic metals -# International Journal of Plasticity, Volume 12, Issue 1, 1996, Pages 35-43 -# DOI: 10.1016/S0749-6419(95)00043-7 type: phenopowerlaw -output: [xi_sl] +references: + - D. Ma et al., + Acta Materialia, 103, 796-808, 2016, + 10.1016/j.actamat.2015.11.016 + - I. Kovács and G.Vörös, + International Journal of Plasticity, 12, 35-43, 1996, + 10.1016/S0749-6419(95)00043-7 +output: [xi_sl, gamma_sl] N_sl: [12] -n_sl: 83 +n_sl: 83.3 dot_gamma_0_sl: 0.001 -h_0_sl_sl: 75e6 +h_0_sl_sl: 75.0e6 h_sl_sl: [1, 1, 1.4, 1.4, 1.4, 1.4, 1.4] a_sl: 1.0 -xi_0_sl: [26e6] -xi_inf_sl: [53e6] +xi_0_sl: [26.25e6] +xi_inf_sl: [53.0e6] diff --git a/examples/config/phase/thermal/Al.yaml b/examples/config/phase/thermal/Al.yaml index 8837f30af..1f714c743 100644 --- a/examples/config/phase/thermal/Al.yaml +++ b/examples/config/phase/thermal/Al.yaml @@ -1,7 +1,5 @@ references: - www.engineeringtoolbox.com/thermal-conductivity-metals-d_858.html - www.engineeringtoolbox.com/specific-heat-metals-d_152.html -c_p: 0.91e3 +C_p: 910.0 K_11: 236.0 -K_22: 236.0 -K_33: 236.0 diff --git a/examples/config/phase/thermal/Au.yaml b/examples/config/phase/thermal/Au.yaml new file mode 100644 index 000000000..f8f4dda4d --- /dev/null +++ b/examples/config/phase/thermal/Au.yaml @@ -0,0 +1,4 @@ +references: + - de.wikipedia.org/wiki/Gold +C_p: 128.0 +K_11: 320.0 diff --git a/examples/config/phase/thermal/Cu.yaml b/examples/config/phase/thermal/Cu.yaml new file mode 100644 index 000000000..7f5b89fcc --- /dev/null +++ b/examples/config/phase/thermal/Cu.yaml @@ -0,0 +1,4 @@ +references: + - www.mit.edu/~6.777/matprops/copper.htm +C_p: 385.0 +K_11: 401.0 diff --git a/examples/config/phase/thermal/Steel-0.5C.yaml b/examples/config/phase/thermal/Steel-0.5C.yaml index 861cbbee5..736969e1e 100644 --- a/examples/config/phase/thermal/Steel-0.5C.yaml +++ b/examples/config/phase/thermal/Steel-0.5C.yaml @@ -1,7 +1,5 @@ references: - www.engineeringtoolbox.com/thermal-conductivity-metals-d_858.html - www.engineeringtoolbox.com/specific-heat-metals-d_152.html -c_p: 0.49e3 +C_p: 490.0 K_11: 54.0 -K_22: 54.0 -K_33: 54.0 diff --git a/examples/config/phase/thermal/W.yaml b/examples/config/phase/thermal/W.yaml new file mode 100644 index 000000000..eba6ab7bc --- /dev/null +++ b/examples/config/phase/thermal/W.yaml @@ -0,0 +1,4 @@ +references: + - www.mit.edu/~6.777/matprops/tungsten.htm +C_p: 132.51 +K_11: 178.0 diff --git a/examples/config/phase/thermal/adiabatic.yaml b/examples/config/phase/thermal/adiabatic.yaml index c0956cb0d..9b4932af7 100644 --- a/examples/config/phase/thermal/adiabatic.yaml +++ b/examples/config/phase/thermal/adiabatic.yaml @@ -1,4 +1,3 @@ -c_p: 1 +C_p: 1 K_11: 0 -K_22: 0 K_33: 0 diff --git a/examples/config/phase/thermal/fast-convection.yaml b/examples/config/phase/thermal/fast-convection.yaml index c266acf1e..4899baaf2 100644 --- a/examples/config/phase/thermal/fast-convection.yaml +++ b/examples/config/phase/thermal/fast-convection.yaml @@ -1,4 +1,3 @@ -c_p: 1 +C_p: 1 K_11: 1e30 -K_22: 1e30 K_33: 1e30 diff --git a/python/tests/reference/ConfigMaterial/material.yaml b/python/tests/reference/ConfigMaterial/material.yaml index 48ebd98e3..6fdbbb52a 100644 --- a/python/tests/reference/ConfigMaterial/material.yaml +++ b/python/tests/reference/ConfigMaterial/material.yaml @@ -36,9 +36,9 @@ phase: lattice: cF mechanics: output: [F, P, F_e, F_p, L_p] - elasticity: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elasticity: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} Steel: lattice: cI mechanics: output: [F, P, F_e, F_p, L_p] - elasticity: {C_11: 233.3e9, C_12: 135.5e9, C_44: 118.0e9, type: hooke} + elasticity: {C_11: 233.3e9, C_12: 135.5e9, C_44: 118.0e9, type: Hooke} diff --git a/python/tests/reference/Result/12grains6x7x8.material.yaml b/python/tests/reference/Result/12grains6x7x8.material.yaml index 8d3f53cfb..741f6457e 100644 --- a/python/tests/reference/Result/12grains6x7x8.material.yaml +++ b/python/tests/reference/Result/12grains6x7x8.material.yaml @@ -9,7 +9,7 @@ phase: lattice: cF mechanical: output: [F, P, F_e, F_p, L_p, O] - elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} plastic: N_sl: [12] a_sl: 2.25 @@ -26,7 +26,7 @@ phase: lattice: cI mechanical: output: [F, P, F_e, F_p, L_p, O] - elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} plastic: N_sl: [12] a_sl: 2.25 diff --git a/python/tests/reference/Result/4grains2x4x3.material.yaml b/python/tests/reference/Result/4grains2x4x3.material.yaml index ff2c90164..6b7c83809 100644 --- a/python/tests/reference/Result/4grains2x4x3.material.yaml +++ b/python/tests/reference/Result/4grains2x4x3.material.yaml @@ -641,7 +641,7 @@ phase: lattice: cF mechanical: output: [F, F_e, F_p, L_p] - elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} plastic: N_sl: [12] a_sl: 2.25 @@ -658,7 +658,7 @@ phase: lattice: cI mechanical: output: [F, P, F_e, F_p, L_p, O] - elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} plastic: N_sl: [12] a_sl: 2.25 @@ -675,4 +675,4 @@ phase: lattice: cI mechanical: output: [F] - elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} diff --git a/python/tests/reference/Result/6grains6x7x8_single_phase.material.yaml b/python/tests/reference/Result/6grains6x7x8_single_phase.material.yaml index a06d679db..1894d4b2b 100644 --- a/python/tests/reference/Result/6grains6x7x8_single_phase.material.yaml +++ b/python/tests/reference/Result/6grains6x7x8_single_phase.material.yaml @@ -9,7 +9,7 @@ phase: lattice: cF mechanical: output: [F, P, F_e, F_p, L_p, O] - elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: hooke} + elastic: {C_11: 106.75e9, C_12: 60.41e9, C_44: 28.34e9, type: Hooke} plastic: N_sl: [12] a_sl: 2.25 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c20754a67..af0c75223 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,23 +14,23 @@ list(FILTER damask-sources EXCLUDE REGEX ".*commercialFEM_fileList.*.f90") if (PROJECT_NAME STREQUAL "damask-grid") - file(GLOB grid-sources grid/*.f90) + file(GLOB grid-sources grid/*.f90) - if(NOT CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") + if (NOT CMAKE_BUILD_TYPE STREQUAL "SYNTAXONLY") add_executable(DAMASK_grid ${damask-sources} ${grid-sources}) install (TARGETS DAMASK_grid RUNTIME DESTINATION bin) - else() + 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() + endif () elseif (PROJECT_NAME STREQUAL "damask-mesh") - file(GLOB mesh-sources mesh/*.f90) + file(GLOB mesh-sources mesh/*.f90) - add_executable(DAMASK_mesh ${damask-sources} ${mesh-sources}) - install (TARGETS DAMASK_mesh RUNTIME DESTINATION bin) + add_executable(DAMASK_mesh ${damask-sources} ${mesh-sources}) + install (TARGETS DAMASK_mesh RUNTIME DESTINATION bin) -endif() +endif () diff --git a/src/DAMASK_interface.f90 b/src/DAMASK_interface.f90 index e01c050fa..43398d0ad 100644 --- a/src/DAMASK_interface.f90 +++ b/src/DAMASK_interface.f90 @@ -96,15 +96,10 @@ subroutine DAMASK_interface_init print'(/,a)', ' Version: '//DAMASKVERSION - ! https://github.com/jeffhammond/HPCInfo/blob/master/docs/Preprocessor-Macros.md -#if defined(__PGI) - print'(/,a,i4.4,a,i8.8)', ' Compiled with PGI fortran version :', __PGIC__,& - '.', __PGIC_MINOR__ -#else print'(/,a)', ' Compiled with: '//compiler_version() print'(a)', ' Compiler options: '//compiler_options() -#endif + ! https://github.com/jeffhammond/HPCInfo/blob/master/docs/Preprocessor-Macros.md print'(/,a)', ' Compiled on: '//__DATE__//' at '//__TIME__ print'(/,a,i0,a,i0,a,i0)', & diff --git a/src/homogenization_mechanical_RGC.f90 b/src/homogenization_mechanical_RGC.f90 index 6392e00db..8e94a1b5c 100644 --- a/src/homogenization_mechanical_RGC.f90 +++ b/src/homogenization_mechanical_RGC.f90 @@ -89,7 +89,7 @@ module subroutine RGC_init(num_homogMech) print'(/,a)', ' <<<+- homogenization:mechanical:RGC init -+>>>' - print'(a,i2)', ' # instances: ',count(homogenization_type == HOMOGENIZATION_RGC_ID) + print'(a,i0)', ' # homogenizations: ',count(homogenization_type == HOMOGENIZATION_RGC_ID) flush(IO_STDOUT) print*, 'D.D. Tjahjanto et al., International Journal of Material Forming 2(1):939–942, 2009' diff --git a/src/homogenization_mechanical_isostrain.f90 b/src/homogenization_mechanical_isostrain.f90 index 1dfac425c..b35aea6e4 100644 --- a/src/homogenization_mechanical_isostrain.f90 +++ b/src/homogenization_mechanical_isostrain.f90 @@ -19,7 +19,7 @@ module subroutine isostrain_init print'(/,a)', ' <<<+- homogenization:mechanical:isostrain init -+>>>' - print'(a,i2)', ' # instances: ',count(homogenization_type == HOMOGENIZATION_ISOSTRAIN_ID) + print'(a,i0)', ' # homogenizations: ',count(homogenization_type == HOMOGENIZATION_ISOSTRAIN_ID) flush(IO_STDOUT) do ho = 1, size(homogenization_type) diff --git a/src/homogenization_mechanical_pass.f90 b/src/homogenization_mechanical_pass.f90 index 0728d8a06..dda50c409 100644 --- a/src/homogenization_mechanical_pass.f90 +++ b/src/homogenization_mechanical_pass.f90 @@ -19,7 +19,7 @@ module subroutine pass_init print'(/,a)', ' <<<+- homogenization:mechanical:pass init -+>>>' - print'(a,i2)', ' # instances: ',count(homogenization_type == HOMOGENIZATION_NONE_ID) + print'(a,i0)', ' # homogenizations: ',count(homogenization_type == HOMOGENIZATION_NONE_ID) flush(IO_STDOUT) do ho = 1, size(homogenization_type) diff --git a/src/lattice.f90 b/src/lattice.f90 index 0fb2f9d64..d5611f3d2 100644 --- a/src/lattice.f90 +++ b/src/lattice.f90 @@ -296,7 +296,6 @@ module lattice integer, parameter :: & BCT_NSLIP = sum(BCT_NSLIPSYSTEM) !< total # of slip systems for bct - real(pReal), dimension(3+3,BCT_NSLIP), parameter :: & BCT_SYSTEMSLIP = reshape(real([& ! {100)<001] systems @@ -366,30 +365,13 @@ module lattice 1, 1, 1, 1,-2, 1 & ],pReal),shape(BCT_SYSTEMSLIP)) !< bct slip systems for c/a = 0.5456 (Sn), sorted by Bieler 2009 (https://doi.org/10.1007/s11664-009-0909-x) -!-------------------------------------------------------------------------------------------------- -! orthorhombic primitive (oP) - integer, dimension(*), parameter :: & - ORT_NCLEAVAGESYSTEM = [1, 1, 1] !< # of cleavage systems per family for orthorhombic primitive - - integer, parameter :: & - ORT_NCLEAVAGE = sum(ORT_NCLEAVAGESYSTEM) !< total # of cleavage systems for orthorhombic primitive - - real(pReal), dimension(3+3,ORT_NCLEAVAGE), parameter :: & - ORT_SYSTEMCLEAVAGE = reshape(real([& - 0, 1, 0, 1, 0, 0, & - 0, 0, 1, 0, 1, 0, & - 1, 0, 0, 0, 0, 1 & - ],pReal),shape(ORT_SYSTEMCLEAVAGE)) !< orthorhombic primitive cleavage systems - enum, bind(c); enumerator :: & lattice_UNDEFINED_ID, & - lattice_ISO_ID, & lattice_FCC_ID, & lattice_BCC_ID, & - lattice_BCT_ID, & lattice_HEX_ID, & - lattice_ORT_ID + lattice_BCT_ID end enum ! SHOULD NOT BE PART OF LATTICE BEGIN @@ -414,12 +396,10 @@ module lattice public :: & lattice_init, & - lattice_ISO_ID, & lattice_FCC_ID, & lattice_BCC_ID, & - lattice_BCT_ID, & lattice_HEX_ID, & - lattice_ORT_ID, & + lattice_BCT_ID, & lattice_equivalent_nu, & lattice_equivalent_mu, & lattice_applyLatticeSymmetry33, & @@ -479,13 +459,11 @@ subroutine lattice_init elasticity => mech%get('elastic') lattice_C66(1,1,ph) = elasticity%get_asFloat('C_11') lattice_C66(1,2,ph) = elasticity%get_asFloat('C_12') + lattice_C66(4,4,ph) = elasticity%get_asFloat('C_44') lattice_C66(1,3,ph) = elasticity%get_asFloat('C_13',defaultVal=0.0_pReal) - lattice_C66(2,2,ph) = elasticity%get_asFloat('C_22',defaultVal=0.0_pReal) lattice_C66(2,3,ph) = elasticity%get_asFloat('C_23',defaultVal=0.0_pReal) lattice_C66(3,3,ph) = elasticity%get_asFloat('C_33',defaultVal=0.0_pReal) - lattice_C66(4,4,ph) = elasticity%get_asFloat('C_44',defaultVal=0.0_pReal) - lattice_C66(5,5,ph) = elasticity%get_asFloat('C_55',defaultVal=0.0_pReal) lattice_C66(6,6,ph) = elasticity%get_asFloat('C_66',defaultVal=0.0_pReal) select case(phase%get_asString('lattice')) @@ -497,10 +475,6 @@ subroutine lattice_init lattice_structure(ph) = lattice_HEX_ID case('tI') lattice_structure(ph) = lattice_BCT_ID - case('oP') - lattice_structure(ph) = lattice_ORT_ID - case('aP') - lattice_structure(ph) = lattice_ISO_ID case default call IO_error(130,ext_msg='lattice_init: '//phase%get_asString('lattice')) end select @@ -510,7 +484,7 @@ subroutine lattice_init lattice_nu(ph) = lattice_equivalent_nu(lattice_C66(1:6,1:6,ph),'voigt') lattice_mu(ph) = lattice_equivalent_mu(lattice_C66(1:6,1:6,ph),'voigt') - lattice_C66(1:6,1:6,ph) = math_sym3333to66(math_Voigt66to3333(lattice_C66(1:6,1:6,ph))) ! Literature data is in Voigt notation + lattice_C66(1:6,1:6,ph) = math_sym3333to66(math_Voigt66to3333(lattice_C66(1:6,1:6,ph))) ! Literature data is in Voigt notation do i = 1, 6 if (abs(lattice_C66(i,i,ph)) @brief Return 3x3 tensor with symmetry according to given crystal structure !-------------------------------------------------------------------------------------------------- -function lattice_applyLatticeSymmetry33(T,structure) result(T_sym) +pure function lattice_applyLatticeSymmetry33(T,structure) result(T_sym) real(pReal), dimension(3,3) :: T_sym real(pReal), dimension(3,3), intent(in) :: T character(len=*), intent(in) :: structure - integer :: k T_sym = 0.0_pReal select case(structure) - case('aP','cF','cI') - do k=1,3 - T_sym(k,k) = T(1,1) - enddo - case('hP') + case('cF','cI') + T_sym(1,1) = T(1,1) + T_sym(2,2) = T(1,1) + T_sym(3,3) = T(1,1) + case('hP','tI') T_sym(1,1) = T(1,1) T_sym(2,2) = T(1,1) T_sym(3,3) = T(3,3) - case('oP','tI') - T_sym(1,1) = T(1,1) - T_sym(2,2) = T(2,2) - T_sym(3,3) = T(3,3) - case default - call IO_error(137,ext_msg='lattice_applyLatticeSymmetry33: '//trim(structure)) end select end function lattice_applyLatticeSymmetry33 @@ -1727,77 +1691,45 @@ end function lattice_applyLatticeSymmetry33 !> @brief Return stiffness matrix in 6x6 notation with symmetry according to given crystal structure !> @details J. A. Rayne and B. S. Chandrasekhar Phys. Rev. 120, 1658 Erratum Phys. Rev. 122, 1962 !-------------------------------------------------------------------------------------------------- -function applyLatticeSymmetryC66(C66,structure) result(C66_sym) +pure function applyLatticeSymmetryC66(C66,structure) result(C66_sym) real(pReal), dimension(6,6) :: C66_sym real(pReal), dimension(6,6), intent(in) :: C66 character(len=*), intent(in) :: structure - integer :: j,k + integer :: i,j + C66_sym = 0.0_pReal select case(structure) - case ('aP') - do k=1,3 - do j=1,3 - C66_sym(k,j) = C66(1,2) - enddo - C66_sym(k,k) = C66(1,1) - C66_sym(k+3,k+3) = 0.5_pReal*(C66(1,1)-C66(1,2)) - enddo case ('cF','cI') - do k=1,3 - do j=1,3 - C66_sym(k,j) = C66(1,2) - enddo - C66_sym(k,k) = C66(1,1) - C66_sym(k+3,k+3) = C66(4,4) - enddo + C66_sym(1,1) = C66(1,1); C66_sym(2,2) = C66(1,1); C66_sym(3,3) = C66(1,1) + C66_sym(1,2) = C66(1,2); C66_sym(1,3) = C66(1,2); C66_sym(2,3) = C66(1,2) + C66_sym(4,4) = C66(4,4); C66_sym(5,5) = C66(4,4); C66_sym(6,6) = C66(4,4) ! isotropic C_44 = (C_11-C_12)/2 case ('hP') - C66_sym(1,1) = C66(1,1) - C66_sym(2,2) = C66(1,1) + C66_sym(1,1) = C66(1,1); C66_sym(2,2) = C66(1,1) C66_sym(3,3) = C66(3,3) C66_sym(1,2) = C66(1,2) - C66_sym(2,1) = C66(1,2) - C66_sym(1,3) = C66(1,3) - C66_sym(3,1) = C66(1,3) - C66_sym(2,3) = C66(1,3) - C66_sym(3,2) = C66(1,3) - C66_sym(4,4) = C66(4,4) - C66_sym(5,5) = C66(4,4) + C66_sym(1,3) = C66(1,3); C66_sym(2,3) = C66(1,3) + C66_sym(4,4) = C66(4,4); C66_sym(5,5) = C66(4,4) C66_sym(6,6) = 0.5_pReal*(C66(1,1)-C66(1,2)) - case ('oP') - C66_sym(1,1) = C66(1,1) - C66_sym(2,2) = C66(2,2) - C66_sym(3,3) = C66(3,3) - C66_sym(1,2) = C66(1,2) - C66_sym(2,1) = C66(1,2) - C66_sym(1,3) = C66(1,3) - C66_sym(3,1) = C66(1,3) - C66_sym(2,3) = C66(2,3) - C66_sym(3,2) = C66(2,3) - C66_sym(4,4) = C66(4,4) - C66_sym(5,5) = C66(5,5) - C66_sym(6,6) = C66(6,6) case ('tI') - C66_sym(1,1) = C66(1,1) - C66_sym(2,2) = C66(1,1) + C66_sym(1,1) = C66(1,1); C66_sym(2,2) = C66(1,1) C66_sym(3,3) = C66(3,3) C66_sym(1,2) = C66(1,2) - C66_sym(2,1) = C66(1,2) - C66_sym(1,3) = C66(1,3) - C66_sym(3,1) = C66(1,3) - C66_sym(2,3) = C66(1,3) - C66_sym(3,2) = C66(1,3) - C66_sym(4,4) = C66(4,4) - C66_sym(5,5) = C66(4,4) + C66_sym(1,3) = C66(1,3); C66_sym(2,3) = C66(1,3) + C66_sym(4,4) = C66(4,4); C66_sym(5,5) = C66(4,4) C66_sym(6,6) = C66(6,6) - case default - call IO_error(137,ext_msg='applyLatticeSymmetryC66: '//trim(structure)) end select + do i = 1, 6 + do j = i+1, 6 + C66_sym(j,i) = C66_sym(i,j) + enddo + enddo + end function applyLatticeSymmetryC66 @@ -2011,7 +1943,7 @@ function buildCoordinateSystem(active,potential,system,structure,cOverA) select case(structure) - case ('cF','cI','aP','oP','tI') + case ('cF','cI','tI') direction = system(1:3,p) normal = system(4:6,p) @@ -2246,7 +2178,6 @@ function lattice_equivalent_nu(C,assumption) result(nu) / (S(1,1)+S(2,2)+S(3,3) +2.0_pReal*(S(1,2)+S(2,3)+S(1,3))) else error stop 'invalid assumption' - K = 0.0_pReal endif mu = lattice_equivalent_mu(C,assumption) @@ -2279,7 +2210,6 @@ function lattice_equivalent_mu(C,assumption) result(mu) / (4.0_pReal*(S(1,1)+S(2,2)+S(3,3)) -4.0_pReal*(S(1,2)+S(2,3)+S(1,3)) +3.0_pReal*(S(4,4)+S(5,5)+S(6,6))) else error stop 'invalid assumption' - mu = 0.0_pReal endif end function lattice_equivalent_mu @@ -2293,9 +2223,12 @@ subroutine selfTest real(pReal), dimension(:,:,:), allocatable :: CoSy real(pReal), dimension(:,:), allocatable :: system - real(pReal), dimension(6,6) :: C + real(pReal), dimension(6,6) :: C, C_cF, C_cI, C_hP, C_tI + real(pReal), dimension(3,3) :: T, T_cF, T_cI, T_hP, T_tI real(pReal), dimension(2) :: r - real(pReal) :: lambda + real(pReal) :: lambda + integer :: i + call random_number(r) @@ -2303,11 +2236,52 @@ subroutine selfTest CoSy = buildCoordinateSystem([1],[1],system,'cF',0.0_pReal) if(any(dNeq(CoSy(1:3,1:3,1),math_I3))) error stop 'buildCoordinateSystem' + do i = 1, 10 + call random_number(C) + C_cF = applyLatticeSymmetryC66(C,'cI') + C_cI = applyLatticeSymmetryC66(C,'cF') + C_hP = applyLatticeSymmetryC66(C,'hP') + C_tI = applyLatticeSymmetryC66(C,'tI') + + if (any(dNeq(C_cI,transpose(C_cF)))) error stop 'SymmetryC66/cI-cF' + if (any(dNeq(C_cF,transpose(C_cI)))) error stop 'SymmetryC66/cF-cI' + if (any(dNeq(C_hP,transpose(C_hP)))) error stop 'SymmetryC66/hP' + if (any(dNeq(C_tI,transpose(C_tI)))) error stop 'SymmetryC66/tI' + + if (any(dNeq(C(1,1),[C_cF(1,1),C_cF(2,2),C_cF(3,3)]))) error stop 'SymmetryC_11-22-33/c' + if (any(dNeq(C(1,2),[C_cF(1,2),C_cF(1,3),C_cF(2,3)]))) error stop 'SymmetryC_12-13-23/c' + if (any(dNeq(C(4,4),[C_cF(4,4),C_cF(5,5),C_cF(6,6)]))) error stop 'SymmetryC_44-55-66/c' + + if (any(dNeq(C(1,1),[C_hP(1,1),C_hP(2,2)]))) error stop 'SymmetryC_11-22/hP' + if (any(dNeq(C(1,3),[C_hP(1,3),C_hP(2,3)]))) error stop 'SymmetryC_13-23/hP' + if (any(dNeq(C(4,4),[C_hP(4,4),C_hP(5,5)]))) error stop 'SymmetryC_44-55/hP' + + if (any(dNeq(C(1,1),[C_tI(1,1),C_tI(2,2)]))) error stop 'SymmetryC_11-22/tI' + if (any(dNeq(C(1,3),[C_tI(1,3),C_tI(2,3)]))) error stop 'SymmetryC_13-23/tI' + if (any(dNeq(C(4,4),[C_tI(4,4),C_tI(5,5)]))) error stop 'SymmetryC_44-55/tI' + + call random_number(T) + T_cF = lattice_applyLatticeSymmetry33(T,'cI') + T_cI = lattice_applyLatticeSymmetry33(T,'cF') + T_hP = lattice_applyLatticeSymmetry33(T,'hP') + T_tI = lattice_applyLatticeSymmetry33(T,'tI') + + if (any(dNeq0(T_cF) .and. math_I3<1.0_pReal)) error stop 'Symmetry33/c' + if (any(dNeq0(T_hP) .and. math_I3<1.0_pReal)) error stop 'Symmetry33/hP' + if (any(dNeq0(T_tI) .and. math_I3<1.0_pReal)) error stop 'Symmetry33/tI' + + if (any(dNeq(T(1,1),[T_cI(1,1),T_cI(2,2),T_cI(3,3)]))) error stop 'Symmetry33_11-22-33/c' + if (any(dNeq(T(1,1),[T_hP(1,1),T_hP(2,2)]))) error stop 'Symmetry33_11-22/hP' + if (any(dNeq(T(1,1),[T_tI(1,1),T_tI(2,2)]))) error stop 'Symmetry33_11-22/tI' + + enddo + call random_number(C) - C(1,1) = C(1,1) + 1.0_pReal - C = applyLatticeSymmetryC66(C,'aP') - if(dNeq(C(6,6),lattice_equivalent_mu(C,'voigt'),1.0e-12_pReal)) error stop 'equivalent_mu/voigt' - if(dNeq(C(6,6),lattice_equivalent_mu(C,'voigt'),1.0e-12_pReal)) error stop 'equivalent_mu/reuss' + C(1,1) = C(1,1) + C(1,2) + 0.1_pReal + C(4,4) = 0.5_pReal * (C(1,1) - C(1,2)) + C = applyLatticeSymmetryC66(C,'cI') + if(dNeq(C(4,4),lattice_equivalent_mu(C,'voigt'),1.0e-12_pReal)) error stop 'equivalent_mu/voigt' + if(dNeq(C(4,4),lattice_equivalent_mu(C,'reuss'),1.0e-12_pReal)) error stop 'equivalent_mu/reuss' lambda = C(1,2) if(dNeq(lambda*0.5_pReal/(lambda+lattice_equivalent_mu(C,'voigt')), & diff --git a/src/phase_damage.f90 b/src/phase_damage.f90 index 93bc71870..ca1855a00 100644 --- a/src/phase_damage.f90 +++ b/src/phase_damage.f90 @@ -121,7 +121,6 @@ module subroutine damage_init source => sources%get(1) param(ph)%mu = source%get_asFloat('M',defaultVal=0.0_pReal) param(ph)%K(1,1) = source%get_asFloat('D_11',defaultVal=0.0_pReal) - param(ph)%K(2,2) = source%get_asFloat('D_22',defaultVal=0.0_pReal) param(ph)%K(3,3) = source%get_asFloat('D_33',defaultVal=0.0_pReal) param(ph)%K = lattice_applyLatticeSymmetry33(param(ph)%K,phase%get_asString('lattice')) endif diff --git a/src/phase_mechanical.f90 b/src/phase_mechanical.f90 index b61284ed7..88c5d7f0b 100644 --- a/src/phase_mechanical.f90 +++ b/src/phase_mechanical.f90 @@ -904,56 +904,52 @@ subroutine crystallite_results(group,ph) character(len=:), allocatable :: structureLabel - call results_closeGroup(results_addGroup(group//'/mechanical')) + call results_closeGroup(results_addGroup(group//'/mechanical')) - do ou = 1, size(output_constituent(ph)%label) + do ou = 1, size(output_constituent(ph)%label) - select case (output_constituent(ph)%label(ou)) - case('F') - call results_writeDataset(group//'/mechanical/',phase_mechanical_F(ph)%data,'F',& - 'deformation gradient','1') - case('F_e') - call results_writeDataset(group//'/mechanical/',phase_mechanical_Fe(ph)%data,'F_e',& - 'elastic deformation gradient','1') - case('F_p') - call results_writeDataset(group//'/mechanical/',phase_mechanical_Fp(ph)%data,'F_p', & - 'plastic deformation gradient','1') - case('F_i') - call results_writeDataset(group//'/mechanical/',phase_mechanical_Fi(ph)%data,'F_i', & - 'inelastic deformation gradient','1') - case('L_p') - call results_writeDataset(group//'/mechanical/',phase_mechanical_Lp(ph)%data,'L_p', & - 'plastic velocity gradient','1/s') - case('L_i') - call results_writeDataset(group//'/mechanical/',phase_mechanical_Li(ph)%data,'L_i', & - 'inelastic velocity gradient','1/s') - case('P') - call results_writeDataset(group//'/mechanical/',phase_mechanical_P(ph)%data,'P', & - 'first Piola-Kirchhoff stress','Pa') - case('S') - call results_writeDataset(group//'/mechanical/',phase_mechanical_S(ph)%data,'S', & - 'second Piola-Kirchhoff stress','Pa') - case('O') - select case(lattice_structure(ph)) - case(lattice_ISO_ID) - structureLabel = 'aP' - case(lattice_FCC_ID) - structureLabel = 'cF' - case(lattice_BCC_ID) - structureLabel = 'cI' - case(lattice_BCT_ID) - structureLabel = 'tI' - case(lattice_HEX_ID) - structureLabel = 'hP' - case(lattice_ORT_ID) - structureLabel = 'oP' - end select - selected_rotations = select_rotations(phase_orientation(ph)%data) - call results_writeDataset(group//'/mechanical',selected_rotations,output_constituent(ph)%label(ou),& - 'crystal orientation as quaternion','q_0 (q_1 q_2 q_3)') - call results_addAttribute('lattice',structureLabel,group//'/mechanical/'//output_constituent(ph)%label(ou)) - end select - enddo + select case (output_constituent(ph)%label(ou)) + case('F') + call results_writeDataset(group//'/mechanical/',phase_mechanical_F(ph)%data,'F',& + 'deformation gradient','1') + case('F_e') + call results_writeDataset(group//'/mechanical/',phase_mechanical_Fe(ph)%data,'F_e',& + 'elastic deformation gradient','1') + case('F_p') + call results_writeDataset(group//'/mechanical/',phase_mechanical_Fp(ph)%data,'F_p', & + 'plastic deformation gradient','1') + case('F_i') + call results_writeDataset(group//'/mechanical/',phase_mechanical_Fi(ph)%data,'F_i', & + 'inelastic deformation gradient','1') + case('L_p') + call results_writeDataset(group//'/mechanical/',phase_mechanical_Lp(ph)%data,'L_p', & + 'plastic velocity gradient','1/s') + case('L_i') + call results_writeDataset(group//'/mechanical/',phase_mechanical_Li(ph)%data,'L_i', & + 'inelastic velocity gradient','1/s') + case('P') + call results_writeDataset(group//'/mechanical/',phase_mechanical_P(ph)%data,'P', & + 'first Piola-Kirchhoff stress','Pa') + case('S') + call results_writeDataset(group//'/mechanical/',phase_mechanical_S(ph)%data,'S', & + 'second Piola-Kirchhoff stress','Pa') + case('O') + select case(lattice_structure(ph)) + case(lattice_FCC_ID) + structureLabel = 'cF' + case(lattice_BCC_ID) + structureLabel = 'cI' + case(lattice_HEX_ID) + structureLabel = 'hP' + case(lattice_BCT_ID) + structureLabel = 'tI' + end select + selected_rotations = select_rotations(phase_orientation(ph)%data) + call results_writeDataset(group//'/mechanical',selected_rotations,output_constituent(ph)%label(ou),& + 'crystal orientation as quaternion','q_0 (q_1 q_2 q_3)') + call results_addAttribute('lattice',structureLabel,group//'/mechanical/'//output_constituent(ph)%label(ou)) + end select + enddo contains diff --git a/src/phase_mechanical_eigen.f90 b/src/phase_mechanical_eigen.f90 index 8587b2bc8..b34aee58b 100644 --- a/src/phase_mechanical_eigen.f90 +++ b/src/phase_mechanical_eigen.f90 @@ -70,7 +70,7 @@ module subroutine eigendeformation_init(phases) allocate(model_damage(phases%length), source = KINEMATICS_UNDEFINED_ID) where(damage_anisobrittle_init()) model_damage = KINEMATICS_cleavage_opening_ID - where(damage_isoductile_init()) model_damage = KINEMATICS_slipplane_opening_ID + where(damage_isoductile_init()) model_damage = KINEMATICS_slipplane_opening_ID end subroutine eigendeformation_init diff --git a/src/phase_mechanical_eigen_thermalexpansion.f90 b/src/phase_mechanical_eigen_thermalexpansion.f90 index e47db4f37..3cfeb2f06 100644 --- a/src/phase_mechanical_eigen_thermalexpansion.f90 +++ b/src/phase_mechanical_eigen_thermalexpansion.f90 @@ -33,14 +33,15 @@ module function thermalexpansion_init(kinematics_length) result(myKinematics) class(tNode), pointer :: & phases, & phase, & + mech, & kinematics, & kinematic_type print'(/,a)', ' <<<+- phase:mechanical:eigen:thermalexpansion init -+>>>' - myKinematics = kinematics_active('thermal_expansion',kinematics_length) + myKinematics = kinematics_active('thermalexpansion',kinematics_length) Ninstances = count(myKinematics) - print'(a,i2)', ' # instances: ',Ninstances; flush(IO_STDOUT) + print'(a,i2)', ' # phases: ',Ninstances; flush(IO_STDOUT) if(Ninstances == 0) return phases => config_material%get('phase') @@ -51,7 +52,8 @@ module function thermalexpansion_init(kinematics_length) result(myKinematics) if(any(myKinematics(:,p))) kinematics_thermal_expansion_instance(p) = count(myKinematics(:,1:p)) phase => phases%get(p) if(count(myKinematics(:,p)) == 0) cycle - kinematics => phase%get('kinematics') + mech => phase%get('mechanical') + kinematics => mech%get('eigen') do k = 1, kinematics%length if(myKinematics(k,p)) then associate(prm => param(kinematics_thermal_expansion_instance(p))) @@ -62,15 +64,12 @@ module function thermalexpansion_init(kinematics_length) result(myKinematics) ! read up to three parameters (constant, linear, quadratic with T) temp = kinematic_type%get_as1dFloat('A_11') prm%A(1,1,1:size(temp)) = temp - temp = kinematic_type%get_as1dFloat('A_22',defaultVal=[(0.0_pReal, i=1,size(temp))],requiredSize=size(temp)) - prm%A(2,2,1:size(temp)) = temp temp = kinematic_type%get_as1dFloat('A_33',defaultVal=[(0.0_pReal, i=1,size(temp))],requiredSize=size(temp)) prm%A(3,3,1:size(temp)) = temp do i=1, size(prm%A,3) prm%A(1:3,1:3,i) = lattice_applyLatticeSymmetry33(prm%A(1:3,1:3,i),& phase%get_asString('lattice')) enddo - end associate endif enddo @@ -93,21 +92,22 @@ module subroutine thermalexpansion_LiAndItsTangent(Li, dLi_dTstar, ph,me) real(pReal) :: T, dot_T + T = thermal_T(ph,me) dot_T = thermal_dot_T(ph,me) associate(prm => param(kinematics_thermal_expansion_instance(ph))) Li = dot_T * ( & - prm%A(1:3,1:3,1)*(T - prm%T_ref)**0 & ! constant coefficient - + prm%A(1:3,1:3,2)*(T - prm%T_ref)**1 & ! linear coefficient - + prm%A(1:3,1:3,3)*(T - prm%T_ref)**2 & ! quadratic coefficient + prm%A(1:3,1:3,1)*(T - prm%T_ref)**0 & ! constant coefficient + + prm%A(1:3,1:3,2)*(T - prm%T_ref)**1 & ! linear coefficient + + prm%A(1:3,1:3,3)*(T - prm%T_ref)**2 & ! quadratic coefficient ) / & (1.0_pReal & + prm%A(1:3,1:3,1)*(T - prm%T_ref)**1 / 1. & + prm%A(1:3,1:3,2)*(T - prm%T_ref)**2 / 2. & + prm%A(1:3,1:3,3)*(T - prm%T_ref)**3 / 3. & ) - end associate + end associate dLi_dTstar = 0.0_pReal end subroutine thermalexpansion_LiAndItsTangent diff --git a/src/phase_mechanical_elastic.f90 b/src/phase_mechanical_elastic.f90 index e25e5e8d2..94622d359 100644 --- a/src/phase_mechanical_elastic.f90 +++ b/src/phase_mechanical_elastic.f90 @@ -1,12 +1,11 @@ submodule(phase:mechanical) elastic - enum, bind(c); enumerator :: & - ELASTICITY_UNDEFINED_ID, & - ELASTICITY_HOOKE_ID - end enum + type :: tParameters + real(pReal), dimension(6,6) :: & + C66 !< Elastic constants in Voig notation + end type tParameters - integer(kind(ELASTICITY_UNDEFINED_ID)), dimension(:), allocatable :: & - phase_elasticity !< elasticity of each phase + type(tParameters), allocatable, dimension(:) :: param contains @@ -22,20 +21,37 @@ module subroutine elastic_init(phases) phase, & mech, & elastic - - print'(/,a)', ' <<<+- phase:mechanical:elastic init -+>>>' + character(len=:), allocatable :: struct - allocate(phase_elasticity(phases%length), source = ELASTICITY_undefined_ID) + + print'(/,a)', ' <<<+- phase:mechanical:elastic init -+>>>' + print'(/,a)', ' <<<+- phase:mechanical:elastic:Hooke init -+>>>' + + print'(a,i0)', ' # phases: ',phases%length; flush(IO_STDOUT) + + allocate(param(phases%length)) do ph = 1, phases%length phase => phases%get(ph) mech => phase%get('mechanical') elastic => mech%get('elastic') - if(IO_lc(elastic%get_asString('type')) == 'hooke') then ! accept small letter h for the moment - phase_elasticity(ph) = ELASTICITY_HOOKE_ID - else - call IO_error(200,ext_msg=elastic%get_asString('type')) - endif + if (elastic%get_asString('type') /= 'Hooke') call IO_error(200,ext_msg=elastic%get_asString('type')) + + associate(prm => param(ph)) + struct = phase%get_asString('lattice') + if (struct /= 'cI' .and. struct /= 'cF' .and. struct /= 'hP' .and. struct /= 'tI') & + call IO_error(137,ext_msg=trim(struct)) + + prm%C66(1,1) = elastic%get_asFloat('C_11') + prm%C66(1,2) = elastic%get_asFloat('C_12') + prm%C66(4,4) = elastic%get_asFloat('C_44') + + if (struct == 'hP' .or. struct == 'tI') then + prm%C66(1,3) = elastic%get_asFloat('C_13') + prm%C66(3,3) = elastic%get_asFloat('C_33') + endif + if (struct == 'tI') prm%C66(6,6) = elastic%get_asFloat('C_66') + end associate enddo end subroutine elastic_init @@ -63,9 +79,9 @@ module subroutine phase_hooke_SandItsTangents(S, dS_dFe, dS_dFi, & real(pReal), dimension(3,3) :: E real(pReal), dimension(3,3,3,3) :: C integer :: & - d, & !< counter in degradation loop i, j + C = math_66toSym3333(phase_homogenizedC(ph,en)) C = phase_damage_C(C,ph,en) diff --git a/src/phase_mechanical_plastic_isotropic.f90 b/src/phase_mechanical_plastic_isotropic.f90 index 0e7920f1d..4701a4514 100644 --- a/src/phase_mechanical_plastic_isotropic.f90 +++ b/src/phase_mechanical_plastic_isotropic.f90 @@ -36,10 +36,10 @@ submodule(phase:plastic) isotropic !-------------------------------------------------------------------------------------------------- ! containers for parameters and state - type(tParameters), allocatable, dimension(:) :: param - type(tIsotropicState), allocatable, dimension(:) :: & - dotState, & - state + type(tParameters), allocatable, dimension(:) :: param + type(tIsotropicState), allocatable, dimension(:) :: & + dotState, & + state contains diff --git a/src/phase_thermal.f90 b/src/phase_thermal.f90 index 8d6ccaf6f..141cf0249 100644 --- a/src/phase_thermal.f90 +++ b/src/phase_thermal.f90 @@ -100,11 +100,9 @@ module subroutine thermal_init(phases) allocate(current(ph)%dot_T(Nmembers),source=0.0_pReal) phase => phases%get(ph) thermal => phase%get('thermal',defaultVal=emptyDict) - param(ph)%C_p = thermal%get_asFloat('c_p',defaultVal=0.0_pReal) - if (param(ph)%C_p <= 0) param(ph)%C_p = thermal%get_asFloat('C_p',defaultVal=0.0_pReal) - param(ph)%K(1,1) = thermal%get_asFloat('K_11',defaultVal=0.0_pReal) - param(ph)%K(2,2) = thermal%get_asFloat('K_22',defaultVal=0.0_pReal) - param(ph)%K(3,3) = thermal%get_asFloat('K_33',defaultVal=0.0_pReal) + param(ph)%C_p = thermal%get_asFloat('C_p',defaultVal=0.0_pReal) + param(ph)%K(1,1) = thermal%get_asFloat('K_11',defaultVal=0.0_pReal) ! ToDo: make mandatory? + param(ph)%K(3,3) = thermal%get_asFloat('K_33',defaultVal=0.0_pReal) ! ToDo: depends on symmtery param(ph)%K = lattice_applyLatticeSymmetry33(param(ph)%K,phase%get_asString('lattice')) sources => thermal%get('source',defaultVal=emptyList) diff --git a/src/rotations.f90 b/src/rotations.f90 index 531b08d14..8d7b842fc 100644 --- a/src/rotations.f90 +++ b/src/rotations.f90 @@ -638,7 +638,7 @@ function om2ax(om) result(ax) else call dgeev('N','V',3,om_,3,Wr,Wi,devNull,3,VR,3,work,size(work,1),ierr) if (ierr /= 0) error stop 'LAPACK error' -#if defined(__GFORTRAN__) && __GNUC__<9 || defined(__INTEL_COMPILER) && INTEL_COMPILER<1800 || defined(__PGI) +#if defined(__GFORTRAN__) && __GNUC__<9 i = maxloc(merge(1,0,cEq(cmplx(Wr,Wi,pReal),cmplx(1.0_pReal,0.0_pReal,pReal),tol=1.0e-14_pReal)),dim=1) #else i = findloc(cEq(cmplx(Wr,Wi,pReal),cmplx(1.0_pReal,0.0_pReal,pReal),tol=1.0e-14_pReal),.true.,dim=1) !find eigenvalue (1,0)