set_material Subroutine

public subroutine set_material(mat, cfg, built_in_name)

Arguments

Type IntentOptional Attributes Name
type(material_t), intent(inout) :: mat
class(input_t), intent(in) :: cfg
character(len=*), intent(in) :: built_in_name

Calls

proc~~set_material~~CallsGraph proc~set_material set_material proc~get_power_law_parameters_nb3sn get_power_law_parameters_nb3sn proc~set_material->proc~get_power_law_parameters_nb3sn proc~get_power_law_parameters_nbti get_power_law_parameters_nbti proc~set_material->proc~get_power_law_parameters_nbti proc~input_keys1d input_t%input_keys1d proc~set_material->proc~input_keys1d proc~input_str input_t%input_str proc~set_material->proc~input_str proc~material_copper_init material_copper_init proc~set_material->proc~material_copper_init proc~material_glass_epoxy_init material_glass_epoxy_init proc~set_material->proc~material_glass_epoxy_init proc~material_glass_kapton_glass_init material_glass_kapton_glass_init proc~set_material->proc~material_glass_kapton_glass_init proc~material_nb3sn_init material_nb3sn_init proc~set_material->proc~material_nb3sn_init proc~material_nbti_init material_nbti_init proc~set_material->proc~material_nbti_init proc~material_stainless_steel_init material_stainless_steel_init proc~set_material->proc~material_stainless_steel_init proc~select_dict select_dict proc~input_keys1d->proc~select_dict proc~input_has_key input_t%input_has_key proc~input_str->proc~input_has_key proc~input_node input_t%input_node proc~input_str->proc~input_node proc~select_scalar select_scalar proc~input_str->proc~select_scalar proc~input_dbl input_t%input_dbl proc~material_copper_init->proc~input_dbl proc~material_glass_epoxy_init->proc~input_dbl proc~material_glass_kapton_glass_init->proc~input_dbl proc~material_nb3sn_init->proc~input_dbl proc~material_nbti_init->proc~input_dbl proc~material_stainless_steel_init->proc~input_dbl proc~input_dbl->proc~input_has_key proc~input_dbl->proc~input_node proc~continue_if continue_if proc~input_dbl->proc~continue_if proc~get0d_hdf5 get0d_hdf5 proc~input_dbl->proc~get0d_hdf5 to_real to_real proc~input_dbl->to_real proc~input_has_key->proc~select_dict get get proc~input_has_key->get proc~input_node->proc~select_dict proc~input_node->get proc~dictionary_traverse dictionary_traverse proc~input_node->proc~dictionary_traverse proc~dictionary_traverse->proc~dictionary_traverse get_dictionary get_dictionary proc~dictionary_traverse->get_dictionary proc~abort_if abort_if proc~dictionary_traverse->proc~abort_if proc~get0d_hdf5->proc~input_str proc~get0d_hdf5->proc~input_has_key h5close_f h5close_f proc~get0d_hdf5->h5close_f h5dclose_f h5dclose_f proc~get0d_hdf5->h5dclose_f h5dopen_f h5dopen_f proc~get0d_hdf5->h5dopen_f h5dread_f h5dread_f proc~get0d_hdf5->h5dread_f h5fclose_f h5fclose_f proc~get0d_hdf5->h5fclose_f h5fopen_f h5fopen_f proc~get0d_hdf5->h5fopen_f h5ltget_dataset_info_f h5ltget_dataset_info_f proc~get0d_hdf5->h5ltget_dataset_info_f h5open_f h5open_f proc~get0d_hdf5->h5open_f

Called by

proc~~set_material~~CalledByGraph proc~set_material set_material proc~load_materials load_materials proc~load_materials->proc~set_material program~reims_p reims_p program~reims_p->proc~load_materials

Source Code

    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