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

📄 calc_cellvtex.f90

📁 国外大名顶顶的“台风”并行计算流体力学CFD软件的早期版本的源代码
💻 F90
字号:
!------------------------------------------------------------------------------!! Procedure : calc_cellvtex               Auteur : J. Gressier!                                         Date   : Juillet 2003! Fonction                                Modif  : (cf Historique)!   Calcul de connectivites cell->vtex a partir de connectivites!   face->cell et face->vtex!! Defauts/Limitations/Divers :!!------------------------------------------------------------------------------!subroutine calc_cellvtex(geom, cellvtex, ncell, ncell_int, facecell, facevtex)use TYPHMAKEuse CONNECTIVITYuse USTMESHuse STRINGimplicit none! -- Declaration des entrees --character        :: geom                  ! mode geometriquetype(st_connect) :: facecell, facevtex    ! connectivites en entreesinteger          :: ncell                 ! nombre total de cellules integer          :: ncell_int             ! nombre de cellules internes                                          !   ncell-ncell_int est le nombre de                                          !   de cellules limites! -- Declaration des sorties --type(st_cellvtex) :: cellvtex! -- Declaration des variables internes --type(st_connect)     :: xcellvtex    ! tableau intermediaire des connectivitesinteger, allocatable :: nvtex(:)     ! nombre de sommet par elementinteger              :: if, ic, iv   ! index de face, cellule, et sommetinteger              :: vtex         ! numero de sommetinteger              :: info         ! -- Debut de la procedure --! creation d'une connectivite cell->vertex provisoirecall new(xcellvtex, ncell, 8)        ! une cellule est censee avoir 8 sommets maxallocate(nvtex(ncell))               ! nombre reel de sommets par elementnvtex(:) = 0! remplissage de la connectivite avec test de doublons de vertexdo if = 1, facecell%nbnodes          ! boucle sur les faces  do iv = 1, facevtex%nbfils         ! boucle sur les sommets de chaque face    vtex = facevtex%fils(if,iv)    if (vtex /= 0) then              ! si le sommet existe      ! premiere cellule voisine de la voisine      ic = facecell%fils(if,1)      if (nvtex(ic) /= 0) then       ! si il y a deja des sommets affectes        ! on recherche si le sommet courant a deja ete affecte        if (index(vtex, xcellvtex%fils(ic,1:nvtex(ic))) == 0) then          nvtex(ic)                    = nvtex(ic) + 1          xcellvtex%fils(ic,nvtex(ic)) = vtex        endif       else        nvtex(ic)                    = nvtex(ic) + 1        xcellvtex%fils(ic,nvtex(ic)) = vtex      endif      ! seconde cellule voisine de la voisine      ic = facecell%fils(if,2)      if (nvtex(ic) /= 0) then        if (index(vtex, xcellvtex%fils(ic,1:nvtex(ic))) == 0) then          nvtex(ic)                    = nvtex(ic) + 1          xcellvtex%fils(ic,nvtex(ic)) = vtex        endif       else        nvtex(ic)                    = nvtex(ic) + 1        xcellvtex%fils(ic,nvtex(ic)) = vtex      endif    endif  enddoenddo!!! ATTENTION : l'ordre des vertex peut etre important pour la definition de l'element!!! c'est surtout le cas en 3D pour les PYRA, PENTA et HEXA mais aussi les QUAD! a faire en externe a cette routine car on a besoin des coordonnees des points.!!! DANS UNE VERSION FUTURE, il sera utile de regarder le type des faces pour construire!!! la cellule et reprendre les sommets dans l'ordre voulu.! --- correction des cellules limites qui sont souvent degenerees en des faces ---!!do ic = ncell_int+1, ncell!  select case(nvtex(ic))!!    case(2)!      ! on est cense avoir un maillage 2D (QUAD ou TRI) et l'element limite est un BAR!      if (cellvtex%nquad /= 0) then!        ! on transforme le BAR en QUAD (ordre CGNS des sommets)!        nvtex(ic) = 4!        xcellvtex%fils(ic,3) = xcellvtex%fils(ic,2) !        xcellvtex%fils(ic,4) = xcellvtex%fils(ic,1) !      else!        ! on transforme le BAR en TRI!        nvtex(ic) = 3!        xcellvtex%fils(ic,3) = xcellvtex%fils(ic,1) !      endif!!    case(3)!      ! on est cense avoir un maillage 3D (TETRA, PYRA ou PENTA) !      ! et l'element limite est un TRI!      if (cellvtex%ntetra /= 0) then!        ! on transforme le TRI en TETRA!        nvtex(ic) = 4!        xcellvtex%fils(ic,4) = xcellvtex%fils(ic,1) !      else if (cellvtex%npenta /= 0) then!        ! on transforme le TRI en PENTA (ordre CGNS des sommets)!        nvtex(ic) = 6!        xcellvtex%fils(ic,4) = xcellvtex%fils(ic,1) !        xcellvtex%fils(ic,5) = xcellvtex%fils(ic,2) !        xcellvtex%fils(ic,6) = xcellvtex%fils(ic,3) !      else ! CAS EXCEPTIONNEL!        ! on transforme le TRI en PYRA (ordre CGNS des sommets)!        nvtex(ic) = 5!        xcellvtex%fils(ic,5) = xcellvtex%fils(ic,3)   ! echange sommets 3 et 5 !        xcellvtex%fils(ic,3) = xcellvtex%fils(ic,2) !        xcellvtex%fils(ic,4) = xcellvtex%fils(ic,1) !      endif!    case(4)!      ! on est cense avoir un maillage 3D (PYRA, PENTA, ou HEXA) !      ! et l'element limite est un QUAD!      ! Attention : si ce n'est pas une face, cela peut-etre un TETRA!      if (cellvtex%nhexa /= 0) then!        ! on transforme le QUAD en HEXA (ordre CGNS des sommets)!        nvtex(ic) = 8!        xcellvtex%fils(ic,5) = xcellvtex%fils(ic,1) !        xcellvtex%fils(ic,6) = xcellvtex%fils(ic,2) !        xcellvtex%fils(ic,7) = xcellvtex%fils(ic,3) !        xcellvtex%fils(ic,8) = xcellvtex%fils(ic,4) !      else if (cellvtex%npenta /= 0) then!        ! on transforme le QUAD en PENTA (ordre CGNS des sommets)!        nvtex(ic) = 6!        xcellvtex%fils(ic,5) = xcellvtex%fils(ic,3) !        xcellvtex%fils(ic,6) = xcellvtex%fils(ic,4) !      else  ! CAS EXCEPTIONNEL!        ! on transforme le QUAD en PYRA (ordre CGNS des sommets)!        nvtex(ic) = 5!        xcellvtex%fils(ic,5) = xcellvtex%fils(ic,1)!      endif!    endselect!enddo! --- transformation connectivite originale en connectivite adaptee CELLVTEX ---call init(cellvtex)! on compte le nombre d'elements pour d'abord faire les allocationsinfo = 0select case(geom)case(msh_2dplan)  cellvtex%dim = 2  do ic = 1, ncell    select case(nvtex(ic))    case(2)      cellvtex%nbar  = cellvtex%nbar  + 1    case(3)      cellvtex%ntri  = cellvtex%ntri  + 1    case(4)      cellvtex%nquad = cellvtex%nquad + 1    case default      info = ic    endselect  enddocase(msh_3d)  cellvtex%dim = 3  do ic = 1, ncell    select case(nvtex(ic))    case(4)      cellvtex%ntetra = cellvtex%ntetra + 1    case(5)      cellvtex%npyra  = cellvtex%npyra  + 1    case(6)      cellvtex%npenta = cellvtex%npenta + 1    case(8)      cellvtex%nhexa  = cellvtex%nhexa  + 1    case default      info = ic    endselect  enddocase default  info = -1endselectif (info/=0) call erreur("dans le calcul de connectivite cell/vtex",      &                         "code erreur "//trim(adjustl(strof(info,10)))//  &                         " ("//trim(adjustl(strof(nvtex(info),2)))//")")! allocationcall new(cellvtex)! Copie des connectivitescall init_cellvtex(cellvtex)   ! remize a zero des compteursselect case(cellvtex%dim)case(2)  do ic = 1, ncell    select case(nvtex(ic))    case(2)      cellvtex%nbar  = cellvtex%nbar + 1      cellvtex%bar%fils(cellvtex%nbar,:) = xcellvtex%fils(ic, 1:2)      cellvtex%ibar(cellvtex%nbar) = ic    case(3)      cellvtex%ntri  = cellvtex%ntri + 1      cellvtex%tri%fils(cellvtex%ntri,:) = xcellvtex%fils(ic, 1:3)      cellvtex%itri(cellvtex%ntri) = ic    case(4)      cellvtex%nquad = cellvtex%nquad + 1      cellvtex%quad%fils(cellvtex%nquad,:) = xcellvtex%fils(ic, 1:4)      cellvtex%iquad(cellvtex%nquad) = ic    endselect  enddocase(3)  do ic = 1, ncell    !!! ATTENTION, on peut avoir des CELLULES degenerees en FACES en 3D    select case(nvtex(ic))    case(4)      cellvtex%ntetra = cellvtex%ntetra + 1      cellvtex%tetra%fils(cellvtex%ntetra,:) = xcellvtex%fils(ic, 1:4)      cellvtex%itetra(cellvtex%ntetra) = ic    case(5)      cellvtex%npyra  = cellvtex%npyra  + 1      cellvtex%pyra%fils(cellvtex%npyra,:) = xcellvtex%fils(ic, 1:5)      cellvtex%ipyra(cellvtex%npyra) = ic    case(6)      cellvtex%npenta = cellvtex%npenta + 1      cellvtex%penta%fils(cellvtex%npenta,:) = xcellvtex%fils(ic, 1:6)      cellvtex%ipenta(cellvtex%npenta) = ic    case(8)      cellvtex%nhexa  = cellvtex%nhexa  + 1      cellvtex%hexa%fils(cellvtex%nhexa,:) = xcellvtex%fils(ic, 1:8)      cellvtex%ihexa(cellvtex%nhexa) = ic    endselect  enddoendselectdeallocate(nvtex)call delete(xcellvtex)endsubroutine calc_cellvtex!------------------------------------------------------------------------------!! Historique des modifications!! Juil 2003 : creation de la procedure! !------------------------------------------------------------------------------!

⌨️ 快捷键说明

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