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