subroutine set_material(mat, cfg, built_in_name)
type(material_t), intent(inout) :: mat
class(input_t), intent(in) :: cfg
character(*), intent(in) :: built_in_name
type(c_funptr) :: res_ptr, th_cond_ptr, stra_ptr, t_crit_ptr, bc_ptr, jc_ptr, tcs_ptr, heat_cap_ptr
real(dp) :: dens, E0
integer :: nPow,i
character(:), allocatable :: cfg_str
type(str_ptr), allocatable :: keys(:)
type(c_ptr) :: c_cfg
c_cfg = C_NULL_PTR
mat%material = cfg%str('material',trim(built_in_name))
select case (cfg%str('base',mat%material))
case('copper')
call material_copper_init(cfg, mat%density, c_cfg)
mat%res_cfg = c_cfg
mat%res => resistivity_copper
mat%th_cond_cfg = c_cfg
mat%th_cond => thermal_conductivity_copper
mat%heat_cap_cfg = c_cfg
mat%heat_cap => heat_capacity_copper
case('nb3sn')
call material_nb3sn_init(cfg, mat%density, c_cfg)
call get_power_law_parameters_nb3sn(c_cfg,mat%E0,mat%nPow)
mat%th_cond_cfg = c_cfg
mat%th_cond => thermal_conductivity_nb3sn
mat%stra_cfg = c_cfg
mat%stra => strain_nb3sn
mat%t_crit_cfg = c_cfg
mat%t_crit => critical_temperature_nb3sn
mat%bc_cfg = c_cfg
mat%bc => critical_field_nb3sn
mat%jc_cfg = c_cfg
mat%jc => critical_current_density_nb3sn
mat%tcs_cfg = c_cfg
mat%tcs => current_sharing_temperature_nb3sn
mat%heat_cap_cfg = c_cfg
mat%heat_cap => heat_capacity_nb3sn
case('nbti')
call material_nbti_init(cfg, mat%density, c_cfg)
call get_power_law_parameters_nbti(c_cfg,mat%E0,mat%nPow)
mat%th_cond_cfg = c_cfg
mat%th_cond => thermal_conductivity_nbti
mat%stra_cfg = c_cfg
mat%stra => strain_nbti
mat%t_crit_cfg = c_cfg
mat%t_crit => critical_temperature_nbti
mat%bc_cfg = c_cfg
mat%bc => critical_field_nbti
mat%jc_cfg = c_cfg
mat%jc => critical_current_density_nbti
mat%tcs_cfg = c_cfg
mat%tcs => current_sharing_temperature_nbti
mat%heat_cap_cfg = c_cfg
mat%heat_cap => heat_capacity_nbti
case('stainless_steel')
call material_stainless_steel_init(cfg, mat%density, c_cfg)
mat%th_cond_cfg = c_cfg
mat%th_cond => thermal_conductivity_stainless_steel
mat%heat_cap_cfg = c_cfg
mat%heat_cap => heat_capacity_stainless_steel
case('glass_epoxy')
call material_glass_epoxy_init(cfg, mat%density, c_cfg)
mat%th_cond_cfg = c_cfg
mat%th_cond => thermal_conductivity_glass_epoxy
mat%heat_cap_cfg = c_cfg
mat%heat_cap => heat_capacity_glass_epoxy
case('glass_kapton_glass')
call material_glass_kapton_glass_init(cfg, mat%density, c_cfg)
mat%th_cond_cfg = c_cfg
mat%th_cond => thermal_conductivity_glass_kapton_glass
mat%heat_cap_cfg = c_cfg
mat%heat_cap => heat_capacity_glass_kapton_glass
end select
if(.not. associated(init_material_ext)) return
! serialization
keys = cfg%keys1d()
cfg_str = ''
do i = 1, size(keys)
cfg_str = cfg_str // keys(i)%p // c_null_char // cfg%str(keys(i)%p) // c_null_char
end do
res_ptr = C_NULL_FUNPTR
th_cond_ptr = C_NULL_FUNPTR
stra_ptr = C_NULL_FUNPTR
t_crit_ptr = C_NULL_FUNPTR
bc_ptr = C_NULL_FUNPTR
jc_ptr = C_NULL_FUNPTR
tcs_ptr = C_NULL_FUNPTR
heat_cap_ptr = C_NULL_FUNPTR
dens = -1.0_dp
E0 = -1.0_dp
nPow = -1
if(.not. init_material_ext(len(cfg_str), cfg_str, c_cfg, res_ptr, th_cond_ptr, stra_ptr, &
t_crit_ptr, bc_ptr, jc_ptr, tcs_ptr, heat_cap_ptr, dens, E0, nPow)) return
if(dens > 0.0_dp) mat%density = dens
if(E0 > 0.0_dp) mat%E0 = E0
if(nPow > 0) mat%nPow = nPow
if(c_associated(res_ptr)) then
call c_f_procpointer(res_ptr, mat%res)
mat%res_cfg = c_cfg
endif
if(c_associated(th_cond_ptr)) then
call c_f_procpointer(th_cond_ptr, mat%th_cond)
mat%th_cond_cfg = c_cfg
endif
if(c_associated(stra_ptr)) then
call c_f_procpointer(stra_ptr, mat%stra)
mat%stra_cfg = c_cfg
endif
if(c_associated(t_crit_ptr)) then
call c_f_procpointer(t_crit_ptr, mat%t_crit)
mat%t_crit_cfg = c_cfg
endif
if(c_associated(bc_ptr)) then
call c_f_procpointer(bc_ptr, mat%bc)
mat%bc_cfg = c_cfg
endif
if(c_associated(jc_ptr)) then
call c_f_procpointer(jc_ptr, mat%jc)
mat%jc_cfg = c_cfg
endif
if(c_associated(tcs_ptr)) then
call c_f_procpointer(tcs_ptr, mat%tcs)
mat%tcs_cfg = c_cfg
endif
if(c_associated(heat_cap_ptr)) then
call c_f_procpointer(heat_cap_ptr, mat%heat_cap)
mat%heat_cap_cfg = c_cfg
endif
if (mat%density < 0.0_dp) error stop 'Material density not set!'
end subroutine set_material