📄 implicit_step.f90
字号:
!!------------------------------------------------------------------------------!! Procedure : implicit_step Auteur : J. Gressier! Date : Avril 2004! Fonction Modif : (cf historique)! Integration implicit de domaine!! Defauts/Limitations/Divers :!!------------------------------------------------------------------------------!subroutine implicit_step(dt, typtemps, defsolver, defspat, deftime, & umesh, field, coupling, ncp)use TYPHMAKEuse OUTPUTuse VARCOMuse MENU_SOLVERuse MENU_NUMuse USTMESHuse DEFFIELDuse SPARSE_MATuse MENU_ZONECOUPLINGimplicit none! -- Declaration des entrees --real(krp) :: dt ! pas de temps CFLcharacter :: typtemps ! type d'integration (stat, instat, period)type(mnu_solver) :: defsolver ! type d'equation a resoudretype(mnu_spat) :: defspat ! parametres d'integration spatialetype(mnu_time) :: deftime ! parametres d'integration spatialetype(st_ustmesh) :: umesh ! domaine non structure a integrerinteger :: ncp ! nombre de couplages de la zone! -- Declaration des entrees/sorties --type(st_field) :: field ! champ des valeurs et residustype(mnu_zonecoupling), dimension(1:ncp) & :: coupling ! donnees de couplage! -- Declaration des variables internes --type(st_dlu) :: mattype(st_genericfield) :: flux ! tableaux des fluxreal(krp), dimension(:), allocatable & :: jacL, jacR ! tableaux de jacobiennes des fluxinteger(kip) :: if, ic1, ic2, ic, info! -- Debut de la procedure --allocate(jacL(umesh%nface))allocate(jacR(umesh%nface))!--------------------------------------------------! phase explicite : calcul du second membre!--------------------------------------------------! -- allocation des flux et termes sources --call new(flux, umesh%nface, field%nscal, field%nvect, 0)select case(defsolver%typ_solver)case(solKDIF) call integration_kdif_ust(dt, defsolver, defspat, umesh, field, flux, .true., jacL, jacR)case default call erreur("incoherence interne (implicit_step)", "solveur inconnu")endselect! -- flux surfaciques -> flux de surfaces et calcul des residus --call flux_to_res(dt, umesh, flux, field%residu, .true., jacL, jacR)!--------------------------------------------------! phase implicite !--------------------------------------------------! DEV : on ne devrait allouer que les faces internescall new(mat, umesh%ncell_int, umesh%nface) ! allocation et initialisationmat%couple%fils(1:mat%ncouple, 1:2) = umesh%facecell%fils(1:mat%ncouple, 1:2) ! -- suppression de l'influence des cellules limites --! l'eventuelle dependance de la cellule gauche via la cellule limite! doit deja etre dans jacLdo if = 1, mat%ncouple if (mat%couple%fils(if,2) > mat%dim) jacR(if) = 0._krpenddo! construction de la matricedo if = 1, mat%ncouple ic1 = mat%couple%fils(if,1) ic2 = mat%couple%fils(if,2) ! bilan cellule a gauche de la face mat%diag(ic1) = mat%diag(ic1) + jacL(if) mat%upper(if) = + jacR(if) ! ic1 cell is supposed to the lowest index ! bilan cellule a droite de la face if (ic2 <= mat%dim) then mat%diag(ic2) = mat%diag(ic2) - jacR(if) mat%lower(if) = - jacL(if) ! ic2 cell is supposed to the highest index endifenddodo ic = 1, mat%dim mat%diag(ic) = mat%diag(ic) + umesh%mesh%volume(ic,1,1) / dt !mat%diag(ic) = umesh%mesh%volume(ic,1,1) / dtenddodeallocate(jacL, jacR)! resolutionselect case(deftime%implicite%methode)case(alg_lu) call dlu_lu(mat, field%residu%tabscal(1)%scal, field%residu%tabscal(1)%scal)case(alg_jac) call dlu_jacobi(deftime%implicite, mat, field%residu%tabscal(1)%scal, & field%residu%tabscal(1)%scal, info) if (info < 0) call print_warning("methode d'inversion JACOBI non convergee")case(alg_gs) call erreur("developpement","Methode Gauss-Seidel non implementee")case(alg_sor) call erreur("developpement","Methode SOR non implementee") case default call erreur("incoherence","methode d'inversion inconnue")endselectcall delete(mat)!--------------------------------------------------!select case(typtemps)! case(instationnaire) ! corrections de flux seulement en instationnaire! ! Calcul de l'"energie" a l'interface, en vue de la correction de flux, pour ! ! le couplage avec echanges espaces! !DVT : flux%tabscal(1) !! if (ncp>0) then! call accumulfluxcorr(dt, defsolver, umesh%nboco, umesh%boco, &! umesh%nface, flux%tabscal(1)%scal, ncp, &! coupling)! endif!endselectif (ncp > 0) call erreur("Developpement","couplage interdit en implicite")call delete(flux)endsubroutine implicit_step!------------------------------------------------------------------------------!! Historique des modifications!! avr 2004 : creation de la procedure!------------------------------------------------------------------------------!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -