Called at the beginning of main loop
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(junction_t), | intent(inout) | :: | me |
subroutine Junction_resolution_from_and_to_ports(me) !! Called at the beginning of main loop type(junction_t), intent(inout) :: me real(dp), parameter :: epsM = 1.0e-12_dp real(dp) :: m_dot(me%NbTotBr), angle(me%NbTotBr) integer :: i, i_ref, i_conv(me%NbTotBr), i_range(me%NbTotBr) logical :: in(me%NbTotBr), out(me%NbTotBr) ! calculation of the mass flow rate per branch to determine inlets, outlets in = .false. do i = 1, size(me%br); associate(prt => me%br(i)%p) m_dot(i) = prt%Sgn4j * prt%Prim(Pri_u) * prt%Prim(Pri_ro) * prt%Area if (m_dot(i) > epsM) in(i) = .true. ! Identification of the incoming branches end associate; enddo if (any(ieee_is_nan(m_dot))) then; call set_error('NaN in junction m_dot (junction)'); return; end if i_ref = maxLoc(m_dot, 1) ! reference branch should be with highest mass flow rate if(m_dot(i_ref) <= epsM) in = .true. ! no inlet branches so make them all inlet ! calculate conversion index array out = .not.in in(i_ref) = .false. ! exclude reference branch from incoming i_range = [(i, i = 1, size(me%br))] i_conv = [pack(i_range, out), i_ref, pack(i_range, in)] angle = abs(me%br(i_ref)%angle - me%br%angle) / 180.0_dp * Pi_value me%dynamic%NbTotBr = size(me%br) me%dynamic%NbIn = count(in)+1 me%dynamic%NbOut = count(out) me%dynamic%kappa = me%kappa me%dynamic%idxKappaRef = findLoc(i_conv, 1, 1) do i = 1, size(me%br); associate(dyn => me%dynamic%br(i), prt => me%br(i_conv(i))%p) dyn%rho0 = prt%Prim(Pri_ro) dyn%vit0 = -prt%Sgn4j * prt%Prim(Pri_u) dyn%p0 = prt%Prim(Pri_p) dyn%ETot0 = prt%Prim(Pri_e) + 0.5_dp * prt%Prim(Pri_u) * prt%Prim(Pri_u) dyn%rCorr0 = prt%Prim(Pri_R) dyn%SpeedS0 = abs(prt%Prim(Pri_u)) + prt%Prim(Pri_c) dyn%CSound0 = prt%Prim(Pri_c) dyn%T0 = prt%Prim(Pri_T) dyn%AreaJGB = prt%Area dyn%ThetaJGB = angle(i_conv(i)) dyn%SgnJGB = -prt%Sgn4j dyn%U1 = prt%Cons(Con_Mas) dyn%U2 = -prt%Sgn4j * prt%Cons(Con_Qdm) dyn%U3 = prt%Cons(Con_Ene) dyn%U4 = prt%Cons(Con_R) dyn%q0 = 0.0_dp dyn%qBar = 0.0_dp dyn%dx0 = prt%dxLoc dyn%Frc = -prt%Sgn4j * prt%Su_fric dyn%DerFric1 = -prt%Sgn4j * prt%DerSu_fric(Con_Mas) dyn%DerFric2 = prt%DerSu_fric(Con_Qdm) dyn%DerFric3 = -prt%Sgn4j * prt%DerSu_fric(Con_Ene) dyn%DerFric4 = -prt%Sgn4j * prt%DerSu_fric(Con_R) if(R_Correction) then dyn%FrcR = prt%Sr_fric dyn%DerFricR1 = prt%DerSr_fric(Con_Mas) dyn%DerFricR2 = -prt%Sgn4j * prt%DerSr_fric(Con_Qdm) dyn%DerFricR3 = prt%DerSr_fric(Con_Ene) dyn%DerFricR4 = prt%DerSr_fric(Con_R) endif end associate; enddo call solve_junction(me%dynamic,me%FlJ) if (sim_error > 0) return do i = 1, size(me%br) me%DerFlx_dBr(:,:,i_conv,i_conv(i)) = me%FlJ(i)%DerFlx me%DerVel_dBr(:, i_conv,i_conv(i)) = me%FlJ(i)%DerVit enddo do i = 1, size(me%br) me%br(i_conv(i))%p%flx = me%FlJ(i)%Flx me%br(i_conv(i))%p%vit = me%FlJ(i)%Vit me%br(i)%p%derFlx_derCon = me%DerFlx_dBr(:,:,i,i) me%br(i)%p%derVit_derCon = me%DerVel_dBr(:,i,i) enddo me%wave_time = min(minVal(me%dynamic%br%dx0 / me%dynamic%br%SpeedS0), 1e30_dp) end subroutine Junction_resolution_from_and_to_ports