📄 calc_kdif_flux.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 + -