View difference between Paste ID: 9mXhcjka and K8GMEfMx
SHOW: | | - or go back to the newest paste.
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