Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "PeriLab"
uuid = "2ecefcea-59f0-46dd-9cfd-1d2b8cc5f112"
authors = ["Christian Willberg <christian.willberg@dlr.de>", "Jan-Timo Hesse <jan-timo.hesse@dlr.de>"]
version = "1.5.3"
authors = ["Christian Willberg <christian.willberg@dlr.de>", "Jan-Timo Hesse <jan-timo.hesse@dlr.de>"]

[deps]
AbaqusReader = "bc6b9049-e460-56d6-94b4-a597b2c0390d"
Expand All @@ -14,6 +14,7 @@ DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
Dierckx = "39dd38d3-220a-591b-8e3c-4c3a8c710a94"
Exodus = "f57ae99e-f805-4780-bdca-96e224be1e5a"
ExtendableSparse = "95c220a8-a1cf-11e9-0c77-dbfce5f500b3"
FastGaussQuadrature = "442a2c76-b920-505d-bb47-c5924d526838"
JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
LazyGrids = "7031d0ef-c40d-4431-b2f8-61a8d2f650db"
Expand Down Expand Up @@ -57,6 +58,7 @@ DataStructures = "0.18, 0.19"
Dates = "1"
Dierckx = "0.5"
Exodus = "0.13"
ExtendableSparse = "2.0.1"
FastGaussQuadrature = "1"
JSON3 = "1"
LazyGrids = "1"
Expand Down
31 changes: 31 additions & 0 deletions docs/src/project/CV.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<!--
SPDX-FileCopyrightText: 2023 Christian Willberg <christian.willberg@dlr.de>, Jan-Timo Hesse <jan-timo.hesse@dlr.de>

SPDX-License-Identifier: BSD-3-Clause
-->
# Developer

## Christian Willberg
Professor of Material Sciences
Magdeburg-Stendal University of Applied Sciences


## Professional Experience

| Period | Position |
|--------|----------|
| since 03/2024 | [**W2 Professor of Materials Science**](https://www.h2.de/hochschule/fachbereiche/iwid/institut-fuer-maschinenbau/mitarbeiter/prof-dr-ing-christian-willberg.html), Magdeburg-Stendal University of Applied Sciences — Peridynamics, PeriLab development, structural health monitoring; Internationalization Officer |
| since 04/2025 | **Lecturer**, Otto von Guericke University Magdeburg — Non-local structural mechanics and peridynamics |
| 09/2012–02/2024 | **Senior Research Scientist**, [DLR Institute of Composite Structures and Adaptive Systems](https://www.dlr.de/de/sy), Brunswick — Materials testing, fiber composites, peridynamics, SHM |
| 03/2007–08/2012 | **Research Associate**, Institute of Mechanics, OvGU Magdeburg — VR surgical simulator, PhD on Lamb waves |
| 10/2006–02/2007 | **Diploma Student**, Robert Bosch GmbH, Tienen, Belgium |


## Jan-Timo Hesse


---

# Events 2026

[GAMM 2026](https://jahrestagung.gamm.org/annual-meeting-2026/96th-annual-meeting-2/) March 16th - 20th in Stuttgart
18 changes: 9 additions & 9 deletions src/Core/Data_manager.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Data_Manager
using MPI
using SparseArrays
using DataStructures: OrderedDict

using ExtendableSparse
##########################
# Variables
##########################
Expand Down Expand Up @@ -357,8 +357,8 @@ Get the bond damage
# Returns
- `damage::Field`: The bond damage field.
"""
function get_bond_damage(time::String)
bond_damage = get_field("Bond Damage", time)
function get_bond_damage(time::String)::BondScalarState{Float64}
bond_damage::BondScalarState{Float64} = get_field("Bond Damage", time)
# bond_damage_aniso = get_field("Bond Damage Anisotropic", time, false)
# return isnothing(bond_damage_aniso) ? bond_damage : bond_damage_aniso
return bond_damage
Expand Down Expand Up @@ -516,7 +516,7 @@ end

Get the fields to synchronize
"""
function get_synch_fields()
function get_synch_fields()::Dict{String,Any}
return data["fields_to_synch"]
end

Expand Down Expand Up @@ -1082,17 +1082,17 @@ function set_verbose(value::Bool)
data["verbose"] = value
end

function init_stiffness_matrix(xID::Vector{Int64}, yID::Vector{Int64},
vals::Vector{Float64}, N::Int64)
function init_stiffness_matrix(nnodes::Int64, dof::Int64)
n_total = nnodes * dof
data["matrix_exists"] = true
data["Stiffness Matrix"] = PD_matrix(xID, yID, vals, N)
data["Stiffness Matrix"] = ExtendableSparseMatrix{Float64,Int}(n_total, n_total)
end
#
function set_stiffness_matrix(sparse_mat)
data["matrix_exists"] = true
#data["Stiffness Matrix"] = PD_matrix(xID, yID, sparse_data,
# data["Stiffness Matrix"].sparse_matrix)
data["Stiffness Matrix"].sparse_matrix = sparse_mat
data["Stiffness Matrix"] = sparse_mat
end

function set_mass_matrix(sparse_mat)
Expand All @@ -1107,7 +1107,7 @@ end

function get_stiffness_matrix()
if data["matrix_exists"]
return data["Stiffness Matrix"].sparse_matrix
return data["Stiffness Matrix"]
end
return nothing
end
Expand Down
4 changes: 2 additions & 2 deletions src/Core/Data_manager/data_manager_MPI.jl
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ Synchronises the fields.
- `synchronise_field`: The function to synchronise the field.
- `direction::String`: The direction of the synchronisation.
"""
function synch_manager(synchronise_field, direction::String)
synch_fields = get_synch_fields()
function synch_manager(synchronise_field::Function, direction::String)
synch_fields::Dict{String,Any} = get_synch_fields()
# @debug synch_fields
for synch_field in keys(synch_fields)
synchronise_field(get_comm(),
Expand Down
2 changes: 1 addition & 1 deletion src/Core/Solver/Matrix_linear_static.jl
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ function init_solver(solver_options::Dict{Any,Any},
end

@timeit "init matrix" Correspondence_matrix_based.init_matrix()

Data_Manager.create_node_scalar_field("Damage", Float64)
solver_options["Matrix update"] = get(params["Linear Static Matrix Based"],
"Matrix update", false)
deformed_coorN = Data_Manager.get_field("Deformed Coordinates", "N")
Expand Down
58 changes: 30 additions & 28 deletions src/Core/Solver/Solver_manager.jl
Original file line number Diff line number Diff line change
Expand Up @@ -357,39 +357,41 @@ function synchronise_field(comm,
synch_field::String,
direction::String)
# might not needed
if !haskey(synch_fields, synch_field)
@error "Field $synch_field does not exist in synch_field dictionary"
return nothing
end
if direction == "download_from_cores"
if synch_fields[synch_field][direction]
vector = get_field(synch_field, synch_fields[synch_field]["time"])
return synch_responder_to_controller(comm,
overlap_map,
vector,
synch_fields[synch_field]["dof"])
@timeit "synchronise_field" begin
if !haskey(synch_fields, synch_field)
@error "Field $synch_field does not exist in synch_field dictionary"
return nothing
end
return nothing
end
if direction == "upload_to_cores"
if synch_fields[synch_field][direction]
vector = get_field(synch_field, synch_fields[synch_field]["time"])
if occursin("Bond", synch_field)
return synch_controller_bonds_to_responder_flattened(comm,
overlap_map,
vector,
synch_fields[synch_field]["dof"])
else
return synch_controller_to_responder(comm,
overlap_map,
vector,
synch_fields[synch_field]["dof"])
if direction == "download_from_cores"
if synch_fields[synch_field][direction]
vector = get_field(synch_field, synch_fields[synch_field]["time"])
@timeit "synch_responder_to_controller" return synch_responder_to_controller(comm,
overlap_map,
vector,
synch_fields[synch_field]["dof"])
end
return nothing
end
if direction == "upload_to_cores"
if synch_fields[synch_field][direction]
vector = get_field(synch_field, synch_fields[synch_field]["time"])
if occursin("Bond", synch_field)
@timeit "synch_controller_bonds_to_responder_flattened" return synch_controller_bonds_to_responder_flattened(comm,
overlap_map,
vector,
synch_fields[synch_field]["dof"])
else
@timeit "synch_controller_to_responder" return synch_controller_to_responder(comm,
overlap_map,
vector,
synch_fields[synch_field]["dof"])
end
end
return nothing
end
@error "Wrong direction key word $direction in function synchronise_field; it should be download_from_cores or upload_to_cores"
return nothing
end
@error "Wrong direction key word $direction in function synchronise_field; it should be download_from_cores or upload_to_cores"
return nothing
end

"""
Expand Down
6 changes: 3 additions & 3 deletions src/FEM/FEM_basis.jl
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ function compute_FEM(elements::AbstractVector{Int64},

if rotation
#tbd
# stress_N = rotate(nodes, stress_N, rotation_tensor, false)
# strain_increment = rotate(nodes, strain_increment, rotation_tensor, false)
# rotate(nodes, stress_N, rotation_tensor, false)
# rotate(nodes, strain_increment, rotation_tensor, false)
end

# in future this part must be changed -> using set Modules
Expand All @@ -128,7 +128,7 @@ function compute_FEM(elements::AbstractVector{Int64},

if rotation
#tbd
#stress_NP1 = rotate(nodes, stress_NP1, rotation_tensor, true)
#rotate(nodes, stress_NP1, rotation_tensor, true)
end
# specific force density

Expand Down
3 changes: 2 additions & 1 deletion src/IO/IO.jl
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,8 @@ end

Initialize orientations.
"""
function init_orientations()
function init_orientations(params::Dict)
set_angles(params)
rotation::Bool = Data_Manager.get_rotation()
element_rotation::Bool = Data_Manager.get_element_rotation()

Expand Down
50 changes: 48 additions & 2 deletions src/IO/mesh_data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ include("volume.jl")
using ..Helpers: fastdot, get_nearest_neighbors, find_inverse_bond_id
using ..Logging_Module: print_table
using ..Parameter_Handling: get_mesh_name, get_header, get_node_sets,
get_external_topology_name, get_horizon
get_external_topology_name, get_horizon, get_angles
using ..Geometry: bond_geometry!

#export read_mesh
Expand All @@ -39,7 +39,7 @@ Initializes the data for the mesh.
function init_data(params::Dict,
path::String,
comm::MPI.Comm)
@timeit "init_data - mesh_data,jl" begin
@timeit "init_data - mesh_data.jl" begin
size = MPI.Comm_size(comm)
rank = MPI.Comm_rank(comm) + 1
fem_active::Bool = false
Expand Down Expand Up @@ -149,6 +149,52 @@ function init_data(params::Dict,
return params
end

"""
set_angles(params::Dict, block_nodes::Dict)

Sets the density of the nodes in the dictionary.

# Arguments
- `params::Dict`: The parameters
- `block_nodes::Dict`: A dictionary mapping block IDs to collections of nodes
"""
function set_angles(params::Dict)
block_ids = Data_Manager.get_field("Block_Id")
blocks = unique(block_ids)
mesh_angles = false
if "Angles" in Data_Manager.get_all_field_keys()
Data_Manager.set_rotation(true)
mesh_angles = true
end
if "Element Angles" in Data_Manager.get_all_field_keys()
Data_Manager.set_element_rotation(true)
end

block_rotation = false
dof = Data_Manager.get_dof()
for block in blocks
if get_angles(params, block, dof) !== nothing
block_rotation = true
break
end
end
if block_rotation
if mesh_angles
@warn "Angles defined in mesh will be overwritten by block angles"
end
Data_Manager.set_rotation(true)
angles = Data_Manager.create_constant_node_vector_field("Angles", Float64, dof)

for iID in 1:Data_Manager.get_nnodes()
angles_global = get_angles(params, block_ids[iID], dof)
if isnothing(angles_global)
angles_global = 0.0
end
angles[iID, :] .= angles_global
end
end
end

"""
create_and_distribute_bond_norm(comm::MPI.Comm, nlist_filtered_ids::BondScalarState{Int64}, distribution::Vector{Int64}, bond_norm::Vector{Float64}, dof::Int64)

Expand Down
21 changes: 13 additions & 8 deletions src/Models/Damage/Damage_Factory.jl
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,22 @@ Initialize the anisotropic critical values
- `block_id::Int64`: current block
"""
function init_aniso_crit_values(damage_parameter::Dict,
block_id::Int64)
aniso_crit::Dict{Int64,Any} = Dict()
block_id::Int64, dof::Int64)
aniso_crit::Dict{Int64,Any} = Data_Manager.get_aniso_crit_values()

crit_0 = damage_parameter["Critical Value"]
crit_90 = damage_parameter["Critical Value"]
if !haskey(damage_parameter, "Anisotropic Damage")
@warn "has no anisotropic damage"
return
end
crit_0 = damage_parameter["Anisotropic Damage"]["Critical Value X"]
crit_90 = damage_parameter["Anisotropic Damage"]["Critical Value Y"]
aniso_crit[block_id] = [crit_0, crit_90]

crit_x = damage_parameter["Anisotropic Damage"]["Critical Value X"]
crit_y = damage_parameter["Anisotropic Damage"]["Critical Value Y"]
if dof == 2
aniso_crit[block_id] = [crit_x, crit_y]
else
crit_z = get(damage_parameter["Anisotropic Damage"], "Critical Value Z", crit_y)
aniso_crit[block_id] = [crit_x, crit_y, crit_z]
end
Data_Manager.set_aniso_crit_values(aniso_crit)

# if !haskey(damage_parameter, "Anisotropic Damage")
Expand Down Expand Up @@ -241,6 +245,7 @@ function init_model(nodes::AbstractVector{Int64},
mod.init_model(nodes, model_param, block)
mod.fields_for_local_synchronization("Damage Model")
Damage.init_interface_crit_values(model_param, block)
Damage.init_aniso_crit_values(model_param, block)

Damage.init_aniso_crit_values(model_param, block, Data_Manager.get_dof())
end
end
Loading
Loading