TABLE OF CONTENTS


NUM/calc_flux [ Modules ]

[ Top ] [ Modules ]

NOM

   calc_flux(calc,lev)

DESCRIPTION

 Calcul des bilan des flux sur les faces 
 Le terme de bilan est stocke dans la variable "balance" de chaque cellule

 Calculation of flow balances on faces 
 The balance term is stored in the ‘balance’ variable in each cell.
 
    ENTREES / INPUT
   calc : objet calcul / Calcul object
   lev  :  niveau maximal de raffinement a considerer / maximum level of refinement to be considered
    SORTIES / OUTPUT
   calc : objet calcul avec les bilans de flux mis a jour / Calcul object with updated flow balances
   lev  : niveau maximal de raffinement a considerer / maximum level of refinement to be considered

SOURCE

! Ce logiciel est regi par la licence [CeCILL-B]
! This software is governed by the [CeCILL-B] license
!=========================== DEBUT DES DECLARATIONS ==================== 
!.1-----  Implicit, Use
  use num_typ
  IMPLICIT NONE
!.2-----  Declaration
  type(calcul),intent(inout)  :: calc !! Objet calcul / Calcul object
  integer, intent(inout)      :: lev  !! niveau maximal de raffinement a considerer / maximum level of refinement to be considered
  
  type(state)                 :: wL,wR
  integer                     :: i,ic1,ic2,iv,ii
  real(kind=kind(0.d0))       :: surf,xa,ya,za
  type(vect_nvar)             :: flux, fluxnc 
  type(vect_3)                :: vnmoins ! oppose du vecteur normal (pour les flux non conservatifs)
  type(vect_3)                :: vcf     ! vecteur centre cellule - centre face
!=========================== DEBUT DU CODE EXECUTABLE ==================
  

!--- boucle sur les faces pour calculer les flux convectifs
  
  DO i=1,calc%msh%nb_face
      IF (calc%msh%list_face(i)%flevel.gt.lev) GOTO 200

      ic1=calc%msh%list_face(i)%ic1
      ic2=calc%msh%list_face(i)%ic2

      IF (ic2.eq.-999) GOTO 200
      surf=calc%msh%list_face(i)%surf
      IF (ic1.le.0) STOP
  
      ! recuperation de l etat Left
      wL=calc%msh%list_cell(ic1)%w
  
      ! si ordre 2, correction de l etat Left par la methode MUSCL
      IF (calc%iordre_e.ge.2) THEN
          ! determination du vecteur centre de la cellule - centre de la face
          xa=calc%msh%list_face(i)%center%x
          ya=calc%msh%list_face(i)%center%y
          za=calc%msh%list_face(i)%center%z
  
          vcf%v(1)=xa-calc%msh%list_cell(ic1)%center%x
          vcf%v(2)=ya-calc%msh%list_cell(ic1)%center%y
          vcf%v(3)=za-calc%msh%list_cell(ic1)%center%z
      
          DO iv=1,nvarmax
              DO ii=1,calc%msh%ndim
                  wL%vprim%v(iv)=wL%vprim%v(iv)+wL%gprim(ii)%v(iv)*vcf%v(ii) 
              END DO
          END DO
      
      END IF
   
      ! si il existe, recuperation de l etat Right
      IF (ic2.ge.1) THEN
          wR=calc%msh%list_cell(ic2)%w
           
         ! si ordre 2, correction de l etat Right par la methode MUSCL
          IF (calc%iordre_e.ge.2) THEN
              ! determination du vecteur centre de la cellule - centre de la face
              xa=calc%msh%list_face(i)%center%x
              ya=calc%msh%list_face(i)%center%y
              za=calc%msh%list_face(i)%center%z
        
              vcf%v(1)=xa-calc%msh%list_cell(ic2)%center%x
              vcf%v(2)=ya-calc%msh%list_cell(ic2)%center%y
              vcf%v(3)=za-calc%msh%list_cell(ic2)%center%z
              
              DO iv=1,nvarmax
                  DO ii=1,calc%msh%ndim
                    wR%vprim%v(iv)=wR%vprim%v(iv)+wR%gprim(ii)%v(iv)*vcf%v(ii)  
                  END DO
              END DO             
          END IF
      ELSE
          ! en cas de condition aux limites on extrapole l etat
          ! Right a partir du type de la condition aux limites
          ! de l etat connu et du vecteur normal
          xa=calc%msh%list_face(i)%center%x
          ya=calc%msh%list_face(i)%center%y
          za=calc%msh%list_face(i)%center%z
          CALL Wext(wL,wR,calc%msh%list_face(i)%vnorm,ic2,xa,ya,za,&
                    calc%msh%list_cell(ic1)%center%x, &
                    calc%msh%list_cell(ic1)%center%y, &
                    calc%msh%list_cell(ic1)%center%z )
      END IF
  
      ! calcul du flux numerique convectif conservatif
      icell_phy=ic1

      CALL prim2bal(wR)
      CALL prim2bal(wL)
      CALL fluxnum(wL,wR,calc%msh%list_face(i)%vnorm,flux,calc%ityp_flux)

      ! ajout dans le bilan de la cellule de gauche si elle est dans le
      ! bon domaine
      IF (calc%msh%list_cell(ic1)%idom.eq.calc%msh%numdom.and.calc%msh%list_cell(ic1)%isolid.ne.1) &
             calc%msh%list_cell(ic1)%balance%v=calc%msh%list_cell(ic1)%balance%v+flux%v * surf
                   
      ! ajout dans le bilan de la cellule de droite si elle existe et est dans le
      ! bon domaine (signe oppose car f(-vn)=-f(vn) )
      IF (ic2.gt.0) THEN
          IF (calc%msh%list_cell(ic2)%idom.eq.calc%msh%numdom.and.calc%msh%list_cell(ic2)%isolid.ne.1) &
                 calc%msh%list_cell(ic2)%balance%v=calc%msh%list_cell(ic2)%balance%v-flux%v *surf
      END IF
      ! le cas echant, calcul du flux numerique non conservatif

          CALL fluxnumnoncons(wL,wR,calc%msh%list_face(i)%vnorm,fluxnc,calc%ityp_flux)
          
          ! ajout dans le bilan de la cellule de gauche si elle est dans le
          ! bon domaine
          IF (calc%msh%list_cell(ic1)%idom.eq.calc%msh%numdom) &
              calc%msh%list_cell(ic1)%balance%v=calc%msh%list_cell(ic1)%balance%v+fluxnc%v * surf
  
          vnmoins%v=-calc%msh%list_face(i)%vnorm%v
          vi_phy=-vi_phy
          call fluxnumnoncons(wR,wL,vnmoins,fluxnc,calc%ityp_flux)
          ! ajout dans le bilan de la cellule de droite si elle existe et est dans le
          ! bon domaine (ici en general, f(-vn) est different de -f(vn))
          IF (ic2.gt.0) THEN
             IF (calc%msh%list_cell(ic2)%idom.eq.calc%msh%numdom) &
                  calc%msh%list_cell(ic2)%balance%v=calc%msh%list_cell(ic2)%balance%v+fluxnc%v *surf
          END IF

200 continue
  END DO
  
!===========================   FIN DE LA ROUTINE    ====================
END SUBROUTINE calc_flux