⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calc_kdif_flux.f90

📁 国外大名顶顶的“台风”并行计算流体力学CFD软件的早期版本的源代码
💻 F90
字号:
!------------------------------------------------------------------------------!! Procedure : calc_kdif_flux              Auteur : J. Gressier!                                         Date   : Avril 2003! Fonction                                Modif  : (cf historique)!   Calcul des flux de conduction de la chaleur : trois methodes!! Defauts/Limitations/Divers :!   Les gradients sont censes etre ceux des variables primitives qui!   sont aussi passees en argument!!------------------------------------------------------------------------------!subroutine calc_kdif_flux(defsolver, defspat, nflux, face,   &                          cg_l, cell_l, grad_l,              &                          cg_r, cell_r, grad_r, flux,        &                          calc_jac, jacL, jacR)use TYPHMAKEuse OUTPUTuse VARCOMuse MENU_SOLVERuse MENU_NUMuse MESHBASEuse DEFFIELDuse EQKDIFuse GEO3Duse MATER_LOIimplicit none! -- Declaration des entrees --type(mnu_solver)      :: defsolver        ! parametres de definition du solveurtype(mnu_spat)        :: defspat          ! parametres d'integration spatialeinteger               :: nflux            ! nombre de flux (face) a calculertype(st_face),     dimension(1:nflux) &                       :: face             ! donnees geometriques des facestype(v3d),         dimension(1:nflux) &                      :: cg_l, cg_r       ! centres des cellulestype(st_kdifetat), dimension(1:nflux) &                      :: cell_l, cell_r   ! champs des valeurs primitivestype(v3d),         dimension(1:nflux) &                      :: grad_l, grad_r   ! gradients aux centres des celluleslogical               :: calc_jac         ! choix de calcul de la jacobienne! -- Declaration des sorties --real(krp), dimension(nflux, defsolver%nequat) :: fluxreal(krp), dimension(nflux)                   :: jacL, jacR  ! jac associees! -- Declaration des variables internes --real(krp), parameter      :: theta = 1._krpreal(krp), dimension(:), allocatable &                          :: kH, dHR, dHL, dLR  ! voir allocationtype(v3d), dimension(:), allocatable &                          :: vLR                ! vecteur entre centres de cellulesreal(krp)                 :: TH                 ! temperature en Hreal(krp)                 :: Fcomp, Favg        ! flux compacts et moyensreal(krp)                 :: id, pscal          ! reels temporairestype(v3d)                 :: vi                 ! vecteur intermediaireinteger                   :: if! -- Debut de la procedure --allocate( kH(nflux))    ! conductivite en H, centre de faceallocate(dHR(nflux))    ! distance HR, rapportee a HL+HRallocate(dHL(nflux))    ! distance HL, rapportee a HL+HRallocate(dLR(nflux))    ! distance LR (difference de HR+HL)allocate(vLR(nflux))    ! vecteur  LR! -- Calculs preliminaires --do if = 1, nflux  dHL(if) = abs(face(if)%centre - cg_l(if))  dHR(if) = abs(face(if)%centre - cg_r(if))  id      = 1._krp/(dHL(if) + dHR(if))  dHL(if) = id*dHL(if)   dHR(if) = id*dHR(if)   vLR(if) = cg_r(if) - cg_l(if)  ! DEV / OPT : calcul de la distance au carree si c'est la seule utilisee  ! pour eviter sqrt()**2  dLR(if) = abs(vLR(if))enddo! -- Calcul de la conductivite en H (centre de face) selon le materiau --select case(defsolver%defkdif%materiau%type)case(mat_LIN)  kH(:) = defsolver%defkdif%materiau%Kd%valeurcase(mat_KNL)  do if = 1, nflux    TH     = dHR(if)*cell_l(if)%temperature + dHL(if)*cell_r(if)%temperature    kH(if) = valeur_loi(defsolver%defkdif%materiau%Kd, TH)  enddocase(mat_XMAT)  call erreur("Calcul de materiau","Materiau non lineaire complet interdit")endselect!--------------------------------------------------------------! Calcul du flux!--------------------------------------------------------------! COMPACT : F1 = - k(H) * (T(R) - T(L))            ! L et R centres de cellules! AVERAGE : F2 = - k(H) * (a.gT(L) + b.gT(R)).n    ! H centre de face! FULL    : F3 = ! a = HR/RL et b = HL/RL! k(H) = k(T(H)) avec T(H) = a.T(L) + b.T(R)select case(defspat%sch_dis)case(dis_dif2) ! formulation compacte, non consistance si vLR et n non alignes  do if = 1, nflux    flux(if,1)  = - kH(if) * (cell_r(if)%temperature - cell_l(if)%temperature) &                           * (vLR(if).scal.face(if)%normale) / (dLR(if)**2)  enddocase(dis_avg2) ! formulation consistante, moyenne ponderee des gradients  do if = 1, nflux    flux(if,1)  = - kH(if) * ((dHL(if)*grad_r(if) + dHR(if)*grad_l(if)).scal.face(if)%normale)  enddocase(dis_full)  do if = 1, nflux    pscal = (vLR(if).scal.face(if)%normale) / (dLR(if)**2)    Fcomp = pscal * (cell_r(if)%temperature - cell_l(if)%temperature)    vi    = face(if)%normale - (theta*pscal)*vLR(if)    Favg  = (dHL(if)*grad_r(if) + dHR(if)*grad_l(if)).scal.vi    !!write(*,"(a,4e12.4)") "DEBUG: ",Favg, Fcomp, abs(grad_l(if)), abs(grad_r(if))    flux(if,1)  = - kH(if) * (theta*Fcomp + Favg)  enddoendselect!--------------------------------------------------------------! Calcul des jacobiennes!--------------------------------------------------------------if (calc_jac) then  do if = 1, nflux    jacR(if) =  - kH(if) * (vLR(if).scal.face(if)%normale) &                  / (defsolver%defkdif%materiau%Cp * dLR(if)**2)    jacL(if) = -jacR(if)  enddoendifdeallocate(kH, dHR, dHL, dLR, vLR)endsubroutine calc_kdif_flux!------------------------------------------------------------------------------!! Historique des modifications!! avr  2003 : creation de la procedure : methode COMPACTE! juil 2003 : conductivite non constante! sept 2003 : optimisation de la procedure pour recuperer les temps CPU initiaux! oct  2003 : implementation des trois methodes de calcul COMPACT, AVERAGE, FULL! avr  2004 : calcul des jacobiennes pour implicitation!------------------------------------------------------------------------------!

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -