zrhans

diffusion_1D.f90

Jun 1st, 2017
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. PROGRAM diffusion_1D
  2. ! *******************************************************************
  3. !     Auteurs:
  4. !     Date de creation:
  5. !     Date de modification:
  6. !
  7. !     Ce programme permet de resoudre une equation de diffusion 1D:
  8. !
  9. !     dC/dt = K d2C/dx2
  10. !
  11. !     C(x,t): la concentration en kg/m3
  12. !     K: la diffusivite en m2/s
  13. !     t: le temps en s
  14. !     x: la variable d'espace en m
  15. !
  16. ! *******************************************************************
  17. !
  18. ! ==========================
  19. ! Declaration des variables
  20. ! ==========================
  21. !
  22.   IMPLICIT NONE                      ! Toutes les variables doivent être declarees
  23. !
  24.   INTEGER :: i                       ! indice de la variable spatiale
  25.   INTEGER :: n                       ! indice de la variable temporelle
  26.   INTEGER :: NX                      ! nombre d'intervales suivant Ox
  27.   INTEGER :: NT,NTU                  ! nombre d'iterations totales et demandées
  28. !
  29.   PARAMETER(NX = 100)                ! Fixe le nombre de points suivant Ox
  30.   PARAMETER(NT = 2000)               ! Fixe le nombre d'iterations max
  31. !
  32.   REAl :: M0                         ! la masse initiale de polluant
  33.   REAl :: c0                         ! la concentration initiale c(x,0)=c0
  34.   REAL :: K                          ! la diffusivite
  35.   REAL :: U0                          ! la speed of wind
  36.   REAL :: tfin                       ! le temps max a atteindre
  37.   REAL :: dt                         ! le pas de temps
  38.   REAL :: dx                         ! le pas d'espace
  39.   REAL :: L                          ! longueur du domaine de calcul
  40.   REAL :: Mt                         ! Masse totale de colorant
  41.   REAL :: per
  42.  
  43. !
  44.   REAL, DIMENSION(0:NX, 0:NT)      :: ca   !  Solution analytique
  45.   REAL, DIMENSION(0:NX)      :: x    ! la variable d'espace x
  46.   REAL, DIMENSION(0:NT)      :: t    ! le temps
  47.   REAL, DIMENSION(0:NX,0:NT) :: c    ! la concentration c(x,t)
  48. !
  49.   INTEGER           :: LENGTH        ! Longeur de la chaine de caracteres du nom des fichiers
  50.   CHARACTER(LEN=4)  :: INT_TO_STRING ! Pour conversion entier -> chaine de caractères
  51.   CHARACTER(LEN=35) :: NOMFICHANIM   ! Nom du fichier de resultats
  52.   INTEGER :: LENGTH2
  53.   CHARACTER(LEN=35) :: NOMFICHANIM2
  54. !
  55. ! ===================================================
  56. ! Affectation des grandeurs physiques et géométriques
  57. ! ===================================================
  58. !
  59.   K = .001
  60.   U0 = 0.5
  61.   M0 = 1.
  62.   L = 10.
  63.   dx = L / NX
  64.   c0 = M0 / dx
  65.   per = ACOS(-1.) ! per, c'est pi!
  66.  
  67. !
  68. ! =================================
  69. ! Creation et affichage du maillage
  70. ! =================================
  71. !
  72.   WRITE(*,*) '--------------------------------'
  73.   WRITE(*,*) 'Affichage des noeuds du maillage'
  74.   WRITE(*,*) '--------------------------------'
  75.   DO i=0,NX
  76.      x(i) = i*dx
  77.      WRITE(*,*) 'X(',i,')=', x(i)
  78.   ENDDO
  79. !
  80. ! ===================================
  81. ! Definition des paramètres temporels
  82. ! ===================================
  83. !
  84. !
  85. ! Definition du pas de temps
  86. !
  87.   WRITE(*,*) 'Donnez votre pas de temps, aussi connu sous le nom de dt :'
  88.   READ(*,*) dt
  89. !
  90. ! Calcul du nombre d'iterations a effectuer NTU
  91. !
  92.   WRITE(*,*) 'Quand est-ce qu''on s''arrete ?'
  93.   READ(*,*) tfin
  94.   NTU = tfin / dt
  95.   IF (NTU.GT.NT) THEN
  96.      WRITE(*,*) 'Désolé garcon, le temps max est: ', NT*dt
  97.      NTU = NT
  98.      WRITE(*,*) 'Le nombre d''iterations sera donc : ', NTU, ', désolé mec'
  99.   ENDIF
  100. !
  101. ! Definition du tableau temps
  102. !
  103.   DO n=0,NTU
  104.      t(n) = n*dt
  105.   ENDDO
  106. !
  107. ! =====================================
  108. ! Mise à zéro du champ de concentration
  109. ! =====================================
  110. !
  111.   DO i=0,NX
  112.      if (i<25) then
  113.         c(i, 0) = MAX(0, i-15)
  114.      else
  115.         c(i, 0) = MAX(0, 35-i)
  116.     end if
  117.   ENDDO
  118. !
  119. ! ==================
  120. ! Condition initiale
  121. ! ==================
  122. !
  123.   !c(NX/2, 0) = c0
  124. !
  125. ! ================================
  126. ! Calcul du champ de concentration
  127. ! ================================
  128. !
  129.   WRITE(*,*) 'Calcul en cours, va chercher un café...'
  130. !
  131. ! -----------------------------
  132. ! Debut des iterations en temps
  133. ! -----------------------------
  134.   DO n=0,NTU
  135. !
  136.      WRITE(*,*) '-------------------------------'
  137.      WRITE(*,*) 'Iteration n=',n,' avec t=',t(n)
  138.      WRITE(*,*) '-------------------------------'
  139. !
  140. ! Calcul de la solution au pas de temps n+1
  141. !
  142.     DO i=1,NX-1
  143.         c(i, n+1) = U0*dt/(dx*2) * ( c(i-1, n) - c(i+1, n)) + c(i, n)
  144.         ca(i, n+1) = c0 * (i*dx - U0*n*dt)
  145.     ENDDO
  146.    
  147. !
  148. ! Conditions aux limites
  149. !
  150.     c(0, n+1) = 0
  151.    
  152. ! ---------------------------
  153. ! Fin des iterations en temps
  154. ! ---------------------------
  155. !
  156.   ENDDO
  157.  
  158.   ! Vérification de la masse totale
  159.     Mt = 0
  160.     DO i=1,NX-1
  161.         Mt = Mt + c(i, NTU)
  162.     ENDDO
  163.     Mt = Mt + .5 * (c(0, NTU) + c(NX, NTU))
  164.     WRITE(*,*) 'M0 = ', M0, ', Mt = ', Mt*dx
  165. !
  166.   WRITE(*,*) 'Victoire ! Le calcul est termine avec succes \o/'
  167. !
  168. !
  169. ! ==========================================================================
  170. ! Ecriture du champ de concentration dans des fichiers pour chaque iteration
  171. ! ==========================================================================
  172. !
  173.   WRITE(*,*) 'Ecriture des resultats dans des fichiers ...'
  174. !
  175.   DO n=0,NTU
  176. !
  177. ! Definition du nom du fichier
  178. !
  179. !
  180.      IF (n.LT.10)                    WRITE (int_to_string, '(I1)') n
  181.      IF ((n.LT.100).AND.(n.GE.10))   WRITE (int_to_string, '(I2)') n
  182.      IF ((n.LT.1000).AND.(n.GE.100)) WRITE (int_to_string, '(I3)') n
  183.      IF ((n.LT.10000).AND.(n.GE.1000)) WRITE (int_to_string, '(I4)') n
  184. !
  185.      NOMFICHANIM='diffusion_1D_'//int_to_string
  186.      LENGTH=INDEX(NOMFICHANIM,' ')-1
  187.      IF (LENGTH.LT.0) LENGTH=LEN(NOMFICHANIM)
  188.      NOMFICHANIM=NOMFICHANIM(1:LENGTH)//'.vtk'
  189.      
  190.  
  191.      NOMFICHANIM2='diffusion_analytique_'//int_to_string
  192.      LENGTH2=INDEX(NOMFICHANIM2,' ')-1
  193.      IF (LENGTH2.LT.0) LENGTH2=LEN(NOMFICHANIM2)
  194.      NOMFICHANIM2=NOMFICHANIM2(1:LENGTH2)//'.vtk'
  195.      
  196. !
  197. ! Ouverture du fichier
  198. !
  199.      OPEN(                      &
  200.           UNIT   = 9,           &
  201.           FILE   = NOMFICHANIM, &
  202.           STATUS = 'UNKNOWN',   &
  203.           FORM   = 'FORMATTED'  &
  204.           )
  205.    
  206.     OPEN(                      &
  207.           UNIT   = 10,           &
  208.           FILE   = NOMFICHANIM2, &
  209.           STATUS = 'UNKNOWN',   &
  210.           FORM   = 'FORMATTED'  &
  211.           )
  212. !
  213. ! Ecriture dans le fichier
  214. !
  215.      WRITE(9,'(''# vtk DataFile Version 2.0'')')
  216.      WRITE(9,'(''2D scalar data'')')
  217.      WRITE(9,'(''           '')')
  218. !
  219.      WRITE(9,'(''ASCII'')')
  220. !
  221.      WRITE(9,'(''DATASET STRUCTURED_GRID'')')
  222.      WRITE(9,'(''DIMENSIONS'',3i7)') NX+1,1,1
  223.      WRITE(9,'(''POINTS '',i7,'' float'')') (NX +1)*1*1
  224.      DO i=0,NX
  225.         WRITE(9,*) x(i),0,0
  226.      ENDDO
  227. !
  228.      WRITE(9,'(''POINT_DATA '',i7)') (NX+1)*1*1
  229. !
  230.      WRITE(9,'(''SCALARS concentration float'')')
  231.      WRITE(9,'(''LOOKUP_TABLE default'')')
  232.      DO i=0,NX
  233.         WRITE(9,*) c(i,n)
  234.      ENDDO
  235.      
  236.      
  237.      ! Solution analytique
  238.      WRITE(10,'(''# vtk DataFile Version 2.0'')')
  239.      WRITE(10,'(''2D scalar data'')')
  240.      WRITE(10,'(''           '')')
  241. !
  242.      WRITE(10,'(''ASCII'')')
  243. !
  244.      WRITE(10,'(''DATASET STRUCTURED_GRID'')')
  245.      WRITE(10,'(''DIMENSIONS'',3i7)') NX+1,1,1
  246.      WRITE(10,'(''POINTS '',i7,'' float'')') (NX +1)*1*1
  247.      DO i=0,NX
  248.         WRITE(10,*) x(i),0,0
  249.      ENDDO
  250. !
  251.      WRITE(10,'(''POINT_DATA '',i7)') (NX+1)*1*1
  252. !
  253.      WRITE(10,'(''SCALARS concentration float'')')
  254.      WRITE(10,'(''LOOKUP_TABLE default'')')
  255.      DO i=0,NX
  256.         WRITE(10,*) ca(i, n)
  257.      ENDDO
  258. !
  259.   ENDDO
  260. !
  261. !     Fermeture du fichier
  262. !
  263.   CLOSE(9)
  264.   CLOSE(10)
  265. !
  266. !     FIN DU PROGRAMME
  267. !----------------------------------------------------------------------
  268. END PROGRAM diffusion_1D
Add Comment
Please, Sign In to add comment