Merge branch '38-introduce-rudimentary-PETSc-based-FEM-solver' into 'development'
Resolve "Introduce Rudimentary PETSc based FEM solver" Closes #38 See merge request damask/DAMASK!41
This commit is contained in:
commit
27bde05529
|
@ -60,18 +60,17 @@ variables:
|
|||
IntelCompiler: "$IntelCompiler18_1"
|
||||
GNUCompiler: "$GNUCompiler7_3"
|
||||
# ++++++++++++ MPI +++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
MPICH3_2Intel17_0: "MPI/Intel/17.0/MPICH/3.2"
|
||||
MPICH3_2Intel18_1: "MPI/Intel/18.1/MPICH/3.2.1"
|
||||
MPICH3_2GNU7_3: "MPI/GNU/7.3/MPICH/3.2.1"
|
||||
# ------------ Defaults ----------------------------------------------
|
||||
MPICH_GNU: "$MPICH3_2GNU7_3"
|
||||
MPICH_Intel: "$MPICH3_2Intel18_1"
|
||||
MPICH_GNU: "$MPICH3_2GNU7_3"
|
||||
# ++++++++++++ PETSc +++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
PETSc3_9_1MPICH3_2Intel18_1: "Libraries/PETSc/3.9.1/Intel-18.1-MPICH-3.2.1"
|
||||
PETSc3_9_1MPICH3_2GNU7_3: "Libraries/PETSc/3.9.1/GNU-7.3-MPICH-3.2.1"
|
||||
PETSc3_10_0MPICH3_2Intel18_1: "Libraries/PETSc/3.10.0/Intel-18.1-MPICH-3.2.1"
|
||||
PETSc3_10_0MPICH3_2GNU7_3: "Libraries/PETSc/3.10.0/GNU-7.3-MPICH-3.2.1"
|
||||
# ------------ Defaults ----------------------------------------------
|
||||
PETSc_MPICH_Intel: "$PETSc3_9_1MPICH3_2Intel18_1"
|
||||
PETSc_MPICH_GNU: "$PETSc3_9_1MPICH3_2GNU7_3"
|
||||
PETSc_MPICH_Intel: "$PETSc3_10_0MPICH3_2Intel18_1"
|
||||
PETSc_MPICH_GNU: "$PETSc3_10_0MPICH3_2GNU7_3"
|
||||
# ++++++++++++ FEM +++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Abaqus2017: "FEM/Abaqus/2017"
|
||||
MSC2017: "FEM/MSC/2017"
|
||||
|
|
2
PRIVATE
2
PRIVATE
|
@ -1 +1 @@
|
|||
Subproject commit aeae4513b1ffb43b949399c12bae27fc6abb6f29
|
||||
Subproject commit b893d0488ec211d4d2cb02c284079e6fbcd89baa
|
|
@ -1 +1,9 @@
|
|||
*.C_ref
|
||||
*.mesh
|
||||
*.outputConstitutive
|
||||
*.outputCrystallite
|
||||
*.outputHomogenization
|
||||
*.spectralOut
|
||||
*.sta
|
||||
*.vt*
|
||||
postProc
|
||||
|
|
|
@ -0,0 +1,759 @@
|
|||
#-------------------#
|
||||
<homogenization>
|
||||
#-------------------#
|
||||
[SX]
|
||||
mech none
|
||||
|
||||
#-------------------#
|
||||
<crystallite>
|
||||
#-------------------#
|
||||
|
||||
[aLittleSomething]
|
||||
(output) f
|
||||
(output) p
|
||||
|
||||
#-------------------#
|
||||
<phase>
|
||||
#-------------------#
|
||||
|
||||
[Aluminum]
|
||||
elasticity hooke
|
||||
plasticity phenopowerlaw
|
||||
|
||||
lattice_structure fcc
|
||||
Nslip 12 # per family
|
||||
Ntwin 0 # per family
|
||||
|
||||
c11 106.75e9
|
||||
c12 60.41e9
|
||||
c44 28.34e9
|
||||
|
||||
gdot0_slip 0.001
|
||||
n_slip 20
|
||||
tau0_slip 31e6 # per family
|
||||
tausat_slip 63e6 # per family
|
||||
a_slip 2.25
|
||||
gdot0_twin 0.001
|
||||
n_twin 20
|
||||
tau0_twin 31e6 # per family
|
||||
s_pr 0 # push-up factor for slip saturation due to twinning
|
||||
twin_b 0
|
||||
twin_c 0
|
||||
twin_d 0
|
||||
twin_e 0
|
||||
h0_slipslip 75e6
|
||||
h0_twinslip 0
|
||||
h0_twintwin 0
|
||||
interaction_slipslip 1 1 1.4 1.4 1.4 1.4
|
||||
interaction_sliptwin 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
interaction_twinslip 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
interaction_twintwin 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
atol_resistance 1
|
||||
|
||||
#-------------------#
|
||||
<microstructure>
|
||||
#-------------------#
|
||||
|
||||
[Grain001]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 1 fraction 1.0
|
||||
|
||||
[Grain002]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 2 fraction 1.0
|
||||
|
||||
[Grain003]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 3 fraction 1.0
|
||||
|
||||
[Grain004]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 4 fraction 1.0
|
||||
|
||||
[Grain005]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 5 fraction 1.0
|
||||
|
||||
[Grain006]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 6 fraction 1.0
|
||||
|
||||
[Grain007]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 7 fraction 1.0
|
||||
|
||||
[Grain008]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 8 fraction 1.0
|
||||
|
||||
[Grain009]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 9 fraction 1.0
|
||||
|
||||
[Grain010]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 10 fraction 1.0
|
||||
|
||||
[Grain011]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 11 fraction 1.0
|
||||
|
||||
[Grain012]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 12 fraction 1.0
|
||||
|
||||
[Grain013]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 13 fraction 1.0
|
||||
|
||||
[Grain014]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 14 fraction 1.0
|
||||
|
||||
[Grain015]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 15 fraction 1.0
|
||||
|
||||
[Grain016]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 16 fraction 1.0
|
||||
|
||||
[Grain017]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 17 fraction 1.0
|
||||
|
||||
[Grain018]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 18 fraction 1.0
|
||||
|
||||
[Grain019]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 19 fraction 1.0
|
||||
|
||||
[Grain020]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 20 fraction 1.0
|
||||
|
||||
[Grain021]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 21 fraction 1.0
|
||||
|
||||
[Grain022]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 22 fraction 1.0
|
||||
|
||||
[Grain023]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 23 fraction 1.0
|
||||
|
||||
[Grain024]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 24 fraction 1.0
|
||||
|
||||
[Grain025]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 25 fraction 1.0
|
||||
|
||||
[Grain026]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 26 fraction 1.0
|
||||
|
||||
[Grain027]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 27 fraction 1.0
|
||||
|
||||
[Grain028]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 28 fraction 1.0
|
||||
|
||||
[Grain029]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 29 fraction 1.0
|
||||
|
||||
[Grain030]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 30 fraction 1.0
|
||||
|
||||
[Grain031]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 31 fraction 1.0
|
||||
|
||||
[Grain032]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 32 fraction 1.0
|
||||
|
||||
[Grain033]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 33 fraction 1.0
|
||||
|
||||
[Grain034]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 34 fraction 1.0
|
||||
|
||||
[Grain035]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 35 fraction 1.0
|
||||
|
||||
[Grain036]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 36 fraction 1.0
|
||||
|
||||
[Grain037]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 37 fraction 1.0
|
||||
|
||||
[Grain038]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 38 fraction 1.0
|
||||
|
||||
[Grain039]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 39 fraction 1.0
|
||||
|
||||
[Grain040]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 40 fraction 1.0
|
||||
|
||||
[Grain041]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 41 fraction 1.0
|
||||
|
||||
[Grain042]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 42 fraction 1.0
|
||||
|
||||
[Grain043]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 43 fraction 1.0
|
||||
|
||||
[Grain044]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 44 fraction 1.0
|
||||
|
||||
[Grain045]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 45 fraction 1.0
|
||||
|
||||
[Grain046]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 46 fraction 1.0
|
||||
|
||||
[Grain047]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 47 fraction 1.0
|
||||
|
||||
[Grain048]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 48 fraction 1.0
|
||||
|
||||
[Grain049]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 49 fraction 1.0
|
||||
|
||||
[Grain050]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 50 fraction 1.0
|
||||
|
||||
[Grain051]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 51 fraction 1.0
|
||||
|
||||
[Grain052]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 52 fraction 1.0
|
||||
|
||||
[Grain053]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 53 fraction 1.0
|
||||
|
||||
[Grain054]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 54 fraction 1.0
|
||||
|
||||
[Grain055]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 55 fraction 1.0
|
||||
|
||||
[Grain056]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 56 fraction 1.0
|
||||
|
||||
[Grain057]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 57 fraction 1.0
|
||||
|
||||
[Grain058]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 58 fraction 1.0
|
||||
|
||||
[Grain059]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 59 fraction 1.0
|
||||
|
||||
[Grain060]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 60 fraction 1.0
|
||||
|
||||
[Grain061]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 61 fraction 1.0
|
||||
|
||||
[Grain062]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 62 fraction 1.0
|
||||
|
||||
[Grain063]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 63 fraction 1.0
|
||||
|
||||
[Grain064]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 64 fraction 1.0
|
||||
|
||||
[Grain065]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 65 fraction 1.0
|
||||
|
||||
[Grain066]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 66 fraction 1.0
|
||||
|
||||
[Grain067]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 67 fraction 1.0
|
||||
|
||||
[Grain068]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 68 fraction 1.0
|
||||
|
||||
[Grain069]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 69 fraction 1.0
|
||||
|
||||
[Grain070]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 70 fraction 1.0
|
||||
|
||||
[Grain071]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 71 fraction 1.0
|
||||
|
||||
[Grain072]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 72 fraction 1.0
|
||||
|
||||
[Grain073]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 73 fraction 1.0
|
||||
|
||||
[Grain074]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 74 fraction 1.0
|
||||
|
||||
[Grain075]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 75 fraction 1.0
|
||||
|
||||
[Grain076]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 76 fraction 1.0
|
||||
|
||||
[Grain077]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 77 fraction 1.0
|
||||
|
||||
[Grain078]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 78 fraction 1.0
|
||||
|
||||
[Grain079]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 79 fraction 1.0
|
||||
|
||||
[Grain080]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 80 fraction 1.0
|
||||
|
||||
[Grain081]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 81 fraction 1.0
|
||||
|
||||
[Grain082]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 82 fraction 1.0
|
||||
|
||||
[Grain083]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 83 fraction 1.0
|
||||
|
||||
[Grain084]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 84 fraction 1.0
|
||||
|
||||
[Grain085]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 85 fraction 1.0
|
||||
|
||||
[Grain086]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 86 fraction 1.0
|
||||
|
||||
[Grain087]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 87 fraction 1.0
|
||||
|
||||
[Grain088]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 88 fraction 1.0
|
||||
|
||||
[Grain089]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 89 fraction 1.0
|
||||
|
||||
[Grain090]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 90 fraction 1.0
|
||||
|
||||
[Grain091]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 91 fraction 1.0
|
||||
|
||||
[Grain092]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 92 fraction 1.0
|
||||
|
||||
[Grain093]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 93 fraction 1.0
|
||||
|
||||
[Grain094]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 94 fraction 1.0
|
||||
|
||||
[Grain095]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 95 fraction 1.0
|
||||
|
||||
[Grain096]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 96 fraction 1.0
|
||||
|
||||
[Grain097]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 97 fraction 1.0
|
||||
|
||||
[Grain098]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 98 fraction 1.0
|
||||
|
||||
[Grain099]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 99 fraction 1.0
|
||||
|
||||
[Grain100]
|
||||
crystallite 1
|
||||
(constituent) phase 1 texture 100 fraction 1.0
|
||||
|
||||
#-------------------#
|
||||
<texture>
|
||||
#-------------------#
|
||||
|
||||
[Grain001]
|
||||
(gauss) phi1 172.344 Phi 114.046 phi2 294.669 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain002]
|
||||
(gauss) phi1 186.013 Phi 94.7338 phi2 329.683 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain003]
|
||||
(gauss) phi1 162.41 Phi 98.9455 phi2 130.322 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain004]
|
||||
(gauss) phi1 355.272 Phi 140.621 phi2 125.567 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain005]
|
||||
(gauss) phi1 21.7641 Phi 143.388 phi2 240.373 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain006]
|
||||
(gauss) phi1 88.1966 Phi 92.3358 phi2 194.78 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain007]
|
||||
(gauss) phi1 161.137 Phi 78.0062 phi2 111.948 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain008]
|
||||
(gauss) phi1 169.792 Phi 89.5333 phi2 159.265 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain009]
|
||||
(gauss) phi1 264.847 Phi 130.291 phi2 180.604 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain010]
|
||||
(gauss) phi1 70.6323 Phi 84.1754 phi2 341.162 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain011]
|
||||
(gauss) phi1 67.7751 Phi 36.1662 phi2 139.898 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain012]
|
||||
(gauss) phi1 111.621 Phi 19.1089 phi2 228.338 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain013]
|
||||
(gauss) phi1 129.9 Phi 139.011 phi2 238.735 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain014]
|
||||
(gauss) phi1 221.405 Phi 129.743 phi2 99.6471 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain015]
|
||||
(gauss) phi1 241.783 Phi 98.3729 phi2 260.615 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain016]
|
||||
(gauss) phi1 72.5592 Phi 122.403 phi2 165.046 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain017]
|
||||
(gauss) phi1 64.8818 Phi 82.6384 phi2 236.305 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain018]
|
||||
(gauss) phi1 201.096 Phi 65.9312 phi2 330.745 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain019]
|
||||
(gauss) phi1 192.994 Phi 81.9371 phi2 239.326 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain020]
|
||||
(gauss) phi1 125.335 Phi 90.4527 phi2 207.982 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain021]
|
||||
(gauss) phi1 55.8848 Phi 26.4455 phi2 100.921 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain022]
|
||||
(gauss) phi1 40.722 Phi 95.6415 phi2 269.174 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain023]
|
||||
(gauss) phi1 250.487 Phi 69.6035 phi2 201.732 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain024]
|
||||
(gauss) phi1 204.199 Phi 84.983 phi2 20.3469 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain025]
|
||||
(gauss) phi1 12.7416 Phi 128.589 phi2 271.553 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain026]
|
||||
(gauss) phi1 299.704 Phi 85.3961 phi2 217.359 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain027]
|
||||
(gauss) phi1 48.8232 Phi 83.6209 phi2 200.361 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain028]
|
||||
(gauss) phi1 336.395 Phi 97.3059 phi2 187.071 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain029]
|
||||
(gauss) phi1 274.354 Phi 78.2424 phi2 320.308 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain030]
|
||||
(gauss) phi1 320.776 Phi 149.72 phi2 163.862 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain031]
|
||||
(gauss) phi1 179.549 Phi 106.548 phi2 345.498 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain032]
|
||||
(gauss) phi1 163.508 Phi 24.4238 phi2 127.809 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain033]
|
||||
(gauss) phi1 193.405 Phi 157.012 phi2 321.342 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain034]
|
||||
(gauss) phi1 9.09886 Phi 95.9453 phi2 102.32 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain035]
|
||||
(gauss) phi1 353.876 Phi 150.824 phi2 174.886 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain036]
|
||||
(gauss) phi1 138.914 Phi 76.5811 phi2 167.927 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain037]
|
||||
(gauss) phi1 262.655 Phi 76.2738 phi2 12.4459 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain038]
|
||||
(gauss) phi1 121.849 Phi 65.5254 phi2 192.601 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain039]
|
||||
(gauss) phi1 275.824 Phi 81.6788 phi2 164.228 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain040]
|
||||
(gauss) phi1 68.9202 Phi 160.5 phi2 210.862 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain041]
|
||||
(gauss) phi1 51.0398 Phi 82.7291 phi2 74.016 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain042]
|
||||
(gauss) phi1 338.746 Phi 62.7854 phi2 129.362 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain043]
|
||||
(gauss) phi1 204.51 Phi 151.256 phi2 178.89 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain044]
|
||||
(gauss) phi1 122.098 Phi 104.003 phi2 323.04 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain045]
|
||||
(gauss) phi1 106.693 Phi 108.61 phi2 336.935 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain046]
|
||||
(gauss) phi1 118.856 Phi 160.992 phi2 316.152 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain047]
|
||||
(gauss) phi1 177.962 Phi 114.868 phi2 13.6918 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain048]
|
||||
(gauss) phi1 330.273 Phi 174.495 phi2 231.249 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain049]
|
||||
(gauss) phi1 7.31937 Phi 94.7313 phi2 17.8461 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain050]
|
||||
(gauss) phi1 74.3385 Phi 49.9546 phi2 286.482 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain051]
|
||||
(gauss) phi1 326.388 Phi 76.9547 phi2 214.758 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain052]
|
||||
(gauss) phi1 276.024 Phi 72.1242 phi2 275.884 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain053]
|
||||
(gauss) phi1 137.681 Phi 116.99 phi2 6.87047 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain054]
|
||||
(gauss) phi1 200.213 Phi 123.618 phi2 268.84 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain055]
|
||||
(gauss) phi1 7.13702 Phi 56.2015 phi2 119.65 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain056]
|
||||
(gauss) phi1 72.1783 Phi 81.0906 phi2 6.06213 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain057]
|
||||
(gauss) phi1 184.565 Phi 110.01 phi2 239.546 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain058]
|
||||
(gauss) phi1 210.124 Phi 128.631 phi2 8.61611 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain059]
|
||||
(gauss) phi1 290.326 Phi 170.412 phi2 144.269 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain060]
|
||||
(gauss) phi1 204.748 Phi 76.7343 phi2 200.385 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain061]
|
||||
(gauss) phi1 54.3015 Phi 65.9143 phi2 117.373 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain062]
|
||||
(gauss) phi1 261.263 Phi 52.255 phi2 95.9146 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain063]
|
||||
(gauss) phi1 328.054 Phi 51.0778 phi2 24.2782 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain064]
|
||||
(gauss) phi1 163.03 Phi 154.894 phi2 64.126 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain065]
|
||||
(gauss) phi1 183.87 Phi 80.1848 phi2 18.7438 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain066]
|
||||
(gauss) phi1 219.91 Phi 113.727 phi2 126.67 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain067]
|
||||
(gauss) phi1 1.43844 Phi 87.6365 phi2 217.342 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain068]
|
||||
(gauss) phi1 16.6245 Phi 162.07 phi2 43.7899 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain069]
|
||||
(gauss) phi1 16.86 Phi 53.8682 phi2 256.917 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain070]
|
||||
(gauss) phi1 1.01921 Phi 118.449 phi2 307.223 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain071]
|
||||
(gauss) phi1 19.0397 Phi 83.8885 phi2 262.687 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain072]
|
||||
(gauss) phi1 99.799 Phi 77.2307 phi2 84.9727 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain073]
|
||||
(gauss) phi1 234.292 Phi 63.5029 phi2 250.315 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain074]
|
||||
(gauss) phi1 315.529 Phi 106.015 phi2 103.711 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain075]
|
||||
(gauss) phi1 235.595 Phi 110.152 phi2 210.277 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain076]
|
||||
(gauss) phi1 341.907 Phi 17.1839 phi2 332.75 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain077]
|
||||
(gauss) phi1 352.166 Phi 88.6049 phi2 114.964 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain078]
|
||||
(gauss) phi1 342.33 Phi 117.777 phi2 180.346 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain079]
|
||||
(gauss) phi1 224.952 Phi 70.5702 phi2 148.486 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain080]
|
||||
(gauss) phi1 7.71702 Phi 23.6124 phi2 131.591 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain081]
|
||||
(gauss) phi1 65.1024 Phi 138.774 phi2 247.344 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain082]
|
||||
(gauss) phi1 37.6181 Phi 51.5209 phi2 8.4169 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain083]
|
||||
(gauss) phi1 245.335 Phi 53.4543 phi2 52.5205 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain084]
|
||||
(gauss) phi1 259.572 Phi 87.7026 phi2 272.065 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain085]
|
||||
(gauss) phi1 269.39 Phi 103.379 phi2 132.506 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain086]
|
||||
(gauss) phi1 175.156 Phi 119.338 phi2 355.51 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain087]
|
||||
(gauss) phi1 248.11 Phi 39.4772 phi2 310.371 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain088]
|
||||
(gauss) phi1 121.809 Phi 141.465 phi2 10.0736 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain089]
|
||||
(gauss) phi1 2.4357 Phi 47.118 phi2 274.654 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain090]
|
||||
(gauss) phi1 314.188 Phi 134.146 phi2 250.673 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain091]
|
||||
(gauss) phi1 114.815 Phi 121.132 phi2 275.124 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain092]
|
||||
(gauss) phi1 126.699 Phi 99.0325 phi2 320.537 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain093]
|
||||
(gauss) phi1 184.138 Phi 20.1663 phi2 159.314 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain094]
|
||||
(gauss) phi1 296.502 Phi 15.2389 phi2 39.382 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain095]
|
||||
(gauss) phi1 167.8 Phi 151.764 phi2 192.568 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain096]
|
||||
(gauss) phi1 257.822 Phi 133.446 phi2 257.108 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain097]
|
||||
(gauss) phi1 71.6923 Phi 74.5726 phi2 342.575 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain098]
|
||||
(gauss) phi1 176.748 Phi 28.39 phi2 327.375 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain099]
|
||||
(gauss) phi1 121.822 Phi 141.836 phi2 22.6349 scatter 0.0 fraction 1.0
|
||||
|
||||
[Grain100]
|
||||
(gauss) phi1 180.151 Phi 109.246 phi2 146.177 scatter 0.0 fraction 1.0
|
|
@ -0,0 +1,3 @@
|
|||
residualStiffness 0.001
|
||||
charLength 0.02
|
||||
petsc_options -mech_snes_type newtonls -mech_ksp_type fgmres -mech_pc_type ml -mech_ksp_monitor
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,9 @@
|
|||
#initial elastic step
|
||||
$Loadcase 1 time 0.0005 incs 1 frequency 5
|
||||
Face 1 X 0.01
|
||||
Face 2 X 0.00
|
||||
$EndLoadcase
|
||||
$Loadcase 2 time 10.0 incs 200 frequency 5
|
||||
Face 1 X 0.01
|
||||
Face 2 X 0.00
|
||||
$EndLoadcase
|
|
@ -1,8 +0,0 @@
|
|||
*.C_ref
|
||||
*.mesh
|
||||
*.outputConstitutive
|
||||
*.outputCrystallite
|
||||
*.outputHomogenization
|
||||
*.spectralOut
|
||||
*.sta
|
||||
*.vtk
|
|
@ -17,8 +17,12 @@ list(APPEND OBJECTFILES $<TARGET_OBJECTS:SYSTEM_ROUTINES>)
|
|||
add_library(PREC OBJECT "prec.f90")
|
||||
list(APPEND OBJECTFILES $<TARGET_OBJECTS:PREC>)
|
||||
|
||||
add_library(QUIT OBJECT "quit.f90")
|
||||
add_dependencies(QUIT PREC)
|
||||
list(APPEND OBJECTFILES $<TARGET_OBJECTS:QUIT>)
|
||||
|
||||
add_library(DAMASK_INTERFACE OBJECT "DAMASK_interface.f90")
|
||||
add_dependencies(DAMASK_INTERFACE PREC SYSTEM_ROUTINES)
|
||||
add_dependencies(DAMASK_INTERFACE QUIT SYSTEM_ROUTINES)
|
||||
list(APPEND OBJECTFILES $<TARGET_OBJECTS:DAMASK_INTERFACE>)
|
||||
|
||||
add_library(IO OBJECT "IO.f90")
|
||||
|
|
|
@ -7,8 +7,13 @@
|
|||
!> results
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
program DAMASK_FEM
|
||||
use, intrinsic :: &
|
||||
iso_fortran_env ! to get compiler_version and compiler_options (at least for gfortran >4.6 at the moment)
|
||||
#if defined(__GFORTRAN__) || __INTEL_COMPILER >= 1800
|
||||
use, intrinsic :: iso_fortran_env, only: &
|
||||
compiler_version, &
|
||||
compiler_options
|
||||
#endif
|
||||
#include <petsc/finclude/petscsys.h>
|
||||
use PetscDM
|
||||
use prec, only: &
|
||||
pInt, &
|
||||
pReal, &
|
||||
|
@ -18,9 +23,7 @@ program DAMASK_FEM
|
|||
loadCaseFile, &
|
||||
getSolverJobName
|
||||
use IO, only: &
|
||||
IO_read, &
|
||||
IO_isBlank, &
|
||||
IO_open_file, &
|
||||
IO_stringPos, &
|
||||
IO_stringValue, &
|
||||
IO_floatValue, &
|
||||
|
@ -29,12 +32,7 @@ program DAMASK_FEM
|
|||
IO_lc, &
|
||||
IO_intOut, &
|
||||
IO_warning, &
|
||||
IO_timeStamp, &
|
||||
IO_EOF
|
||||
use debug, only: &
|
||||
debug_level, &
|
||||
debug_spectral, &
|
||||
debug_levelBasic
|
||||
IO_timeStamp
|
||||
use math ! need to include the whole module for FFTW
|
||||
use CPFEM2, only: &
|
||||
CPFEM_initAll
|
||||
|
@ -42,9 +40,9 @@ program DAMASK_FEM
|
|||
restartWrite, &
|
||||
restartInc
|
||||
use numerics, only: &
|
||||
worldrank, &
|
||||
maxCutBack, &
|
||||
stagItMax, &
|
||||
worldrank
|
||||
stagItMax
|
||||
use mesh, only: &
|
||||
mesh_Nboundaries, &
|
||||
mesh_boundaries, &
|
||||
|
@ -57,37 +55,17 @@ program DAMASK_FEM
|
|||
maxFields, &
|
||||
nActiveFields, &
|
||||
FIELD_MECH_ID, &
|
||||
FIELD_THERMAL_ID, &
|
||||
FIELD_DAMAGE_ID, &
|
||||
FIELD_SOLUTE_ID, &
|
||||
FIELD_MGTWIN_ID, &
|
||||
COMPONENT_MECH_X_ID, &
|
||||
COMPONENT_MECH_Y_ID, &
|
||||
COMPONENT_MECH_Z_ID, &
|
||||
COMPONENT_THERMAL_T_ID, &
|
||||
COMPONENT_DAMAGE_PHI_ID, &
|
||||
COMPONENT_SOLUTE_CV_ID, &
|
||||
COMPONENT_SOLUTE_CVPOT_ID, &
|
||||
COMPONENT_SOLUTE_CH_ID, &
|
||||
COMPONENT_SOLUTE_CHPOT_ID, &
|
||||
COMPONENT_SOLUTE_CVaH_ID, &
|
||||
COMPONENT_SOLUTE_CVaHPOT_ID, &
|
||||
COMPONENT_MGTWIN_PHI_ID, &
|
||||
FIELD_MECH_label, &
|
||||
FIELD_THERMAL_label, &
|
||||
FIELD_DAMAGE_label, &
|
||||
FIELD_SOLUTE_label, &
|
||||
FIELD_MGTWIN_label
|
||||
FIELD_MECH_label
|
||||
use FEM_mech
|
||||
|
||||
implicit none
|
||||
#include <petsc/finclude/petsc.h>
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! variables related to information from load case and geom file
|
||||
integer(pInt), parameter :: FILEUNIT = 234_pInt !< file unit, DAMASK IO does not support newunit feature
|
||||
integer(pInt), allocatable, dimension(:) :: chunkPos ! this is longer than needed for geometry parsing
|
||||
|
||||
integer(pInt) :: &
|
||||
N_def = 0_pInt !< # of rate of deformation specifiers found in load case file
|
||||
character(len=65536) :: &
|
||||
|
@ -95,7 +73,6 @@ program DAMASK_FEM
|
|||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! loop variables, convergence etc.
|
||||
|
||||
integer(pInt), parameter :: &
|
||||
subStepFactor = 2_pInt !< for each substep, divide the last time increment by 2.0
|
||||
real(pReal) :: &
|
||||
|
@ -105,7 +82,8 @@ program DAMASK_FEM
|
|||
timeIncOld = 0.0_pReal, & !< previous time interval
|
||||
remainingLoadCaseTime = 0.0_pReal !< remaining time of current load case
|
||||
logical :: &
|
||||
guess !< guess along former trajectory
|
||||
guess, & !< guess along former trajectory
|
||||
stagIterate
|
||||
integer(pInt) :: &
|
||||
i, &
|
||||
errorID, &
|
||||
|
@ -115,18 +93,18 @@ program DAMASK_FEM
|
|||
currentLoadcase = 0_pInt, & !< current load case
|
||||
currentFace = 0_pInt, &
|
||||
inc, & !< current increment in current load case
|
||||
totalIncsCounter = 0_pInt, & !< total No. of increments
|
||||
convergedCounter = 0_pInt, & !< No. of converged increments
|
||||
notConvergedCounter = 0_pInt, & !< No. of non-converged increments
|
||||
totalIncsCounter = 0_pInt, & !< total # of increments
|
||||
convergedCounter = 0_pInt, & !< # of converged increments
|
||||
notConvergedCounter = 0_pInt, & !< # of non-converged increments
|
||||
fileUnit = 0_pInt, & !< file unit for reading load case and writing results
|
||||
myStat, &
|
||||
statUnit = 0_pInt, & !< file unit for statistics output
|
||||
lastRestartWritten = 0_pInt !< total increment No. at which last restart information was written
|
||||
integer(pInt) :: &
|
||||
lastRestartWritten = 0_pInt, & !< total increment No. at which last restart information was written
|
||||
stagIter, &
|
||||
component
|
||||
logical :: &
|
||||
stagIterate
|
||||
component
|
||||
character(len=6) :: loadcase_string
|
||||
character(len=1024) :: incInfo !< string parsed to solution with information about current load case
|
||||
character(len=1024) :: &
|
||||
incInfo
|
||||
type(tLoadCase), allocatable, dimension(:) :: loadCases !< array of all load cases
|
||||
type(tSolutionState), allocatable, dimension(:) :: solres
|
||||
PetscInt :: faceSet, currentFaceSet
|
||||
|
@ -134,17 +112,13 @@ program DAMASK_FEM
|
|||
PetscErrorCode :: ierr
|
||||
|
||||
external :: &
|
||||
MPI_abort, &
|
||||
DMGetDimension, &
|
||||
DMGetLabelSize, &
|
||||
DMGetLabelIdIS, &
|
||||
ISDestroy, &
|
||||
quit
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! init DAMASK (all modules)
|
||||
call CPFEM_initAll(el = 1_pInt, ip = 1_pInt)
|
||||
write(6,'(/,a)') ' <<<+- DAMASK_FEM init -+>>>'
|
||||
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
||||
write(6,'(/,a)') ' <<<+- DAMASK_FEM init -+>>>'
|
||||
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
||||
#include "compilation_info.f90"
|
||||
|
||||
! reading basic information from load case file and allocate data structure containing load cases
|
||||
|
@ -154,12 +128,13 @@ program DAMASK_FEM
|
|||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! reading basic information from load case file and allocate data structure containing load cases
|
||||
call IO_open_file(FILEUNIT,trim(loadCaseFile))
|
||||
rewind(FILEUNIT)
|
||||
open(newunit=fileunit,iostat=myStat,file=trim(loadCaseFile),action='read')
|
||||
if (myStat /= 0_pInt) call IO_error(100_pInt,el=myStat,ext_msg=trim(loadCaseFile))
|
||||
do
|
||||
line = IO_read(FILEUNIT)
|
||||
if (trim(line) == IO_EOF) exit
|
||||
read(fileUnit, '(A)', iostat=myStat) line
|
||||
if ( myStat /= 0_pInt) exit
|
||||
if (IO_isBlank(line)) cycle ! skip empty lines
|
||||
|
||||
chunkPos = IO_stringPos(line)
|
||||
do i = 1_pInt, chunkPos(1) ! reading compulsory parameters for loadcase
|
||||
select case (IO_lc(IO_stringValue(line,chunkPos,i)))
|
||||
|
@ -183,6 +158,16 @@ program DAMASK_FEM
|
|||
case(FIELD_MECH_ID)
|
||||
loadCases(i)%fieldBC(field)%nComponents = dimPlex !< X, Y (, Z) displacements
|
||||
allocate(loadCases(i)%fieldBC(field)%componentBC(loadCases(i)%fieldBC(field)%nComponents))
|
||||
do component = 1, loadCases(i)%fieldBC(field)%nComponents
|
||||
select case (component)
|
||||
case (1)
|
||||
loadCases(i)%fieldBC(field)%componentBC(component)%ID = COMPONENT_MECH_X_ID
|
||||
case (2)
|
||||
loadCases(i)%fieldBC(field)%componentBC(component)%ID = COMPONENT_MECH_Y_ID
|
||||
case (3)
|
||||
loadCases(i)%fieldBC(field)%componentBC(component)%ID = COMPONENT_MECH_Z_ID
|
||||
end select
|
||||
enddo
|
||||
end select
|
||||
do component = 1, loadCases(i)%fieldBC(field)%nComponents
|
||||
allocate(loadCases(i)%fieldBC(field)%componentBC(component)%Value(mesh_Nboundaries), source = 0.0_pReal)
|
||||
|
@ -193,11 +178,12 @@ program DAMASK_FEM
|
|||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! reading the load case and assign values to the allocated data structure
|
||||
rewind(FILEUNIT)
|
||||
rewind(fileUnit)
|
||||
do
|
||||
line = IO_read(FILEUNIT)
|
||||
if (trim(line) == IO_EOF) exit
|
||||
read(fileUnit, '(A)', iostat=myStat) line
|
||||
if ( myStat /= 0_pInt) exit
|
||||
if (IO_isBlank(line)) cycle ! skip empty lines
|
||||
|
||||
chunkPos = IO_stringPos(line)
|
||||
do i = 1_pInt, chunkPos(1)
|
||||
select case (IO_lc(IO_stringValue(line,chunkPos,i)))
|
||||
|
@ -268,134 +254,15 @@ program DAMASK_FEM
|
|||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('temp','temperature') ! thermal field
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_THERMAL_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_THERMAL_T_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('mgtwin') ! mgtwin field
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_MGTWIN_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_MGTWIN_PHI_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('damage')
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_DAMAGE_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_DAMAGE_PHI_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('cv')
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_SOLUTE_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_SOLUTE_CV_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('cvpot')
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_SOLUTE_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_SOLUTE_CVPOT_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('ch')
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_SOLUTE_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_SOLUTE_CH_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('chpot')
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_SOLUTE_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_SOLUTE_CHPOT_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('cvah')
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_SOLUTE_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_SOLUTE_CVaH_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
case('cvahpot')
|
||||
do field = 1, nActiveFields
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%ID == FIELD_SOLUTE_ID) then
|
||||
do component = 1, loadcases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
if (loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%ID == COMPONENT_SOLUTE_CVaHPOT_ID) then
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Mask (currentFaceSet) = &
|
||||
.true.
|
||||
loadCases(currentLoadCase)%fieldBC(field)%componentBC(component)%Value(currentFaceSet) = &
|
||||
IO_floatValue(line,chunkPos,i+1_pInt)
|
||||
endif
|
||||
enddo
|
||||
endif
|
||||
enddo
|
||||
|
||||
end select
|
||||
enddo; enddo
|
||||
close(FILEUNIT)
|
||||
close(fileUnit)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! consistency checks and output of load case
|
||||
loadCases(1)%followFormerTrajectory = .false. ! cannot guess along trajectory for first inc of first currentLoadCase
|
||||
errorID = 0_pInt
|
||||
if (worldrank == 0) then
|
||||
checkLoadcases: do currentLoadCase = 1_pInt, size(loadCases)
|
||||
checkLoadcases: do currentLoadCase = 1_pInt, size(loadCases)
|
||||
write (loadcase_string, '(i6)' ) currentLoadCase
|
||||
write(6,'(1x,a,i6)') 'load case: ', currentLoadCase
|
||||
if (.not. loadCases(currentLoadCase)%followFormerTrajectory) &
|
||||
|
@ -405,18 +272,6 @@ program DAMASK_FEM
|
|||
case(FIELD_MECH_ID)
|
||||
write(6,'(2x,a)') 'Field '//trim(FIELD_MECH_label)
|
||||
|
||||
case(FIELD_THERMAL_ID)
|
||||
write(6,'(2x,a)') 'Field '//trim(FIELD_THERMAL_label)
|
||||
|
||||
case(FIELD_DAMAGE_ID)
|
||||
write(6,'(2x,a)') 'Field '//trim(FIELD_DAMAGE_label)
|
||||
|
||||
case(FIELD_MGTWIN_ID)
|
||||
write(6,'(2x,a)') 'Field '//trim(FIELD_MGTWIN_label)
|
||||
|
||||
case(FIELD_SOLUTE_ID)
|
||||
write(6,'(2x,a)') 'Field '//trim(FIELD_SOLUTE_label)
|
||||
|
||||
end select
|
||||
do faceSet = 1_pInt, mesh_Nboundaries
|
||||
do component = 1_pInt, loadCases(currentLoadCase)%fieldBC(field)%nComponents
|
||||
|
@ -437,11 +292,10 @@ program DAMASK_FEM
|
|||
write(6,'(2x,a,i5,/)') 'restart frequency: ', &
|
||||
loadCases(currentLoadCase)%restartfrequency
|
||||
if (errorID > 0_pInt) call IO_error(error_ID = errorID, ext_msg = loadcase_string) ! exit with error message
|
||||
enddo checkLoadcases
|
||||
endif
|
||||
enddo checkLoadcases
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! doing initialization depending on selected solver
|
||||
! doing initialization depending on active solvers
|
||||
call Utilities_init()
|
||||
do field = 1, nActiveFields
|
||||
select case (loadCases(1)%fieldBC(field)%ID)
|
||||
|
@ -450,56 +304,49 @@ program DAMASK_FEM
|
|||
end select
|
||||
enddo
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! loopping over loadcases
|
||||
loadCaseLooping: do currentLoadCase = 1_pInt, size(loadCases)
|
||||
time0 = time ! currentLoadCase start time
|
||||
if (loadCases(currentLoadCase)%followFormerTrajectory) then
|
||||
guess = .true.
|
||||
else
|
||||
guess = .false. ! change of load case, homogeneous guess for the first inc
|
||||
endif
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! loop oper incs defined in input file for current currentLoadCase
|
||||
loadCaseLooping: do currentLoadCase = 1_pInt, size(loadCases)
|
||||
time0 = time ! load case start time
|
||||
guess = loadCases(currentLoadCase)%followFormerTrajectory ! change of load case? homogeneous guess for the first inc
|
||||
|
||||
incLooping: do inc = 1_pInt, loadCases(currentLoadCase)%incs
|
||||
totalIncsCounter = totalIncsCounter + 1_pInt
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! forwarding time
|
||||
timeIncOld = timeinc
|
||||
timeIncOld = timeinc ! last timeinc that brought former inc to an end
|
||||
if (loadCases(currentLoadCase)%logscale == 0_pInt) then ! linear scale
|
||||
timeinc = loadCases(currentLoadCase)%time/loadCases(currentLoadCase)%incs ! only valid for given linear time scale. will be overwritten later in case loglinear scale is used
|
||||
timeinc = loadCases(currentLoadCase)%time/real(loadCases(currentLoadCase)%incs,pReal)
|
||||
else
|
||||
if (currentLoadCase == 1_pInt) then ! 1st currentLoadCase of logarithmic scale
|
||||
if (inc == 1_pInt) then ! 1st inc of 1st currentLoadCase of logarithmic scale
|
||||
if (currentLoadCase == 1_pInt) then ! 1st load case of logarithmic scale
|
||||
if (inc == 1_pInt) then ! 1st inc of 1st load case of logarithmic scale
|
||||
timeinc = loadCases(1)%time*(2.0_pReal**real( 1_pInt-loadCases(1)%incs ,pReal)) ! assume 1st inc is equal to 2nd
|
||||
else ! not-1st inc of 1st currentLoadCase of logarithmic scale
|
||||
else ! not-1st inc of 1st load case of logarithmic scale
|
||||
timeinc = loadCases(1)%time*(2.0_pReal**real(inc-1_pInt-loadCases(1)%incs ,pReal))
|
||||
endif
|
||||
else ! not-1st currentLoadCase of logarithmic scale
|
||||
else ! not-1st load case of logarithmic scale
|
||||
timeinc = time0 * &
|
||||
( (1.0_pReal + loadCases(currentLoadCase)%time/time0 )**(real( inc,pReal)/&
|
||||
real(loadCases(currentLoadCase)%incs ,pReal))&
|
||||
-(1.0_pReal + loadCases(currentLoadCase)%time/time0 )**(real( (inc-1_pInt),pReal)/&
|
||||
-(1.0_pReal + loadCases(currentLoadCase)%time/time0 )**(real( inc-1_pInt ,pReal)/&
|
||||
real(loadCases(currentLoadCase)%incs ,pReal)))
|
||||
endif
|
||||
endif
|
||||
timeinc = timeinc / 2.0_pReal**real(cutBackLevel,pReal) ! depending on cut back level, decrease time step
|
||||
timeinc = timeinc * real(subStepFactor,pReal)**real(-cutBackLevel,pReal) ! depending on cut back level, decrease time step
|
||||
|
||||
forwarding: if(totalIncsCounter >= restartInc) then
|
||||
stepFraction = 0_pInt
|
||||
skipping: if (totalIncsCounter <= restartInc) then ! not yet at restart inc?
|
||||
time = time + timeinc ! just advance time, skip already performed calculation
|
||||
guess = .true. ! QUESTION:why forced guessing instead of inheriting loadcase preference
|
||||
else skipping
|
||||
stepFraction = 0_pInt ! fraction scaled by stepFactor**cutLevel
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! loop over sub incs
|
||||
subIncLooping: do while (stepFraction/subStepFactor**cutBackLevel <1_pInt)
|
||||
time = time + timeinc ! forward time
|
||||
stepFraction = stepFraction + 1_pInt
|
||||
remainingLoadCaseTime = time0 - time + loadCases(currentLoadCase)%time + timeInc
|
||||
subStepLooping: do while (stepFraction < subStepFactor**cutBackLevel)
|
||||
remainingLoadCaseTime = loadCases(currentLoadCase)%time+time0 - time
|
||||
time = time + timeinc ! forward target time
|
||||
stepFraction = stepFraction + 1_pInt ! count step
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! report begin of new increment
|
||||
if (worldrank == 0) then
|
||||
! report begin of new step
|
||||
write(6,'(/,a)') ' ###########################################################################'
|
||||
write(6,'(1x,a,es12.5'//&
|
||||
',a,'//IO_intOut(inc)//',a,'//IO_intOut(loadCases(currentLoadCase)%incs)//&
|
||||
|
@ -509,12 +356,14 @@ program DAMASK_FEM
|
|||
's: Increment ', inc, '/', loadCases(currentLoadCase)%incs,&
|
||||
'-', stepFraction, '/', subStepFactor**cutBackLevel,&
|
||||
' of load case ', currentLoadCase,'/',size(loadCases)
|
||||
flush(6)
|
||||
write(incInfo,'(a,'//IO_intOut(totalIncsCounter)//',a,'//IO_intOut(sum(loadCases%incs))//&
|
||||
',a,'//IO_intOut(stepFraction)//',a,'//IO_intOut(subStepFactor**cutBackLevel)//')') &
|
||||
write(incInfo,&
|
||||
'(a,'//IO_intOut(totalIncsCounter)//&
|
||||
',a,'//IO_intOut(sum(loadCases%incs))//&
|
||||
',a,'//IO_intOut(stepFraction)//&
|
||||
',a,'//IO_intOut(subStepFactor**cutBackLevel)//')') &
|
||||
'Increment ',totalIncsCounter,'/',sum(loadCases%incs),&
|
||||
'-',stepFraction, '/', subStepFactor**cutBackLevel
|
||||
endif
|
||||
flush(6)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! forward fields
|
||||
|
@ -539,12 +388,14 @@ program DAMASK_FEM
|
|||
incInfo,timeinc,timeIncOld,loadCases(currentLoadCase)%fieldBC(field))
|
||||
|
||||
end select
|
||||
|
||||
if(.not. solres(field)%converged) exit ! no solution found
|
||||
|
||||
enddo
|
||||
stagIter = stagIter + 1_pInt
|
||||
stagIterate = stagIter < stagItMax .and. &
|
||||
all(solres(:)%converged) .and. &
|
||||
.not. all(solres(:)%stagConverged)
|
||||
stagIterate = stagIter < stagItMax &
|
||||
.and. all(solres(:)%converged) &
|
||||
.and. .not. all(solres(:)%stagConverged) ! stationary with respect to staggered iteration
|
||||
enddo
|
||||
|
||||
! check solution
|
||||
|
@ -570,85 +421,49 @@ program DAMASK_FEM
|
|||
if (worldrank == 0) write(statUnit,*) totalIncsCounter, time, cutBackLevel, &
|
||||
solres%converged, solres%iterationsNeeded ! write statistics about accepted solution
|
||||
endif
|
||||
enddo subIncLooping
|
||||
enddo subStepLooping
|
||||
|
||||
cutBackLevel = max(0_pInt, cutBackLevel - 1_pInt) ! try half number of subincs next inc
|
||||
if(all(solres(:)%converged)) then ! report converged inc
|
||||
|
||||
if (all(solres(:)%converged)) then
|
||||
convergedCounter = convergedCounter + 1_pInt
|
||||
if (worldrank == 0) then
|
||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') &
|
||||
' increment ', totalIncsCounter, ' converged'
|
||||
endif
|
||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report converged inc
|
||||
' increment ', totalIncsCounter, ' converged'
|
||||
else
|
||||
if (worldrank == 0) then
|
||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc
|
||||
' increment ', totalIncsCounter, ' NOT converged'
|
||||
endif
|
||||
notConvergedCounter = notConvergedCounter + 1_pInt
|
||||
write(6,'(/,a,'//IO_intOut(totalIncsCounter)//',a)') & ! report non-converged inc
|
||||
' increment ', totalIncsCounter, ' NOT converged'
|
||||
endif; flush(6)
|
||||
|
||||
if (mod(inc,loadCases(currentLoadCase)%outputFrequency) == 0_pInt) then ! at output frequency
|
||||
if (worldrank == 0) then
|
||||
write(6,'(1/,a)') ' ... writing results to file ......................................'
|
||||
endif
|
||||
write(6,'(1/,a)') ' ToDo: ... writing results to file ......................................'
|
||||
endif
|
||||
if( loadCases(currentLoadCase)%restartFrequency > 0_pInt .and. & ! at frequency of writing restart information set restart parameter for FEsolving
|
||||
mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0_pInt) then ! ToDo first call to CPFEM_general will write?
|
||||
restartWrite = .true.
|
||||
lastRestartWritten = inc
|
||||
endif
|
||||
else forwarding
|
||||
time = time + timeinc
|
||||
guess = .true.
|
||||
endif forwarding
|
||||
if ( loadCases(currentLoadCase)%restartFrequency > 0_pInt & ! writing of restart info requested ...
|
||||
.and. mod(inc,loadCases(currentLoadCase)%restartFrequency) == 0_pInt) then ! ... and at frequency of writing restart information
|
||||
restartWrite = .true. ! set restart parameter for FEsolving
|
||||
lastRestartWritten = inc ! QUESTION: first call to CPFEM_general will write?
|
||||
endif
|
||||
|
||||
endif skipping
|
||||
|
||||
enddo incLooping
|
||||
|
||||
enddo loadCaseLooping
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! report summary of whole calculation
|
||||
if (worldrank == 0) then
|
||||
write(6,'(/,a)') ' ###########################################################################'
|
||||
write(6,'(1x,i6.6,a,i6.6,a,f5.1,a)') convergedCounter, ' out of ', &
|
||||
notConvergedCounter + convergedCounter, ' (', &
|
||||
real(convergedCounter, pReal)/&
|
||||
real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, &
|
||||
' %) increments converged!'
|
||||
endif
|
||||
if (notConvergedCounter > 0_pInt) call quit(3_pInt) ! error if some are not converged
|
||||
call quit(0_pInt) ! no complains ;)
|
||||
write(6,'(1x,'//IO_intOut(convergedCounter)//',a,'//IO_intOut(notConvergedCounter + convergedCounter)//',a,f5.1,a)') &
|
||||
convergedCounter, ' out of ', &
|
||||
notConvergedCounter + convergedCounter, ' (', &
|
||||
real(convergedCounter, pReal)/&
|
||||
real(notConvergedCounter + convergedCounter,pReal)*100.0_pReal, ' %) increments converged!'
|
||||
flush(6)
|
||||
call MPI_file_close(fileUnit,ierr)
|
||||
close(statUnit)
|
||||
|
||||
end program DAMASK_FEM
|
||||
if (notConvergedCounter > 0_pInt) call quit(2_pInt) ! error if some are not converged
|
||||
call quit(0_pInt) ! no complains ;)
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||
!> @brief quit subroutine to mimic behavior of FEM solvers
|
||||
!> @details exits the Spectral solver and reports time and duration. Exit code 0 signals
|
||||
!> everything went fine. Exit code 1 signals an error, message according to IO_error. Exit code
|
||||
!> 2 signals request for regridding, increment of last saved restart information is written to
|
||||
!> stderr. Exit code 3 signals no severe problems, but some increments did not converge
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine quit(stop_id)
|
||||
use prec, only: &
|
||||
pInt
|
||||
|
||||
implicit none
|
||||
integer(pInt), intent(in) :: stop_id
|
||||
integer, dimension(8) :: dateAndTime ! type default integer
|
||||
|
||||
call date_and_time(values = dateAndTime)
|
||||
write(6,'(/,a)') 'DAMASK terminated on:'
|
||||
write(6,'(a,2(i2.2,a),i4.4)') 'Date: ',dateAndTime(3),'/',&
|
||||
dateAndTime(2),'/',&
|
||||
dateAndTime(1)
|
||||
write(6,'(a,2(i2.2,a),i2.2)') 'Time: ',dateAndTime(5),':',&
|
||||
dateAndTime(6),':',&
|
||||
dateAndTime(7)
|
||||
if (stop_id == 0_pInt) stop 0 ! normal termination
|
||||
if (stop_id < 0_pInt) then ! trigger regridding
|
||||
write(0,'(a,i6)') 'restart information available at ', stop_id*(-1_pInt)
|
||||
stop 2
|
||||
endif
|
||||
if (stop_id == 3_pInt) stop 3 ! not all incs converged
|
||||
stop 1 ! error (message from IO_error)
|
||||
|
||||
end subroutine quit
|
||||
end program DAMASK_FEM
|
||||
|
|
|
@ -43,24 +43,23 @@ subroutine DAMASK_interface_init()
|
|||
use, intrinsic :: &
|
||||
iso_fortran_env
|
||||
#include <petsc/finclude/petscsys.h>
|
||||
#if PETSC_VERSION_MAJOR!=3 || PETSC_VERSION_MINOR!=9
|
||||
#if PETSC_VERSION_MAJOR!=3 || PETSC_VERSION_MINOR!=10
|
||||
===================================================================================================
|
||||
3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x
|
||||
3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x
|
||||
===================================================================================================
|
||||
======= THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ===========================================
|
||||
========== THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ========================================
|
||||
============= THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x =====================================
|
||||
================ THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ==================================
|
||||
=================== THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ===============================
|
||||
====================== THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ============================
|
||||
========================= THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x =========================
|
||||
============================ THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ======================
|
||||
=============================== THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ===================
|
||||
================================== THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ================
|
||||
===================================== THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x =============
|
||||
======================================== THIS VERSION OF DAMASK REQUIRES PETSc 3.9.x ==========
|
||||
======= THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ==========================================
|
||||
========== THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x =======================================
|
||||
============= THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ====================================
|
||||
================ THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x =================================
|
||||
=================== THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ==============================
|
||||
====================== THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ===========================
|
||||
========================= THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ========================
|
||||
============================ THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x =====================
|
||||
=============================== THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ==================
|
||||
================================== THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ===============
|
||||
===================================== THIS VERSION OF DAMASK REQUIRES PETSc 3.10.x ============
|
||||
===================================================================================================
|
||||
3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x 3.9.x
|
||||
3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x 3.10.x
|
||||
===================================================================================================
|
||||
#endif
|
||||
use PETScSys
|
||||
|
@ -88,9 +87,7 @@ subroutine DAMASK_interface_init()
|
|||
dateAndTime ! type default integer
|
||||
PetscErrorCode :: ierr
|
||||
external :: &
|
||||
quit,&
|
||||
PETScErrorF, & ! is called in the CHKERRQ macro
|
||||
PETScInitialize
|
||||
quit
|
||||
|
||||
open(6, encoding='UTF-8') ! for special characters in output
|
||||
|
||||
|
@ -230,8 +227,8 @@ subroutine setWorkingDirectory(workingDirectoryArg)
|
|||
implicit none
|
||||
character(len=*), intent(in) :: workingDirectoryArg !< working directory argument
|
||||
character(len=1024) :: workingDirectory !< working directory argument
|
||||
external :: quit
|
||||
logical :: error
|
||||
external :: quit
|
||||
|
||||
absolutePath: if (workingDirectoryArg(1:1) == '/') then
|
||||
workingDirectory = workingDirectoryArg
|
||||
|
@ -284,11 +281,18 @@ character(len=1024) function getGeometryFile(geometryParameter)
|
|||
|
||||
implicit none
|
||||
character(len=1024), intent(in) :: geometryParameter
|
||||
logical :: file_exists
|
||||
external :: quit
|
||||
|
||||
getGeometryFile = trim(geometryParameter)
|
||||
if (scan(getGeometryFile,'/') /= 1) getGeometryFile = trim(getCWD())//'/'//trim(getGeometryFile)
|
||||
getGeometryFile = makeRelativePath(trim(getCWD()), getGeometryFile)
|
||||
|
||||
inquire(file=trim(getGeometryFile), exist=file_exists)
|
||||
if (.not. file_exists) then
|
||||
write(6,'(a)') ' Geometry file does not exists ('//trim(getGeometryFile)//')'
|
||||
call quit(1_pInt)
|
||||
endif
|
||||
|
||||
end function getGeometryFile
|
||||
|
||||
|
@ -302,11 +306,19 @@ character(len=1024) function getLoadCaseFile(loadCaseParameter)
|
|||
|
||||
implicit none
|
||||
character(len=1024), intent(in) :: loadCaseParameter
|
||||
logical :: file_exists
|
||||
external :: quit
|
||||
|
||||
getLoadCaseFile = trim(loadCaseParameter)
|
||||
if (scan(getLoadCaseFile,'/') /= 1) getLoadCaseFile = trim(getCWD())//'/'//trim(getLoadCaseFile)
|
||||
getLoadCaseFile = makeRelativePath(trim(getCWD()), getLoadCaseFile)
|
||||
|
||||
inquire(file=trim(getLoadCaseFile), exist=file_exists)
|
||||
if (.not. file_exists) then
|
||||
write(6,'(a)') ' Geometry file does not exists ('//trim(getLoadCaseFile)//')'
|
||||
call quit(1_pInt)
|
||||
endif
|
||||
|
||||
end function getLoadCaseFile
|
||||
|
||||
|
||||
|
|
|
@ -88,7 +88,6 @@ program DAMASK_spectral
|
|||
real(pReal), dimension(9) :: temp_valueVector = 0.0_pReal !< temporarily from loadcase file when reading in tensors (initialize to 0.0)
|
||||
logical, dimension(9) :: temp_maskVector = .false. !< temporarily from loadcase file when reading in tensors
|
||||
integer(pInt), allocatable, dimension(:) :: chunkPos
|
||||
|
||||
integer(pInt) :: &
|
||||
N_t = 0_pInt, & !< # of time indicators found in load case file
|
||||
N_n = 0_pInt, & !< # of increment specifiers found in load case file
|
||||
|
@ -130,8 +129,7 @@ program DAMASK_spectral
|
|||
stagIter
|
||||
character(len=6) :: loadcase_string
|
||||
character(len=1024) :: &
|
||||
incInfo, & !< string parsed to solution with information about current load case
|
||||
workingDir
|
||||
incInfo
|
||||
type(tLoadCase), allocatable, dimension(:) :: loadCases !< array of all load cases
|
||||
type(tLoadCase) :: newLoadCase
|
||||
type(tSolutionState), allocatable, dimension(:) :: solres
|
||||
|
@ -140,7 +138,7 @@ program DAMASK_spectral
|
|||
integer(pInt), parameter :: maxByteOut = 2147483647-4096 !< limit of one file output write https://trac.mpich.org/projects/mpich/ticket/1742
|
||||
integer(pInt), parameter :: maxRealOut = maxByteOut/pReal
|
||||
integer(pLongInt), dimension(2) :: outputIndex
|
||||
integer :: ierr
|
||||
PetscErrorCode :: ierr
|
||||
procedure(basic_init), pointer :: &
|
||||
mech_init
|
||||
procedure(basic_forward), pointer :: &
|
||||
|
@ -151,7 +149,6 @@ program DAMASK_spectral
|
|||
external :: &
|
||||
quit
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! init DAMASK (all modules)
|
||||
call CPFEM_initAll(el = 1_pInt, ip = 1_pInt)
|
||||
|
@ -378,7 +375,7 @@ program DAMASK_spectral
|
|||
open(newunit=fileUnit,file=trim(getSolverJobName())//&
|
||||
'.spectralOut',form='UNFORMATTED',status='REPLACE')
|
||||
write(fileUnit) 'load:', trim(loadCaseFile) ! ... and write header
|
||||
write(fileUnit) 'workingdir:', trim(workingDir)
|
||||
write(fileUnit) 'workingdir:', 'n/a'
|
||||
write(fileUnit) 'geometry:', trim(geometryFile)
|
||||
write(fileUnit) 'grid:', grid
|
||||
write(fileUnit) 'size:', geomSize
|
||||
|
@ -434,14 +431,12 @@ program DAMASK_spectral
|
|||
enddo
|
||||
fileOffset = fileOffset + sum(outputSize) ! forward to current file position
|
||||
endif writeUndeformed
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! looping over load cases
|
||||
|
||||
|
||||
loadCaseLooping: do currentLoadCase = 1_pInt, size(loadCases)
|
||||
time0 = time ! load case start time
|
||||
guess = loadCases(currentLoadCase)%followFormerTrajectory ! change of load case? homogeneous guess for the first inc
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! loop over incs defined in input file for current load case
|
||||
incLooping: do inc = 1_pInt, loadCases(currentLoadCase)%incs
|
||||
totalIncsCounter = totalIncsCounter + 1_pInt
|
||||
|
||||
|
@ -473,8 +468,6 @@ program DAMASK_spectral
|
|||
else skipping
|
||||
stepFraction = 0_pInt ! fraction scaled by stepFactor**cutLevel
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! loop over sub step
|
||||
subStepLooping: do while (stepFraction < subStepFactor**cutBackLevel)
|
||||
remainingLoadCaseTime = loadCases(currentLoadCase)%time+time0 - time
|
||||
time = time + timeinc ! forward target time
|
||||
|
@ -629,63 +622,7 @@ program DAMASK_spectral
|
|||
call MPI_file_close(fileUnit,ierr)
|
||||
close(statUnit)
|
||||
|
||||
if (notConvergedCounter > 0_pInt) call quit(3_pInt) ! error if some are not converged
|
||||
if (notConvergedCounter > 0_pInt) call quit(2_pInt) ! error if some are not converged
|
||||
call quit(0_pInt) ! no complains ;)
|
||||
|
||||
end program DAMASK_spectral
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||
!> @brief quit subroutine to mimic behavior of FEM solvers
|
||||
!> @details exits the Spectral solver and reports time and duration. Exit code 0 signals
|
||||
!> everything went fine. Exit code 1 signals an error, message according to IO_error. Exit code
|
||||
!> 2 signals no converged solution and increment of last saved restart information is written to
|
||||
!> stderr. Exit code 3 signals no severe problems, but some increments did not converge
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine quit(stop_id)
|
||||
#include <petsc/finclude/petscsys.h>
|
||||
#ifdef _OPENMP
|
||||
use MPI, only: &
|
||||
MPI_finalize
|
||||
#endif
|
||||
use prec, only: &
|
||||
pInt
|
||||
|
||||
implicit none
|
||||
integer(pInt), intent(in) :: stop_id
|
||||
integer, dimension(8) :: dateAndTime ! type default integer
|
||||
integer(pInt) :: error = 0_pInt
|
||||
PetscErrorCode :: ierr = 0
|
||||
logical :: ErrorInQuit
|
||||
|
||||
external :: &
|
||||
PETScFinalize
|
||||
|
||||
call PETScFinalize(ierr)
|
||||
if (ierr /= 0) write(6,'(a)') ' Error in PETScFinalize'
|
||||
#ifdef _OPENMP
|
||||
call MPI_finalize(error)
|
||||
if (error /= 0) write(6,'(a)') ' Error in MPI_finalize'
|
||||
#endif
|
||||
ErrorInQuit = (ierr /= 0 .or. error /= 0_pInt)
|
||||
|
||||
call date_and_time(values = dateAndTime)
|
||||
write(6,'(/,a)') 'DAMASK terminated on:'
|
||||
write(6,'(a,2(i2.2,a),i4.4)') 'Date: ',dateAndTime(3),'/',&
|
||||
dateAndTime(2),'/',&
|
||||
dateAndTime(1)
|
||||
write(6,'(a,2(i2.2,a),i2.2)') 'Time: ',dateAndTime(5),':',&
|
||||
dateAndTime(6),':',&
|
||||
dateAndTime(7)
|
||||
|
||||
if (stop_id == 0_pInt .and. .not. ErrorInQuit) stop 0 ! normal termination
|
||||
if (stop_id < 0_pInt .and. .not. ErrorInQuit) then ! terminally ill, restart might help
|
||||
write(0,'(a,i6)') 'restart information available at ', stop_id*(-1_pInt)
|
||||
stop 2
|
||||
endif
|
||||
if (stop_id == 3_pInt .and. .not. ErrorInQuit) stop 3 ! not all incs converged
|
||||
|
||||
stop 1 ! error (message from IO_error)
|
||||
|
||||
end subroutine quit
|
||||
|
|
|
@ -5,12 +5,14 @@
|
|||
!> @brief FEM PETSc solver
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
module FEM_mech
|
||||
#include <petsc/finclude/petscdmplex.h>
|
||||
#include <petsc/finclude/petscdm.h>
|
||||
#include <petsc/finclude/petsc.h>
|
||||
|
||||
use PETScdmda
|
||||
use PETScsnes
|
||||
use PETScDM
|
||||
use PETScDMplex
|
||||
use PETScsnes
|
||||
use PETScDM
|
||||
use PETScDMplex
|
||||
use PETScDT
|
||||
use prec, only: &
|
||||
pInt, &
|
||||
pReal
|
||||
|
@ -20,9 +22,6 @@ use PETScDMplex
|
|||
tSolutionState, &
|
||||
tFieldBC, &
|
||||
tComponentBC
|
||||
use numerics, only: &
|
||||
worldrank, &
|
||||
worldsize
|
||||
use mesh, only: &
|
||||
mesh_Nboundaries, &
|
||||
mesh_boundaries
|
||||
|
@ -45,7 +44,7 @@ use PETScDMplex
|
|||
SNES, private :: mech_snes
|
||||
Vec, private :: solution, solution_rate, solution_local
|
||||
PetscInt, private :: dimPlex, cellDof, nQuadrature, nBasis
|
||||
PetscReal, allocatable, target,dimension(:), private :: qPoints, qWeights
|
||||
PetscReal, allocatable, target, private :: qPoints(:), qWeights(:)
|
||||
MatNullSpace, private :: matnull
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
@ -61,27 +60,6 @@ use PETScDMplex
|
|||
FEM_mech_solution ,&
|
||||
FEM_mech_forward, &
|
||||
FEM_mech_destroy
|
||||
|
||||
external :: &
|
||||
MatZeroRowsColumnsLocalIS, &
|
||||
PetscQuadratureCreate, &
|
||||
PetscFECreateDefault, &
|
||||
PetscFESetQuadrature, &
|
||||
PetscFEGetDimension, &
|
||||
PetscFEDestroy, &
|
||||
PetscFEGetDualSpace, &
|
||||
PetscQuadratureDestroy, &
|
||||
PetscDSSetDiscretization, &
|
||||
PetscDSGetTotalDimension, &
|
||||
PetscDSGetDiscretization, &
|
||||
PetscDualSpaceGetFunctional, &
|
||||
DMGetLabelSize, &
|
||||
DMSNESSetFunctionLocal, &
|
||||
DMSNESSetJacobianLocal, &
|
||||
SNESSetOptionsPrefix, &
|
||||
SNESSetConvergenceTest, &
|
||||
PetscObjectSetName
|
||||
|
||||
contains
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
@ -97,7 +75,6 @@ subroutine FEM_mech_init(fieldBC)
|
|||
use mesh, only: &
|
||||
geomMesh
|
||||
use numerics, only: &
|
||||
worldrank, &
|
||||
itmax, &
|
||||
integrationOrder
|
||||
use FEM_Zoo, only: &
|
||||
|
@ -115,14 +92,14 @@ subroutine FEM_mech_init(fieldBC)
|
|||
DMLabel :: BCLabel
|
||||
PetscInt, allocatable, target :: numComp(:), numDoF(:), bcField(:)
|
||||
PetscInt, pointer :: pNumComp(:), pNumDof(:), pBcField(:), pBcPoint(:)
|
||||
PetscInt :: numBC, bcSize
|
||||
PetscInt :: numBC, bcSize, nc
|
||||
IS :: bcPoint
|
||||
IS, allocatable, target :: bcComps(:), bcPoints(:)
|
||||
IS, pointer :: pBcComps(:), pBcPoints(:)
|
||||
PetscSection :: section
|
||||
PetscInt :: field, faceSet, topologDim, nNodalPoints
|
||||
PetscReal, pointer :: qPointsP(:), qWeightsP(:), &
|
||||
nodalPointsP(:), nodalWeightsP(:)
|
||||
PetscReal, dimension(:) , pointer :: qPointsP, qWeightsP, &
|
||||
nodalPointsP, nodalWeightsP
|
||||
PetscReal, allocatable, target :: nodalPoints(:), nodalWeights(:)
|
||||
PetscScalar, pointer :: px_scal(:)
|
||||
PetscScalar, allocatable, target :: x_scal(:)
|
||||
|
@ -132,7 +109,7 @@ subroutine FEM_mech_init(fieldBC)
|
|||
PetscInt :: cellStart, cellEnd, cell, basis
|
||||
character(len=7) :: prefix = 'mechFE_'
|
||||
PetscErrorCode :: ierr
|
||||
|
||||
|
||||
write(6,'(/,a)') ' <<<+- FEM_mech init -+>>>'
|
||||
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
||||
#include "compilation_info.f90"
|
||||
|
@ -144,20 +121,21 @@ subroutine FEM_mech_init(fieldBC)
|
|||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! Setup FEM mech discretization
|
||||
allocate(qPoints(dimPlex*FEM_Zoo_nQuadrature(dimPlex,integrationOrder)))
|
||||
allocate(qWeights(FEM_Zoo_nQuadrature(dimPlex,integrationOrder)))
|
||||
qPoints = FEM_Zoo_QuadraturePoints(dimPlex,integrationOrder)%p
|
||||
qWeights = FEM_Zoo_QuadratureWeights(dimPlex,integrationOrder)%p
|
||||
nQuadrature = FEM_Zoo_nQuadrature(dimPlex,integrationOrder)
|
||||
qPointsP => qPoints
|
||||
qWeightsP => qWeights
|
||||
call PetscQuadratureCreate(PETSC_COMM_SELF,mechQuad,ierr); CHKERRQ(ierr)
|
||||
call PetscQuadratureSetData(mechQuad,dimPlex,nQuadrature,qPointsP,qWeightsP,ierr)
|
||||
CHKERRQ(ierr)
|
||||
call PetscFECreateDefault(mech_mesh,dimPlex,dimPlex,PETSC_TRUE,prefix, &
|
||||
nc = dimPlex
|
||||
call PetscQuadratureSetData(mechQuad,dimPlex,nc,nQuadrature,qPointsP,qWeightsP,ierr)
|
||||
CHKERRQ(ierr)
|
||||
call PetscFECreateDefault(PETSC_COMM_SELF,dimPlex,nc,PETSC_TRUE,prefix, &
|
||||
integrationOrder,mechFE,ierr); CHKERRQ(ierr)
|
||||
call PetscFESetQuadrature(mechFE,mechQuad,ierr); CHKERRQ(ierr)
|
||||
call PetscFEGetDimension(mechFE,nBasis,ierr); CHKERRQ(ierr)
|
||||
nBasis = nBasis/nc
|
||||
call DMGetDS(mech_mesh,mechDS,ierr); CHKERRQ(ierr)
|
||||
call PetscDSAddDiscretization(mechDS,mechFE,ierr); CHKERRQ(ierr)
|
||||
call PetscDSGetTotalDimension(mechDS,cellDof,ierr); CHKERRQ(ierr)
|
||||
|
@ -168,7 +146,7 @@ subroutine FEM_mech_init(fieldBC)
|
|||
! Setup FEM mech boundary conditions
|
||||
call DMGetLabel(mech_mesh,'Face Sets',BCLabel,ierr); CHKERRQ(ierr)
|
||||
call DMPlexLabelComplete(mech_mesh,BCLabel,ierr); CHKERRQ(ierr)
|
||||
call DMGetDefaultSection(mech_mesh,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetSection(mech_mesh,section,ierr); CHKERRQ(ierr)
|
||||
allocate(numComp(1), source=dimPlex); pNumComp => numComp
|
||||
allocate(numDof(dimPlex+1), source = 0); pNumDof => numDof
|
||||
do topologDim = 0, dimPlex
|
||||
|
@ -210,7 +188,7 @@ subroutine FEM_mech_init(fieldBC)
|
|||
numBC,pBcField,pBcComps,pBcPoints,PETSC_NULL_IS, &
|
||||
section,ierr)
|
||||
CHKERRQ(ierr)
|
||||
call DMSetDefaultSection(mech_mesh,section,ierr); CHKERRQ(ierr)
|
||||
call DMSetSection(mech_mesh,section,ierr); CHKERRQ(ierr)
|
||||
do faceSet = 1, numBC
|
||||
call ISDestroy(bcPoints(faceSet),ierr); CHKERRQ(ierr)
|
||||
enddo
|
||||
|
@ -250,7 +228,7 @@ subroutine FEM_mech_init(fieldBC)
|
|||
pV0 => v0
|
||||
pCellJ => cellJ
|
||||
pInvcellJ => invcellJ
|
||||
call DMGetDefaultSection(mech_mesh,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetSection(mech_mesh,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetDS(mech_mesh,mechDS,ierr); CHKERRQ(ierr)
|
||||
call PetscDSGetDiscretization(mechDS,0,mechFE,ierr)
|
||||
CHKERRQ(ierr)
|
||||
|
@ -262,12 +240,12 @@ subroutine FEM_mech_init(fieldBC)
|
|||
call DMPlexComputeCellGeometryAffineFEM(mech_mesh,cell,pV0,pCellJ,pInvcellJ,detJ,ierr)
|
||||
CHKERRQ(ierr)
|
||||
cellJMat = reshape(pCellJ,shape=[dimPlex,dimPlex])
|
||||
do basis = 0, nBasis-1
|
||||
do basis = 0, nBasis*dimPlex-1, dimPlex
|
||||
call PetscDualSpaceGetFunctional(mechDualSpace,basis,functional,ierr)
|
||||
CHKERRQ(ierr)
|
||||
call PetscQuadratureGetData(functional,dimPlex,nNodalPoints,nodalPointsP,nodalWeightsP,ierr)
|
||||
call PetscQuadratureGetData(functional,dimPlex,nc,nNodalPoints,nodalPointsP,nodalWeightsP,ierr)
|
||||
CHKERRQ(ierr)
|
||||
x_scal(basis*dimPlex+1:(basis+1)*dimPlex) = pV0 + matmul(transpose(cellJMat),nodalPointsP + 1.0)
|
||||
x_scal(basis+1:basis+dimPlex) = pV0 + matmul(transpose(cellJMat),nodalPointsP + 1.0)
|
||||
enddo
|
||||
px_scal => x_scal
|
||||
call DMPlexVecSetClosure(mech_mesh,section,solution_local,cell,px_scal,INSERT_ALL_VALUES,ierr)
|
||||
|
@ -371,7 +349,7 @@ subroutine FEM_mech_formResidual(dm_local,xx_local,f_local,dummy,ierr)
|
|||
pV0 => v0
|
||||
pCellJ => cellJ
|
||||
pInvcellJ => invcellJ
|
||||
call DMGetDefaultSection(dm_local,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetSection(dm_local,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetDS(dm_local,prob,ierr); CHKERRQ(ierr)
|
||||
call PetscDSGetTabulation(prob,0,basisField,basisFieldDer,ierr)
|
||||
CHKERRQ(ierr)
|
||||
|
@ -405,8 +383,8 @@ subroutine FEM_mech_formResidual(dm_local,xx_local,f_local,dummy,ierr)
|
|||
do comp = 0, dimPlex-1
|
||||
cidx = basis*dimPlex+comp
|
||||
BMat(comp*dimPlex+1:(comp+1)*dimPlex,basis*dimPlex+comp+1) = &
|
||||
matmul(IcellJMat,basisFieldDer((qPt*nBasis*dimPlex+cidx )*dimPlex+1: &
|
||||
(qPt*nBasis*dimPlex+cidx+1)*dimPlex ))
|
||||
matmul(IcellJMat,basisFieldDer((((qPt*nBasis + basis)*dimPlex + comp)*dimPlex+comp )*dimPlex+1: &
|
||||
(((qPt*nBasis + basis)*dimPlex + comp)*dimPlex+comp+1)*dimPlex))
|
||||
enddo
|
||||
enddo
|
||||
materialpoint_F(1:dimPlex,1:dimPlex,qPt+1,cell+1) = &
|
||||
|
@ -446,8 +424,8 @@ subroutine FEM_mech_formResidual(dm_local,xx_local,f_local,dummy,ierr)
|
|||
do comp = 0, dimPlex-1
|
||||
cidx = basis*dimPlex+comp
|
||||
BMat(comp*dimPlex+1:(comp+1)*dimPlex,basis*dimPlex+comp+1) = &
|
||||
matmul(IcellJMat,basisFieldDer((qPt*nBasis*dimPlex+cidx )*dimPlex+1: &
|
||||
(qPt*nBasis*dimPlex+cidx+1)*dimPlex ))
|
||||
matmul(IcellJMat,basisFieldDer((((qPt*nBasis + basis)*dimPlex + comp)*dimPlex+comp )*dimPlex+1: &
|
||||
(((qPt*nBasis + basis)*dimPlex + comp)*dimPlex+comp+1)*dimPlex))
|
||||
enddo
|
||||
enddo
|
||||
f_scal = f_scal + &
|
||||
|
@ -520,8 +498,8 @@ subroutine FEM_mech_formJacobian(dm_local,xx_local,Jac_pre,Jac,dummy,ierr)
|
|||
call MatZeroEntries(Jac,ierr); CHKERRQ(ierr)
|
||||
call DMGetDS(dm_local,prob,ierr); CHKERRQ(ierr)
|
||||
call PetscDSGetTabulation(prob,0,basisField,basisFieldDer,ierr)
|
||||
call DMGetDefaultSection(dm_local,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetDefaultGlobalSection(dm_local,gSection,ierr); CHKERRQ(ierr)
|
||||
call DMGetSection(dm_local,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetGlobalSection(dm_local,gSection,ierr); CHKERRQ(ierr)
|
||||
|
||||
call DMGetLocalVector(dm_local,x_local,ierr); CHKERRQ(ierr)
|
||||
call VecWAXPY(x_local,1.0,xx_local,solution_local,ierr); CHKERRQ(ierr)
|
||||
|
@ -555,8 +533,8 @@ subroutine FEM_mech_formJacobian(dm_local,xx_local,Jac_pre,Jac,dummy,ierr)
|
|||
do comp = 0, dimPlex-1
|
||||
cidx = basis*dimPlex+comp
|
||||
BMat(comp*dimPlex+1:(comp+1)*dimPlex,basis*dimPlex+comp+1) = &
|
||||
matmul(IcellJMat,basisFieldDer((qPt*nBasis*dimPlex+cidx )*dimPlex+1: &
|
||||
(qPt*nBasis*dimPlex+cidx+1)*dimPlex ))
|
||||
matmul(IcellJMat,basisFieldDer((((qPt*nBasis + basis)*dimPlex + comp)*dimPlex+comp )*dimPlex+1: &
|
||||
(((qPt*nBasis + basis)*dimPlex + comp)*dimPlex+comp+1)*dimPlex))
|
||||
enddo
|
||||
enddo
|
||||
MatA = matmul(reshape(reshape(materialpoint_dPdF(1:dimPlex,1:dimPlex,1:dimPlex,1:dimPlex,qPt+1,cell+1), &
|
||||
|
@ -605,7 +583,7 @@ subroutine FEM_mech_formJacobian(dm_local,xx_local,Jac_pre,Jac,dummy,ierr)
|
|||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! apply boundary conditions
|
||||
!call DMPlexCreateRigidBody(dm_local,matnull,ierr); CHKERRQ(ierr) MD: linker error
|
||||
call DMPlexCreateRigidBody(dm_local,matnull,ierr); CHKERRQ(ierr)
|
||||
call MatSetNullSpace(Jac,matnull,ierr); CHKERRQ(ierr)
|
||||
call MatSetNearNullSpace(Jac,matnull,ierr); CHKERRQ(ierr)
|
||||
call MatNullSpaceDestroy(matnull,ierr); CHKERRQ(ierr)
|
||||
|
@ -646,7 +624,7 @@ subroutine FEM_mech_forward(guess,timeinc,timeinc_old,fieldBC)
|
|||
ForwardData = .True.
|
||||
materialpoint_F0 = materialpoint_F
|
||||
call SNESGetDM(mech_snes,dm_local,ierr); CHKERRQ(ierr) !< retrieve mesh info from mech_snes into dm_local
|
||||
call DMGetDefaultSection(dm_local,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetSection(dm_local,section,ierr); CHKERRQ(ierr)
|
||||
call DMGetLocalVector(dm_local,x_local,ierr); CHKERRQ(ierr)
|
||||
call VecSet(x_local,0.0,ierr); CHKERRQ(ierr)
|
||||
call DMGlobalToLocalBegin(dm_local,solution,INSERT_VALUES,x_local,ierr) !< retrieve my partition of global solution vector
|
||||
|
@ -684,6 +662,7 @@ end subroutine FEM_mech_forward
|
|||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine FEM_mech_converged(snes_local,PETScIter,xnorm,snorm,fnorm,reason,dummy,ierr)
|
||||
use numerics, only: &
|
||||
worldrank, &
|
||||
err_struct_tolAbs, &
|
||||
err_struct_tolRel
|
||||
use IO, only: &
|
||||
|
|
|
@ -3,9 +3,12 @@
|
|||
!> @brief Utilities used by the FEM solver
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
module FEM_utilities
|
||||
#include <petsc/finclude/petsc.h>
|
||||
#include <petsc/finclude/petscdmplex.h>
|
||||
#include <petsc/finclude/petscdmda.h>
|
||||
#include <petsc/finclude/petscis.h>
|
||||
use prec, only: pReal, pInt
|
||||
|
||||
use PETScdmplex
|
||||
use PETScdmda
|
||||
use PETScis
|
||||
|
||||
|
@ -21,25 +24,15 @@ use PETScis
|
|||
! grid related information information
|
||||
real(pReal), public :: wgt !< weighting factor 1/Nelems
|
||||
real(pReal), public :: wgtDof !< weighting factor 1/Nelems
|
||||
real(pReal), public :: C_volAvg(3,3,3,3)
|
||||
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! output data
|
||||
PetscViewer, public :: resUnit
|
||||
Vec, public :: coordinatesVec
|
||||
Vec, allocatable, public :: homogenizationResultsVec(:), &
|
||||
crystalliteResultsVec(:,:), &
|
||||
phaseResultsVec(:,:)
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
! field labels information
|
||||
character(len=*), parameter, public :: &
|
||||
FIELD_MECH_label = 'mechanical', &
|
||||
FIELD_THERMAL_label = 'thermal', &
|
||||
FIELD_DAMAGE_label = 'damage', &
|
||||
FIELD_SOLUTE_label = 'solute', &
|
||||
FIELD_MGTWIN_label = 'mgtwin'
|
||||
|
||||
FIELD_MECH_label = 'mechanical'
|
||||
|
||||
enum, bind(c)
|
||||
enumerator :: FIELD_UNDEFINED_ID, &
|
||||
FIELD_MECH_ID, &
|
||||
|
@ -123,34 +116,10 @@ use PETScis
|
|||
utilities_indexActiveSet, &
|
||||
utilities_destroy, &
|
||||
FIELD_MECH_ID, &
|
||||
FIELD_THERMAL_ID, &
|
||||
FIELD_DAMAGE_ID, &
|
||||
FIELD_SOLUTE_ID, &
|
||||
FIELD_MGTWIN_ID, &
|
||||
COMPONENT_MECH_X_ID, &
|
||||
COMPONENT_MECH_Y_ID, &
|
||||
COMPONENT_MECH_Z_ID, &
|
||||
COMPONENT_THERMAL_T_ID, &
|
||||
COMPONENT_DAMAGE_PHI_ID, &
|
||||
COMPONENT_SOLUTE_CV_ID, &
|
||||
COMPONENT_SOLUTE_CVPOT_ID, &
|
||||
COMPONENT_SOLUTE_CH_ID, &
|
||||
COMPONENT_SOLUTE_CHPOT_ID, &
|
||||
COMPONENT_SOLUTE_CVaH_ID, &
|
||||
COMPONENT_SOLUTE_CVaHPOT_ID, &
|
||||
COMPONENT_MGTWIN_PHI_ID
|
||||
|
||||
external :: &
|
||||
PetscOptionsInsertString, &
|
||||
PetscObjectSetName, &
|
||||
DMPlexGetHeightStratum, &
|
||||
DMGetLabelIdIS, &
|
||||
DMPlexGetChart, &
|
||||
DMPlexLabelComplete, &
|
||||
PetscViewerHDF5Open, &
|
||||
PetscViewerHDF5PushGroup, &
|
||||
PetscViewerHDF5PopGroup, &
|
||||
PetscViewerDestroy
|
||||
COMPONENT_THERMAL_T_ID
|
||||
|
||||
contains
|
||||
|
||||
|
@ -167,6 +136,7 @@ subroutine utilities_init()
|
|||
IO_timeStamp, &
|
||||
IO_open_file
|
||||
use numerics, only: &
|
||||
structOrder, &
|
||||
integrationOrder, &
|
||||
worldsize, &
|
||||
worldrank, &
|
||||
|
@ -190,14 +160,11 @@ subroutine utilities_init()
|
|||
|
||||
implicit none
|
||||
|
||||
character(len=1024) :: petsc_optionsPhysics, grainStr
|
||||
character(len=1024) :: petsc_optionsPhysics
|
||||
integer(pInt) :: dimPlex
|
||||
integer(pInt) :: headerID = 205_pInt
|
||||
PetscInt, dimension(:), pointer :: points
|
||||
PetscInt, allocatable :: nEntities(:), nOutputCells(:), nOutputNodes(:), mappingCells(:)
|
||||
PetscInt :: cellStart, cellEnd, cell, ip, dim, ctr, qPt
|
||||
PetscInt, allocatable :: connectivity(:,:)
|
||||
Vec :: connectivityVec
|
||||
PetscInt, allocatable :: nEntities(:), nOutputCells(:), nOutputNodes(:)
|
||||
PetscInt :: dim
|
||||
PetscErrorCode :: ierr
|
||||
|
||||
write(6,'(/,a)') ' <<<+- DAMASK_FEM_utilities init -+>>>'
|
||||
|
@ -221,15 +188,12 @@ subroutine utilities_init()
|
|||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,trim(petsc_defaultOptions),ierr)
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,trim(petsc_options),ierr)
|
||||
CHKERRQ(ierr)
|
||||
!write(petsc_optionsPhysics,'(a,i0)') '-mechFE_petscspace_order ' , structOrder
|
||||
write(petsc_optionsPhysics,'(a,i0)') '-mechFE_petscspace_degree ' , structOrder
|
||||
call PetscOptionsInsertString(PETSC_NULL_OPTIONS,trim(petsc_optionsPhysics),ierr)
|
||||
CHKERRQ(ierr)
|
||||
|
||||
wgt = 1.0/real(mesh_maxNips*mesh_NcpElemsGlobal,pReal)
|
||||
|
||||
call PetscViewerHDF5Open(PETSC_COMM_WORLD, trim(getSolverJobName())//'.h5', &
|
||||
FILE_MODE_WRITE, resUnit, ierr); CHKERRQ(ierr)
|
||||
call PetscViewerHDF5PushGroup(resUnit, '/', ierr); CHKERRQ(ierr)
|
||||
call DMGetDimension(geomMesh,dimPlex,ierr); CHKERRQ(ierr)
|
||||
allocate(nEntities(dimPlex+1), source=0)
|
||||
allocate(nOutputNodes(worldsize), source = 0)
|
||||
|
@ -257,178 +221,6 @@ subroutine utilities_init()
|
|||
write(headerID, '(a,i0)') 'number of cells : ', sum(nOutputCells)
|
||||
endif
|
||||
|
||||
allocate(connectivity(2**dimPlex,nOutputCells(worldrank+1)))
|
||||
call DMPlexGetHeightStratum(geomMesh,0,cellStart,cellEnd,ierr)
|
||||
CHKERRQ(ierr)
|
||||
ctr = 0
|
||||
select case (integrationOrder)
|
||||
case(1_pInt)
|
||||
do cell = cellStart, cellEnd-1 !< loop over all elements
|
||||
call DMPlexGetTransitiveClosure(geomMesh,cell,PETSC_TRUE,points,ierr)
|
||||
CHKERRQ(ierr)
|
||||
if (dimPlex == 2) then
|
||||
connectivity(:,ctr+1) = [points( 9), points(11), points(13), points(13)] - nEntities(dimPlex+1)
|
||||
ctr = ctr + 1
|
||||
else
|
||||
connectivity(:,ctr+1) = [points(23), points(25), points(27), points(27), &
|
||||
points(29), points(29), points(29), points(29)] - nEntities(dimPlex+1)
|
||||
ctr = ctr + 1
|
||||
endif
|
||||
enddo
|
||||
|
||||
case(2_pInt)
|
||||
do cell = cellStart, cellEnd-1 !< loop over all elements
|
||||
call DMPlexGetTransitiveClosure(geomMesh,cell,PETSC_TRUE,points,ierr)
|
||||
CHKERRQ(ierr)
|
||||
if (dimPlex == 2) then
|
||||
connectivity(:,ctr+1) = [points(9 ), points(3), points(1), points(7)]
|
||||
connectivity(:,ctr+2) = [points(11), points(5), points(1), points(3)]
|
||||
connectivity(:,ctr+3) = [points(13), points(7), points(1), points(5)]
|
||||
ctr = ctr + 3
|
||||
else
|
||||
connectivity(:,ctr+1) = [points(23), points(11), points(3), points(15), points(17), points(5), points(1), points(7)]
|
||||
connectivity(:,ctr+2) = [points(25), points(13), points(3), points(11), points(19), points(9), points(1), points(5)]
|
||||
connectivity(:,ctr+3) = [points(27), points(15), points(3), points(13), points(21), points(7), points(1), points(9)]
|
||||
connectivity(:,ctr+4) = [points(29), points(17), points(7), points(21), points(19), points(5), points(1), points(9)]
|
||||
ctr = ctr + 4_pInt
|
||||
endif
|
||||
enddo
|
||||
|
||||
case default
|
||||
do cell = cellStart, cellEnd-1; do ip = 0, mesh_maxNips-1
|
||||
connectivity(:,ctr+1) = cell*mesh_maxNips + ip
|
||||
ctr = ctr + 1
|
||||
enddo; enddo
|
||||
|
||||
end select
|
||||
connectivity = connectivity + sum(nOutputNodes(1:worldrank))
|
||||
|
||||
call VecCreateMPI(PETSC_COMM_WORLD,dimPlex*nOutputNodes(worldrank+1),dimPlex*sum(nOutputNodes), &
|
||||
coordinatesVec,ierr);CHKERRQ(ierr)
|
||||
call PetscObjectSetName(coordinatesVec, 'NodalCoordinates',ierr)
|
||||
call VecSetFromOptions(coordinatesVec, ierr); CHKERRQ(ierr)
|
||||
|
||||
!allocate(mappingCells(worldsize), source = 0)
|
||||
!do homog = 1, material_Nhomogenization
|
||||
! mappingCells = 0_pInt; mappingCells(worldrank+1) = homogOutput(homog)%sizeIpCells
|
||||
! call MPI_Allreduce(MPI_IN_PLACE,mappingCells,worldsize,MPI_INT,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||
! call VecCreateMPI(PETSC_COMM_WORLD,mappingCells(worldrank+1),sum(mappingCells), &
|
||||
! homogenizationResultsVec(homog),ierr);CHKERRQ(ierr)
|
||||
! if (sum(mappingCells) > 0) then
|
||||
! call VecCreateMPI(PETSC_COMM_WORLD,mappingCells(worldrank+1)*2**dimPlex,sum(mappingCells)*2**dimPlex, &
|
||||
! connectivityVec,ierr);CHKERRQ(ierr)
|
||||
! call PetscObjectSetName(connectivityVec,'mapping_'//trim(homogenization_name(homog)),ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! call VecGetArrayF90(connectivityVec,results,ierr); CHKERRQ(ierr)
|
||||
! results = 0.0_pReal; ctr = 1_pInt
|
||||
! do cell = cellStart, cellEnd-1; do qPt = 1, mesh_maxNips
|
||||
! if (material_homog(qPt,cell+1) == homog) then
|
||||
! results(ctr:ctr+2**dimPlex-1) = real(reshape(connectivity(1:2**dimPlex,mesh_maxNips*cell+qPt), &
|
||||
! shape=[2**dimPlex]))
|
||||
! ctr = ctr + 2**dimPlex
|
||||
! endif
|
||||
! enddo; enddo
|
||||
! call VecRestoreArrayF90(connectivityVec, results, ierr); CHKERRQ(ierr)
|
||||
! call VecAssemblyBegin(connectivityVec, ierr); CHKERRQ(ierr)
|
||||
! call VecAssemblyEnd (connectivityVec, ierr); CHKERRQ(ierr)
|
||||
! call VecView(connectivityVec, resUnit, ierr); CHKERRQ(ierr)
|
||||
! call VecDestroy(connectivityVec, ierr); CHKERRQ(ierr)
|
||||
! endif
|
||||
!enddo
|
||||
!do cryst = 1, material_Ncrystallite; do grain = 1, homogenization_maxNgrains
|
||||
! mappingCells = 0_pInt
|
||||
! mappingCells(worldrank+1) = crystalliteOutput(cryst,grain)%sizeIpCells
|
||||
! call MPI_Allreduce(MPI_IN_PLACE,mappingCells,worldsize,MPI_INT,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||
! call VecCreateMPI(PETSC_COMM_WORLD,mappingCells(worldrank+1),sum(mappingCells), &
|
||||
! crystalliteResultsVec(cryst,grain),ierr);CHKERRQ(ierr)
|
||||
! if (sum(mappingCells) > 0) then
|
||||
! call VecCreateMPI(PETSC_COMM_WORLD,mappingCells(worldrank+1)*2**dimPlex,sum(mappingCells)*2**dimPlex, &
|
||||
! connectivityVec,ierr);CHKERRQ(ierr)
|
||||
! write(grainStr,'(a,i0)') 'Grain',grain
|
||||
! call PetscObjectSetName(connectivityVec,'mapping_'// &
|
||||
! trim(crystallite_name(cryst))//'_'// &
|
||||
! trim(grainStr),ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! call VecGetArrayF90(connectivityVec, results, ierr); CHKERRQ(ierr)
|
||||
! results = 0.0_pReal; ctr = 1_pInt
|
||||
! do cell = cellStart, cellEnd-1; do qPt = 1, mesh_maxNips
|
||||
! if (homogenization_Ngrains (mesh_element(3,cell+1)) >= grain .and. &
|
||||
! microstructure_crystallite(mesh_element(4,cell+1)) == cryst) then
|
||||
! results(ctr:ctr+2**dimPlex-1) = real(reshape(connectivity(1:2**dimPlex,mesh_maxNips*cell+qPt), &
|
||||
! shape=[2**dimPlex]))
|
||||
! ctr = ctr + 2**dimPlex
|
||||
! endif
|
||||
! enddo; enddo
|
||||
! call VecRestoreArrayF90(connectivityVec, results, ierr); CHKERRQ(ierr)
|
||||
! call VecAssemblyBegin(connectivityVec, ierr); CHKERRQ(ierr)
|
||||
! call VecAssemblyEnd (connectivityVec, ierr); CHKERRQ(ierr)
|
||||
! call VecView(connectivityVec, resUnit, ierr); CHKERRQ(ierr)
|
||||
! call VecDestroy(connectivityVec, ierr); CHKERRQ(ierr)
|
||||
! endif
|
||||
!enddo; enddo
|
||||
!do phase = 1, material_Nphase; do grain = 1, homogenization_maxNgrains
|
||||
! mappingCells = 0_pInt
|
||||
! mappingCells(worldrank+1) = phaseOutput(phase,grain)%sizeIpCells
|
||||
! call MPI_Allreduce(MPI_IN_PLACE,mappingCells,worldsize,MPI_INT,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||
! call VecCreateMPI(PETSC_COMM_WORLD,mappingCells(worldrank+1),sum(mappingCells), &
|
||||
! phaseResultsVec(phase,grain),ierr);CHKERRQ(ierr)
|
||||
! if (sum(mappingCells) > 0) then
|
||||
! call VecCreateMPI(PETSC_COMM_WORLD,mappingCells(worldrank+1)*2**dimPlex,sum(mappingCells)*2**dimPlex, &
|
||||
! connectivityVec,ierr);CHKERRQ(ierr)
|
||||
! write(grainStr,'(a,i0)') 'Grain',grain
|
||||
! call PetscObjectSetName(connectivityVec,&
|
||||
! 'mapping_'//trim(phase_name(phase))//'_'// &
|
||||
! trim(grainStr),ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! call VecGetArrayF90(connectivityVec, results, ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! results = 0.0_pReal; ctr = 1_pInt
|
||||
! do cell = cellStart, cellEnd-1; do qPt = 1, mesh_maxNips
|
||||
! if (material_phase(grain,qPt,cell+1) == phase) then
|
||||
! results(ctr:ctr+2**dimPlex-1) = real(reshape(connectivity(1:2**dimPlex,mesh_maxNips*cell+qPt), &
|
||||
! shape=[2**dimPlex]))
|
||||
! ctr = ctr + 2**dimPlex
|
||||
! endif
|
||||
! enddo; enddo
|
||||
! call VecRestoreArrayF90(connectivityVec, results, ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! call VecAssemblyBegin(connectivityVec, ierr);CHKERRQ(ierr)
|
||||
! call VecAssemblyEnd (connectivityVec, ierr);CHKERRQ(ierr)
|
||||
! call VecView(connectivityVec, resUnit, ierr);CHKERRQ(ierr)
|
||||
! call VecDestroy(connectivityVec, ierr); CHKERRQ(ierr)
|
||||
! endif
|
||||
!enddo; enddo
|
||||
!if (worldrank == 0_pInt) then
|
||||
! do homog = 1, material_Nhomogenization
|
||||
! call VecGetSize(homogenizationResultsVec(homog),mappingCells(1),ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! if (mappingCells(1) > 0) &
|
||||
! write(headerID, '(a,i0)') 'number of homog_'// &
|
||||
! trim(homogenization_name(homog))//'_'// &
|
||||
! 'cells : ', mappingCells(1)
|
||||
! enddo
|
||||
! do cryst = 1, material_Ncrystallite; do grain = 1, homogenization_maxNgrains
|
||||
! call VecGetSize(crystalliteResultsVec(cryst,grain),mappingCells(1),ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! write(grainStr,'(a,i0)') 'Grain',grain
|
||||
! if (mappingCells(1) > 0) &
|
||||
! write(headerID, '(a,i0)') 'number of cryst_'// &
|
||||
! trim(crystallite_name(cryst))//'_'// &
|
||||
! trim(grainStr)//'_'// &
|
||||
! 'cells : ', mappingCells(1)
|
||||
! enddo; enddo
|
||||
! do phase = 1, material_Nphase; do grain = 1, homogenization_maxNgrains
|
||||
! call VecGetSize(phaseResultsVec(phase,grain),mappingCells(1),ierr)
|
||||
! CHKERRQ(ierr)
|
||||
! write(grainStr,'(a,i0)') 'Grain',grain
|
||||
! if (mappingCells(1) > 0) &
|
||||
! write(headerID, '(a,i0)') 'number of phase_'// &
|
||||
! trim(phase_name(phase))//'_'//trim(grainStr)//'_'// &
|
||||
! 'cells : ', mappingCells(1)
|
||||
! enddo; enddo
|
||||
! close(headerID)
|
||||
!endif
|
||||
|
||||
end subroutine utilities_init
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
@ -438,8 +230,6 @@ subroutine utilities_constitutiveResponse(timeinc,P_av,forwardData)
|
|||
use debug, only: &
|
||||
debug_reset, &
|
||||
debug_info
|
||||
use numerics, only: &
|
||||
worldrank
|
||||
use math, only: &
|
||||
math_transpose33, &
|
||||
math_rotate_forward33, &
|
||||
|
@ -447,10 +237,8 @@ subroutine utilities_constitutiveResponse(timeinc,P_av,forwardData)
|
|||
use FEsolving, only: &
|
||||
restartWrite
|
||||
use homogenization, only: &
|
||||
materialpoint_F0, &
|
||||
materialpoint_F, &
|
||||
materialpoint_P, &
|
||||
materialpoint_dPdF, &
|
||||
materialpoint_stressAndItsTangent
|
||||
use mesh, only: &
|
||||
mesh_NcpElems
|
||||
|
@ -503,9 +291,7 @@ subroutine utilities_constitutiveResponse(timeinc,P_av,forwardData)
|
|||
cutBack = .false. ! reset cutBack status
|
||||
|
||||
P_av = sum(sum(materialpoint_P,dim=4),dim=3) * wgt ! average of P
|
||||
C_volAvg = sum(sum(materialpoint_dPdF,dim=6),dim=5) * wgt
|
||||
call MPI_Allreduce(MPI_IN_PLACE,P_av,9,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD,ierr)
|
||||
call MPI_Allreduce(MPI_IN_PLACE,C_volAvg,81,MPI_DOUBLE,MPI_SUM,PETSC_COMM_WORLD, ierr)
|
||||
|
||||
end subroutine utilities_constitutiveResponse
|
||||
|
||||
|
|
|
@ -8,10 +8,12 @@
|
|||
!> results
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
module mesh
|
||||
#include <petsc/finclude/petscdmplex.h>
|
||||
#include <petsc/finclude/petscis.h>
|
||||
#include <petsc/finclude/petscdmda.h>
|
||||
use prec, only: pReal, pInt
|
||||
|
||||
use PETScdmplex
|
||||
use PETScdmda
|
||||
use PETScis
|
||||
|
||||
|
@ -56,7 +58,7 @@ use PETScis
|
|||
|
||||
DM, public :: geomMesh
|
||||
|
||||
integer(pInt), dimension(:), allocatable, public, protected :: &
|
||||
PetscInt, dimension(:), allocatable, public, protected :: &
|
||||
mesh_boundaries
|
||||
|
||||
|
||||
|
@ -89,15 +91,6 @@ use PETScis
|
|||
mesh_FEM_build_ipCoordinates, &
|
||||
mesh_cellCenterCoordinates
|
||||
|
||||
external :: &
|
||||
DMPlexCreateFromFile, &
|
||||
DMPlexDistribute, &
|
||||
DMPlexCopyCoordinates, &
|
||||
DMGetStratumSize, &
|
||||
DMPlexGetHeightStratum, &
|
||||
DMPlexGetLabelValue, &
|
||||
DMPlexSetLabelValue
|
||||
|
||||
contains
|
||||
|
||||
|
||||
|
@ -154,14 +147,19 @@ subroutine mesh_init(ip,el)
|
|||
write(6,'(a15,a)') ' Current time: ',IO_timeStamp()
|
||||
#include "compilation_info.f90"
|
||||
|
||||
! read in file
|
||||
call DMPlexCreateFromFile(PETSC_COMM_WORLD,geometryFile,PETSC_TRUE,globalMesh,ierr)
|
||||
CHKERRQ(ierr)
|
||||
! get spatial dimension (2 or 3?)
|
||||
call DMGetDimension(globalMesh,dimPlex,ierr)
|
||||
CHKERRQ(ierr)
|
||||
write(6,*) 'dimension',dimPlex;flush(6)
|
||||
call DMGetStratumSize(globalMesh,'depth',dimPlex,mesh_NcpElemsGlobal,ierr)
|
||||
CHKERRQ(ierr)
|
||||
! get number of IDs in face sets (for boundary conditions?)
|
||||
call DMGetLabelSize(globalMesh,'Face Sets',mesh_Nboundaries,ierr)
|
||||
CHKERRQ(ierr)
|
||||
write(6,*) 'number of "Face Sets"',mesh_Nboundaries;flush(6)
|
||||
call MPI_Bcast(mesh_Nboundaries,1,MPI_INTEGER,0,PETSC_COMM_WORLD,ierr)
|
||||
call MPI_Bcast(mesh_NcpElemsGlobal,1,MPI_INTEGER,0,PETSC_COMM_WORLD,ierr)
|
||||
call MPI_Bcast(dimPlex,1,MPI_INTEGER,0,PETSC_COMM_WORLD,ierr)
|
||||
|
@ -177,7 +175,9 @@ subroutine mesh_init(ip,el)
|
|||
enddo
|
||||
if (nFaceSets > 0) call ISRestoreIndicesF90(faceSetIS,pFaceSets,ierr)
|
||||
call MPI_Bcast(mesh_boundaries,mesh_Nboundaries,MPI_INTEGER,0,PETSC_COMM_WORLD,ierr)
|
||||
|
||||
|
||||
! this read in function should ignore C and C++ style comments
|
||||
! it is used for BC only?
|
||||
if (worldrank == 0) then
|
||||
j = 0
|
||||
flag = .false.
|
||||
|
@ -186,8 +186,8 @@ subroutine mesh_init(ip,el)
|
|||
read(FILEUNIT,'(a512)') line
|
||||
if (trim(line) == IO_EOF) exit ! skip empty lines
|
||||
if (trim(line) == '$Elements') then
|
||||
read(FILEUNIT,'(a512)') line
|
||||
read(FILEUNIT,'(a512)') line
|
||||
read(FILEUNIT,'(a512)') line ! number of elements (ignore)
|
||||
read(FILEUNIT,'(a512)') line
|
||||
flag = .true.
|
||||
endif
|
||||
if (trim(line) == '$EndElements') exit
|
||||
|
|
|
@ -127,12 +127,7 @@ module numerics
|
|||
#ifdef FEM
|
||||
integer(pInt), protected, public :: &
|
||||
integrationOrder = 2_pInt, & !< order of quadrature rule required
|
||||
structOrder = 2_pInt, & !< order of displacement shape functions
|
||||
thermalOrder = 2_pInt, & !< order of temperature field shape functions
|
||||
damageOrder = 2_pInt, & !< order of damage field shape functions
|
||||
vacancyfluxOrder = 2_pInt, & !< order of vacancy concentration and chemical potential field shape functions
|
||||
porosityOrder = 2_pInt, & !< order of porosity field shape functions
|
||||
hydrogenfluxOrder = 2_pInt !< order of hydrogen concentration and chemical potential field shape functions
|
||||
structOrder = 2_pInt !< order of displacement shape functions
|
||||
logical, protected, public :: &
|
||||
BBarStabilisation = .false.
|
||||
character(len=4096), protected, public :: &
|
||||
|
@ -146,40 +141,7 @@ module numerics
|
|||
&-mech_pc_type ml &
|
||||
&-mech_mg_levels_ksp_type chebyshev &
|
||||
&-mech_mg_levels_pc_type sor &
|
||||
&-mech_pc_ml_nullspace user &
|
||||
&-damage_snes_type vinewtonrsls &
|
||||
&-damage_snes_atol 1e-8 &
|
||||
&-damage_ksp_type preonly &
|
||||
&-damage_ksp_max_it 25 &
|
||||
&-damage_pc_type cholesky &
|
||||
&-damage_pc_factor_mat_solver_package mumps &
|
||||
&-thermal_snes_type newtonls &
|
||||
&-thermal_snes_linesearch_type cp &
|
||||
&-thermal_ksp_type fgmres &
|
||||
&-thermal_ksp_max_it 25 &
|
||||
&-thermal_snes_atol 1e-3 &
|
||||
&-thermal_pc_type hypre &
|
||||
&-vacancy_snes_type newtonls &
|
||||
&-vacancy_snes_linesearch_type cp &
|
||||
&-vacancy_snes_atol 1e-9 &
|
||||
&-vacancy_ksp_type fgmres &
|
||||
&-vacancy_ksp_max_it 25 &
|
||||
&-vacancy_pc_type ml &
|
||||
&-vacancy_mg_levels_ksp_type chebyshev &
|
||||
&-vacancy_mg_levels_pc_type sor &
|
||||
&-porosity_snes_type newtonls &
|
||||
&-porosity_snes_atol 1e-8 &
|
||||
&-porosity_ksp_type fgmres &
|
||||
&-porosity_ksp_max_it 25 &
|
||||
&-porosity_pc_type hypre &
|
||||
&-hydrogen_snes_type newtonls &
|
||||
&-hydrogen_snes_linesearch_type cp &
|
||||
&-hydrogen_snes_atol 1e-9 &
|
||||
&-hydrogen_ksp_type fgmres &
|
||||
&-hydrogen_ksp_max_it 25 &
|
||||
&-hydrogen_pc_type ml &
|
||||
&-hydrogen_mg_levels_ksp_type chebyshev &
|
||||
&-hydrogen_mg_levels_pc_type sor ', &
|
||||
&-mech_pc_ml_nullspace user ',&
|
||||
petsc_options = ''
|
||||
#endif
|
||||
|
||||
|
@ -230,8 +192,6 @@ subroutine numerics_init
|
|||
tag ,&
|
||||
line
|
||||
!$ character(len=6) DAMASK_NumThreadsString ! environment variable DAMASK_NUM_THREADS
|
||||
external :: &
|
||||
PETScErrorF ! is called in the CHKERRQ macro
|
||||
|
||||
#ifdef PETSc
|
||||
call MPI_Comm_rank(PETSC_COMM_WORLD,worldrank,ierr);CHKERRQ(ierr)
|
||||
|
@ -458,16 +418,6 @@ subroutine numerics_init
|
|||
integrationorder = IO_intValue(line,chunkPos,2_pInt)
|
||||
case ('structorder')
|
||||
structorder = IO_intValue(line,chunkPos,2_pInt)
|
||||
case ('thermalorder')
|
||||
thermalorder = IO_intValue(line,chunkPos,2_pInt)
|
||||
case ('damageorder')
|
||||
damageorder = IO_intValue(line,chunkPos,2_pInt)
|
||||
case ('vacancyfluxorder')
|
||||
vacancyfluxOrder = IO_intValue(line,chunkPos,2_pInt)
|
||||
case ('porosityorder')
|
||||
porosityOrder = IO_intValue(line,chunkPos,2_pInt)
|
||||
case ('hydrogenfluxorder')
|
||||
hydrogenfluxOrder = IO_intValue(line,chunkPos,2_pInt)
|
||||
case ('petsc_options')
|
||||
petsc_options = trim(line(chunkPos(4):))
|
||||
case ('bbarstabilisation')
|
||||
|
@ -620,11 +570,6 @@ subroutine numerics_init
|
|||
#ifdef FEM
|
||||
write(6,'(a24,1x,i8)') ' integrationOrder: ',integrationOrder
|
||||
write(6,'(a24,1x,i8)') ' structOrder: ',structOrder
|
||||
write(6,'(a24,1x,i8)') ' thermalOrder: ',thermalOrder
|
||||
write(6,'(a24,1x,i8)') ' damageOrder: ',damageOrder
|
||||
write(6,'(a24,1x,i8)') ' vacancyfluxOrder: ',vacancyfluxOrder
|
||||
write(6,'(a24,1x,i8)') ' porosityOrder: ',porosityOrder
|
||||
write(6,'(a24,1x,i8)') ' hydrogenfluxOrder: ',hydrogenfluxOrder
|
||||
write(6,'(a24,1x,a)') ' PETSc_options: ',trim(petsc_defaultOptions)//' '//trim(petsc_options)
|
||||
write(6,'(a24,1x,L8)') ' B-Bar stabilisation: ',BBarStabilisation
|
||||
#endif
|
||||
|
|
10
src/prec.f90
10
src/prec.f90
|
@ -87,16 +87,6 @@ module prec
|
|||
integer(pInt), pointer, dimension(:,:,:) :: p
|
||||
end type
|
||||
|
||||
#ifdef FEM
|
||||
type, public :: tOutputData
|
||||
integer(pInt) :: &
|
||||
sizeIpCells = 0_pInt , &
|
||||
sizeResults = 0_pInt
|
||||
real(pReal), allocatable, dimension(:,:) :: &
|
||||
output !< output data
|
||||
end type
|
||||
#endif
|
||||
|
||||
public :: &
|
||||
prec_init, &
|
||||
dEq, &
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
!--------------------------------------------------------------------------------------------------
|
||||
!> @author Martin Diehl, Max-Planck-Institut für Eisenforschung GmbH
|
||||
!> @brief quit subroutine
|
||||
!> @details exits the program and reports current time and duration. Exit code 0 signals
|
||||
!> everything is fine. Exit code 1 signals an error, message according to IO_error. Exit code
|
||||
!> 2 signals no severe problems, but some increments did not converge
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
subroutine quit(stop_id)
|
||||
#include <petsc/finclude/petscsys.h>
|
||||
#ifdef _OPENMP
|
||||
use MPI, only: &
|
||||
MPI_finalize
|
||||
#endif
|
||||
use prec, only: &
|
||||
pInt
|
||||
use PetscSys
|
||||
|
||||
implicit none
|
||||
integer(pInt), intent(in) :: stop_id
|
||||
integer, dimension(8) :: dateAndTime ! type default integer
|
||||
integer(pInt) :: error = 0_pInt
|
||||
PetscErrorCode :: ierr = 0
|
||||
|
||||
call PETScFinalize(ierr)
|
||||
CHKERRQ(ierr)
|
||||
#ifdef _OPENMP
|
||||
call MPI_finalize(error)
|
||||
if (error /= 0) write(6,'(a)') ' Error in MPI_finalize'
|
||||
#endif
|
||||
|
||||
call date_and_time(values = dateAndTime)
|
||||
write(6,'(/,a)') 'DAMASK terminated on:'
|
||||
write(6,'(a,2(i2.2,a),i4.4)') 'Date: ',dateAndTime(3),'/',&
|
||||
dateAndTime(2),'/',&
|
||||
dateAndTime(1)
|
||||
write(6,'(a,2(i2.2,a),i2.2)') 'Time: ',dateAndTime(5),':',&
|
||||
dateAndTime(6),':',&
|
||||
dateAndTime(7)
|
||||
|
||||
if (stop_id == 0_pInt .and. ierr == 0_pInt .and. error == 0_pInt) stop 0 ! normal termination
|
||||
if (stop_id == 2_pInt .and. ierr == 0_pInt .and. error == 0_pInt) stop 2 ! not all incs converged
|
||||
stop 1 ! error (message from IO_error)
|
||||
|
||||
end subroutine quit
|
|
@ -50,8 +50,6 @@ module spectral_damage
|
|||
spectral_damage_init, &
|
||||
spectral_damage_solution, &
|
||||
spectral_damage_forward
|
||||
external :: &
|
||||
PETScErrorF ! is called in the CHKERRQ macro
|
||||
|
||||
contains
|
||||
|
||||
|
@ -85,11 +83,6 @@ subroutine spectral_damage_init()
|
|||
Vec :: uBound, lBound
|
||||
PetscErrorCode :: ierr
|
||||
character(len=100) :: snes_type
|
||||
external :: &
|
||||
SNESSetOptionsPrefix, &
|
||||
SNESGetType, &
|
||||
DMDAGetCorners, &
|
||||
DMDASNESSetFunctionLocal
|
||||
|
||||
write(6,'(/,a)') ' <<<+- spectral_damage init -+>>>'
|
||||
write(6,'(/,a)') ' Shanthraj et al., Handbook of Mechanics of Materials, volume in press, '
|
||||
|
@ -194,11 +187,6 @@ type(tSolutionState) function spectral_damage_solution(timeinc,timeinc_old,loadC
|
|||
PetscErrorCode :: ierr
|
||||
SNESConvergedReason :: reason
|
||||
|
||||
external :: &
|
||||
VecMin, &
|
||||
VecMax, &
|
||||
SNESSolve
|
||||
|
||||
spectral_damage_solution%converged =.false.
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -66,8 +66,6 @@ module spectral_mech_basic
|
|||
basic_init, &
|
||||
basic_solution, &
|
||||
basic_forward
|
||||
external :: &
|
||||
PETScErrorF ! is called in the CHKERRQ macro
|
||||
|
||||
contains
|
||||
|
||||
|
@ -119,11 +117,6 @@ subroutine basic_init
|
|||
integer(pInt) :: proc
|
||||
character(len=1024) :: rankStr
|
||||
|
||||
external :: &
|
||||
SNESSetOptionsPrefix, &
|
||||
SNESSetConvergenceTest, &
|
||||
DMDASNESSetFunctionLocal
|
||||
|
||||
write(6,'(/,a)') ' <<<+- DAMASK_spectral_solverBasic init -+>>>'
|
||||
write(6,'(/,a)') ' Shanthraj et al., International Journal of Plasticity, 66:31–45, 2015'
|
||||
write(6,'(a,/)') ' https://doi.org/10.1016/j.ijplas.2014.02.006'
|
||||
|
@ -246,9 +239,6 @@ type(tSolutionState) function basic_solution(incInfoIn,timeinc,timeinc_old,stres
|
|||
PetscErrorCode :: ierr
|
||||
SNESConvergedReason :: reason
|
||||
|
||||
external :: &
|
||||
SNESsolve
|
||||
|
||||
incInfo = incInfoIn
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -73,8 +73,6 @@ module spectral_mech_Polarisation
|
|||
Polarisation_init, &
|
||||
Polarisation_solution, &
|
||||
Polarisation_forward
|
||||
external :: &
|
||||
PETScErrorF ! is called in the CHKERRQ macro
|
||||
|
||||
contains
|
||||
|
||||
|
@ -130,11 +128,6 @@ subroutine Polarisation_init
|
|||
integer(pInt) :: proc
|
||||
character(len=1024) :: rankStr
|
||||
|
||||
external :: &
|
||||
SNESSetOptionsPrefix, &
|
||||
SNESSetConvergenceTest, &
|
||||
DMDASNESsetFunctionLocal
|
||||
|
||||
write(6,'(/,a)') ' <<<+- DAMASK_spectral_solverPolarisation init -+>>>'
|
||||
write(6,'(/,a)') ' Shanthraj et al., International Journal of Plasticity, 66:31–45, 2015'
|
||||
write(6,'(a,/)') ' https://doi.org/10.1016/j.ijplas.2014.02.006'
|
||||
|
@ -272,9 +265,6 @@ type(tSolutionState) function Polarisation_solution(incInfoIn,timeinc,timeinc_ol
|
|||
PetscErrorCode :: ierr
|
||||
SNESConvergedReason :: reason
|
||||
|
||||
external :: &
|
||||
SNESSolve
|
||||
|
||||
incInfo = incInfoIn
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -50,8 +50,6 @@ module spectral_thermal
|
|||
spectral_thermal_init, &
|
||||
spectral_thermal_solution, &
|
||||
spectral_thermal_forward
|
||||
external :: &
|
||||
PETScErrorF ! is called in the CHKERRQ macro
|
||||
|
||||
contains
|
||||
|
||||
|
@ -88,11 +86,6 @@ subroutine spectral_thermal_init
|
|||
PetscScalar, dimension(:,:,:), pointer :: x_scal
|
||||
PetscErrorCode :: ierr
|
||||
|
||||
external :: &
|
||||
SNESsetOptionsPrefix, &
|
||||
DMDAgetCorners, &
|
||||
DMDASNESsetFunctionLocal
|
||||
|
||||
write(6,'(/,a)') ' <<<+- spectral_thermal init -+>>>'
|
||||
write(6,'(/,a)') ' Shanthraj et al., Handbook of Mechanics of Materials, volume in press,'
|
||||
write(6,'(/,a)') ' chapter Spectral Solvers for Crystal Plasticity and Multi-Physics Simulations. Springer, 2018'
|
||||
|
@ -196,11 +189,6 @@ type(tSolutionState) function spectral_thermal_solution(timeinc,timeinc_old,load
|
|||
PetscErrorCode :: ierr
|
||||
SNESConvergedReason :: reason
|
||||
|
||||
external :: &
|
||||
VecMin, &
|
||||
VecMax, &
|
||||
SNESSolve
|
||||
|
||||
spectral_thermal_solution%converged =.false.
|
||||
|
||||
!--------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -146,8 +146,6 @@ module spectral_utilities
|
|||
FIELD_DAMAGE_ID
|
||||
private :: &
|
||||
utilities_getFreqDerivative
|
||||
external :: &
|
||||
PETScErrorF ! is called in the CHKERRQ macro
|
||||
|
||||
contains
|
||||
|
||||
|
@ -209,8 +207,6 @@ subroutine utilities_init()
|
|||
scalarSize = 1_C_INTPTR_T, &
|
||||
vecSize = 3_C_INTPTR_T, &
|
||||
tensorSize = 9_C_INTPTR_T
|
||||
external :: &
|
||||
PetscOptionsInsertString
|
||||
|
||||
write(6,'(/,a)') ' <<<+- spectral_utilities init -+>>>'
|
||||
write(6,'(/,a)') ' Eisenlohr et al., International Journal of Plasticity, 46:37–53, 2013'
|
||||
|
|
Loading…
Reference in New Issue