mesh2D_init_part1 Subroutine

public subroutine mesh2D_init_part1(me, krn, cfg, sim)

Arguments

Type IntentOptional Attributes Name
type(mesh2D_t), intent(out) :: me
type(krn_t), intent(inout) :: krn
class(input_t), intent(in), pointer :: cfg
type(simulation_t), intent(inout) :: sim

Calls

proc~~mesh2d_init_part1~~CallsGraph proc~mesh2d_init_part1 mesh2D_init_part1 proc~all_mesh2d_allocation all_mesh2D_allocation proc~mesh2d_init_part1->proc~all_mesh2d_allocation proc~input_dbl input_t%input_dbl proc~mesh2d_init_part1->proc~input_dbl proc~input_dict1d input_t%input_dict1d proc~mesh2d_init_part1->proc~input_dict1d proc~input_has_key input_t%input_has_key proc~mesh2d_init_part1->proc~input_has_key proc~input_str input_t%input_str proc~mesh2d_init_part1->proc~input_str proc~input_str1d input_t%input_str1d proc~mesh2d_init_part1->proc~input_str1d proc~krn_add krn_t%krn_add proc~mesh2d_init_part1->proc~krn_add proc~krn_add_label krn_t%krn_add_label proc~mesh2d_init_part1->proc~krn_add_label proc~material_init material_init proc~mesh2d_init_part1->proc~material_init proc~preprocessing_2delements preprocessing_2Delements proc~mesh2d_init_part1->proc~preprocessing_2delements proc~signal_init signal_t%signal_init proc~mesh2d_init_part1->proc~signal_init proc~input_dbl->proc~input_has_key proc~continue_if continue_if proc~input_dbl->proc~continue_if proc~get0d_hdf5 get0d_hdf5 proc~input_dbl->proc~get0d_hdf5 proc~input_node input_t%input_node proc~input_dbl->proc~input_node to_real to_real proc~input_dbl->to_real proc~input_dict1d->proc~input_has_key get_string get_string proc~input_dict1d->get_string proc~input_dict1d->proc~input_node proc~select_dict select_dict proc~input_dict1d->proc~select_dict proc~select_list select_list proc~input_dict1d->proc~select_list get get proc~input_has_key->get proc~input_has_key->proc~select_dict proc~input_str->proc~input_has_key proc~input_str->proc~input_node proc~select_scalar select_scalar proc~input_str->proc~select_scalar proc~input_str1d->proc~input_has_key proc~input_str1d->proc~input_node proc~input_str1d->proc~select_scalar proc~port_list_add port_list_t%port_list_add proc~krn_add->proc~port_list_add proc~krn_add_label->proc~port_list_add proc~material_init->proc~input_str proc~signal_init->proc~input_dbl proc~signal_init->proc~input_has_key proc~signal_init->proc~input_str interface~getprocaddress GetProcAddress proc~signal_init->interface~getprocaddress interface~is_nan is_nan proc~signal_init->interface~is_nan proc~input_dbl1d input_t%input_dbl1d proc~signal_init->proc~input_dbl1d proc~input_dbl2d input_t%input_dbl2d proc~signal_init->proc~input_dbl2d proc~input_dict input_t%input_dict proc~signal_init->proc~input_dict proc~input_keys1d input_t%input_keys1d proc~signal_init->proc~input_keys1d proc~interpolate_vector interpolate_vector proc~signal_init->proc~interpolate_vector proc~merge_events merge_events proc~signal_init->proc~merge_events proc~is_nan_dbl is_nan_dbl interface~is_nan->proc~is_nan_dbl proc~is_nan_int is_nan_int interface~is_nan->proc~is_nan_int proc~get0d_hdf5->proc~input_has_key proc~get0d_hdf5->proc~input_str 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 proc~input_dbl1d->proc~input_has_key proc~input_dbl1d->proc~continue_if proc~input_dbl1d->proc~input_node proc~input_dbl1d->proc~select_scalar proc~input_dbl1d->to_real interface~to_str to_str proc~input_dbl1d->interface~to_str proc~get1d_hdf5 get1d_hdf5 proc~input_dbl1d->proc~get1d_hdf5 proc~input_dbl2d->proc~input_has_key proc~input_dbl2d->proc~continue_if proc~input_dbl2d->proc~input_node proc~input_dbl2d->proc~select_list proc~input_dbl2d->proc~select_scalar proc~input_dbl2d->to_real proc~get2d_hdf5 get2d_hdf5 proc~input_dbl2d->proc~get2d_hdf5 proc~input_dict->proc~input_dict1d proc~input_dict->proc~input_has_key proc~input_dict->proc~input_node proc~input_keys1d->proc~select_dict proc~input_node->get proc~input_node->proc~select_dict proc~dictionary_traverse dictionary_traverse proc~input_node->proc~dictionary_traverse proc~interpolate interpolate proc~interpolate_vector->proc~interpolate proc~port_list_add->interface~to_str proc~str_from_int str_from_int interface~to_str->proc~str_from_int proc~str_from_real str_from_real interface~to_str->proc~str_from_real 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~get1d_hdf5->proc~input_has_key proc~get1d_hdf5->proc~input_str proc~get1d_hdf5->h5dclose_f proc~get1d_hdf5->h5dopen_f proc~get1d_hdf5->h5dread_f proc~get1d_hdf5->h5fclose_f proc~get1d_hdf5->h5fopen_f proc~get1d_hdf5->h5ltget_dataset_info_f proc~get2d_hdf5->proc~input_has_key proc~get2d_hdf5->proc~input_str proc~get2d_hdf5->h5dclose_f proc~get2d_hdf5->h5dopen_f proc~get2d_hdf5->h5dread_f proc~get2d_hdf5->h5fclose_f proc~get2d_hdf5->h5fopen_f proc~get2d_hdf5->h5ltget_dataset_info_f

Called by

proc~~mesh2d_init_part1~~CalledByGraph proc~mesh2d_init_part1 mesh2D_init_part1 program~reims_p reims_p program~reims_p->proc~mesh2d_init_part1

Source Code

subroutine mesh2D_init_part1(me, krn, cfg,sim)
    type(mesh2D_t),         intent(out) :: me
    type(krn_t),          intent(inout) :: krn
    class(input_t), pointer, intent(in) :: cfg
    type(simulation_t), intent(inout) :: sim

    type(input_t), allocatable :: constit(:)
    real(dp) :: T_init
    integer :: nb_e, nb_SS_src_ports, ii, jj, i, j, count
    type(input_t), allocatable :: regions(:), edges(:)
    type(str_ptr), allocatable :: labelsMC(:), labelsCh(:)

    call preprocessing_2Delements(me%M2D_Prop,cfg%str('mesh'))
    call all_mesh2D_allocation(me)     

    me%filename_extless = cfg%str('mesh')
    me%filename_extless = me%filename_extless(9:index(me%filename_extless, '.msh')-1)

    me%extrusion_length = cfg%dbl('extrusion_length',1.062_dp)

    T_init=cfg%dbl('initial/t')
    do nb_e=1,me%M2D_Prop%nb_elements
        me%StVar%temp(nb_e)=T_init
    enddo

    regions = cfg%dict1d('regions')
    allocate(me%label%regionArr(size(regions)))
    do ii=1, size(regions)
        call material_init(me%label%regionArr(ii)%mat, regions(ii))
        me%label%regionArr(ii)%id=regions(ii)%str('label')
        call me%label%regionArr(ii)%value%init(sim, regions(ii),'source')  ! value zero by default if it is not found
        me%label%regionArr(ii)%SurfaceRegion=0.0_dp
        do nb_e=1,me%M2D_Prop%nb_elements
            if(trim(me%M2D_Prop%elem(nb_e)%PhysE)==me%label%regionArr(ii)%id) then
                me%label%regionArr(ii)%SurfaceRegion=me%label%regionArr(ii)%SurfaceRegion+me%M2D_Prop%elem(nb_e)%surface
            endif
        enddo
        if (me%label%regionArr(ii)%SurfaceRegion == 0.0_dp) then
            print*, 'ERROR: regions label "'// &
                trim(me%label%regionArr(ii)%id)//'" not found in mesh.'
            print*, 'Available labels in mesh:'
            do j = 1, me%M2D_Prop%Nb_label
                print*, '  - '//trim(me%M2D_Prop%LabelName(j))
            enddo
            error stop 'Aborting: regions/mesh mismatch.'
        endif
    enddo

    edges = cfg%dict1d('edges')
    allocate(me%label%edgeArr(size(edges)))
    do ii=1, size(edges)
        me%label%edgeArr(ii)%id=edges(ii)%str('label')
        me%label%edgeArr(ii)%type=edges(ii)%str('type')
        call me%label%edgeArr(ii)%value%init(sim, edges(ii),'value')
        me%label%edgeArr(ii)%LengthBC=0.0_dp
        do nb_e=1,me%M2D_Prop%nb_elements
          do jj=1,3
            if((jj==3 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==2) .or. &
               (jj==3 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==1) .or. &
               (jj==2 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==1)) then       ! Boundary condition
                 if(trim(me%M2D_Prop%elem(nb_e)%PhysN(jj))==me%label%edgeArr(ii)%id) then
                   me%label%edgeArr(ii)%LengthBC = me%label%edgeArr(ii)%LengthBC + me%M2D_Prop%elem(nb_e)%face(jj)
                 endif
            endif
          enddo
        enddo
        if (me%label%edgeArr(ii)%LengthBC == 0.0_dp) then
            print*, 'ERROR: edges label "'// &
                trim(me%label%edgeArr(ii)%id)//'" not found in mesh.'
            print*, 'Available labels in mesh:'
            do j = 1, me%M2D_Prop%Nb_label
                print*, '  - '//trim(me%M2D_Prop%LabelName(j))
            enddo
            error stop 'Aborting: edges/mesh mismatch.'
        endif
    enddo

    if(cfg%has_key('channel_link')) then
        labelsCh=cfg%str1d('channel_link')
        me%M2D_Prop%Nb_labelCh=size(labelsCh)
        if(me%M2D_Prop%Nb_labelCh>0) then
            allocate(me%label%Ch_Arr(me%M2D_Prop%Nb_labelCh))
            do i= 1, me%M2D_Prop%Nb_labelCh
                me%label%Ch_Arr(i)%name = labelsCh(i)%p
            end do    
            me%M2D_Prop%Nb_FSports = 0
            me%label%Ch_Arr(:)%NbElem=0
            do nb_e=1,me%M2D_Prop%nb_elements
                do jj=1,3
                    if((jj==3 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==2) .or. &
                       (jj==3 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==1) .or. &
                       (jj==2 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==1)) then       ! Boundary condition
                        do ii=1,me%M2D_Prop%Nb_labelCh
                            if((trim(me%M2D_Prop%elem(nb_e)%PhysN(jj)) == me%label%Ch_Arr(ii)%name) ) then
                                me%M2D_Prop%Nb_FSports = me%M2D_Prop%Nb_FSports + 1
                                me%label%Ch_Arr(ii)%NbElem = me%label%Ch_Arr(ii)%NbElem + 1
                                me%label%Ch_Arr(ii)%array(me%label%Ch_Arr(ii)%NbElem) = nb_e
                            endif
                        enddo
                    endif
                enddo
            enddo
            do i = 1, me%M2D_Prop%Nb_labelCh
                if (me%label%Ch_Arr(i)%NbElem == 0) then
                    print*, 'ERROR: channel_link label "'// &
                        trim(me%label%Ch_Arr(i)%name)//'" not found in mesh.'
                    print*, 'Available labels in mesh:'
                    do ii = 1, me%M2D_Prop%Nb_label
                        print*, '  - '//trim(me%M2D_Prop%LabelName(ii))
                    enddo
                    error stop 'Aborting: channel_link/mesh mismatch.'
                endif
            enddo
        endif
    endif

    if(cfg%has_key('solid_link')) then
        labelsMC=cfg%str1d('solid_link')
        me%M2D_Prop%Nb_labelMC=size(labelsMC)
        if(me%M2D_Prop%Nb_labelMC>0) then
            allocate(me%label%MC_Arr(me%M2D_Prop%Nb_labelMC))
            do i= 1, me%M2D_Prop%Nb_labelMC
                me%label%MC_Arr(i)%name = labelsMC(i)%p
            end do
            me%M2D_Prop%Nb_SSports = 0
            me%label%MC_Arr(:)%NbElem=0
            do nb_e=1,me%M2D_Prop%nb_elements
                do jj=1,3
                    if((jj==3 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==2) .or. &
                       (jj==3 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==1) .or. &
                       (jj==2 .and. me%M2D_Prop%elem(nb_e)%NbNeigh==1)) then       ! Boundary condition
                        do ii=1,me%M2D_Prop%Nb_labelMC
                            if((trim(me%M2D_Prop%elem(nb_e)%PhysN(jj)) == me%label%MC_Arr(ii)%name) ) then
                                me%M2D_Prop%Nb_SSports = me%M2D_Prop%Nb_SSports + 1
                                me%label%MC_Arr(ii)%NbElem = me%label%MC_Arr(ii)%NbElem + 1
                                me%label%MC_Arr(ii)%array(me%label%MC_Arr(ii)%NbElem) = nb_e
                            endif
                        enddo
                    endif
                enddo
            enddo
            do i = 1, me%M2D_Prop%Nb_labelMC
                if (me%label%MC_Arr(i)%NbElem == 0) then
                    print*, 'ERROR: solid_link label "'// &
                        trim(me%label%MC_Arr(i)%name)//'" not found in mesh.'
                    print*, 'Available labels in mesh:'
                    do ii = 1, me%M2D_Prop%Nb_label
                        print*, '  - '//trim(me%M2D_Prop%LabelName(ii))
                    enddo
                    error stop 'Aborting: solid_link/mesh mismatch.'
                endif
            enddo
        endif
    endif

    call krn%add(cfg%str('id'),me%M2D_Prop%nb_elements,me%M2D_Prop%nnz,me%M2D_Prop%nnz,0,0,0,0,0)

    if(me%M2D_Prop%Nb_labelCh>0) then
        if(me%M2D_Prop%Nb_labelCh>99) print*,"Nb_labelCh>99"
        do ii=1,me%M2D_Prop%Nb_labelCh
            call krn%add_label(cfg%str('id')//"+"//trim(me%label%Ch_Arr(ii)%name), nb_nodes_FS=me%label%Ch_Arr(ii)%NbElem)
        enddo
    endif

    if(me%M2D_Prop%Nb_labelMC>0) then
        if(me%M2D_Prop%Nb_labelMC>99) print*,"Nb_labelMC>99"
        do ii=1,me%M2D_Prop%Nb_labelMC
            call krn%add_label(cfg%str('id')//"+"//trim(me%label%MC_Arr(ii)%name), nb_nodes_SS=me%label%MC_Arr(ii)%NbElem)
        enddo
    endif    
    
end subroutine mesh2D_init_part1