MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
mod_DFT_DISP_WDA.F90
1 
4 
5 
6 
7 
8 
9 
10 
11 Module mod_dft_disp_wda
12 
13 
14 Implicit None
15 
16 Private
17 
18 Public :: rhoi_disp_wd
19 Public :: a_disp_pcsaft
20 Public :: df_disp_drho_wda
21 
22 
23 
24 
25 
26  Contains
27 
28 
29 
30  SUBROUTINE rhoi_disp_wd ( discret, fa_psi, fa_psi_max, psi_j, rhop, rhoi_disp,user )
31 
32 
33  Use petscmanagement
34  Use basic_variables, ONLY: ncomp, t, parame
35  Use mod_dft, Only: zp,dzp
36  IMPLICIT NONE
37 
38 #include <finclude/petscsys.h>
39 
40 !
41 ! ----------------------------------------------------------------------
42  type(userctx) :: user
43  petscscalar :: rhop(ncomp,user%gxs:user%gxe)
44  INTEGER, INTENT(IN) :: discret
45  INTEGER, INTENT(IN) :: fa_psi(ncomp)
46  INTEGER, INTENT(IN) :: fa_psi_max
47 ! REAL, INTENT(IN) :: dzp
48  REAL, INTENT(IN) :: psi_j(ncomp)
49 ! REAL, INTENT(IN) :: zp(user%gxs:user%gxe)
50  REAL, INTENT(OUT) :: rhoi_disp(user%gxs:user%gxe,ncomp)
51 ! ----------------------------------------------------------------------
52  INTEGER :: ii, jj, icomp, nn
53  REAL :: zmin, zl, zr
54  REAL :: int1, zz1, xl, xh
55  REAL, DIMENSION(700) :: y2, rx, ry1
56 ! ----------------------------------------------------------------------
57 
58 !write(*,*)'rhoi_wd'
59 
60  zmin = 1d-6
61  DO icomp = 1, ncomp
62  DO ii = (user%xs-fa_psi_max),(user%xe+fa_psi_max)!(-fa_psi_max), (discret+fa_psi_max)
63  nn = 0
64  zl = zp(ii) - psi_j(icomp)
65  zr = zp(ii) + psi_j(icomp)
66  DO jj = (ii-fa_psi(icomp)), (ii+fa_psi(icomp))
67  IF ( zp(jj+1) > (zl+zmin) ) THEN
68  ! first position: left side of the sphere: zl. Linear Interpolation of h's
69  IF ( nn == 0 ) THEN
70  nn = nn + 1
71  rx(1) = zl
72  ry1(1) = 0.0 ! = 0.75*rhop(ii-fa,icomp)*( d.**2 -d.**2 )
73 !write(*,*)'FIRST',nn,rx(nn),ry1(nn)
74  ! middle position: within the sphere: zl < jj < zr
75  ELSE
76  nn = nn + 1
77  zz1 = zp(jj)-zp(ii) ! distance z12 between 1 and 2
78  rx(nn) = zp(jj)
79  ry1(nn) = rhop(icomp,jj) * (psi_j(icomp)*psi_j(icomp) - zz1*zz1)
80 !write(*,*)'MIDDLE',nn,rx(nn),ry1(nn)
81  ! last position: right side of the sphere: zr. Linear Interpolation of h's
82  IF ( zp(jj+1) > (zr-zmin) ) THEN
83  nn = nn + 1
84  rx(nn) = zr
85  ry1(nn) = 0.0
86 !write(*,*)'LAST',nn,rx(nn),ry1(nn)
87  EXIT
88  END IF
89  END IF
90  END IF
91  END DO
92  xl = rx(1)
93  xh = rx(nn)
94 
95  if( nn >= 700 ) then
96  write(*,*) 'rhoi_disp_wd: bigger vectors rx, ry1, ry2, ... required!', nn
97  pause
98  end if
99 
100  CALL spline ( rx(1:nn), ry1(1:nn), nn, 1.e30, 1.e30, y2(1:nn) )
101  CALL splint_integral ( rx(1:nn), ry1(1:nn), y2(1:nn), nn, xl, xh, int1 )
102  rhoi_disp(ii,icomp) = int1 * 0.75/psi_j(icomp)**3
103 
104  if ( rhoi_disp(ii,icomp) < 0.0 ) then
105  rhoi_disp(ii,icomp) = 0.0
106  do jj = 2, nn
107  rhoi_disp(ii,icomp) = rhoi_disp(ii,icomp) + (ry1(jj)+ry1(jj-1))/2.0 *(rx(jj)-rx(jj-1))
108  end do
109  end if
110  if ( rhoi_disp(ii,icomp) < 0.0 ) rhoi_disp(ii,icomp) = rhop(icomp,ii)
111  END DO
112  END DO
113 
114 
115 END SUBROUTINE rhoi_disp_wd
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
126 ! SUBROUTINE a_disp_pcsaft
127 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
128 !
129  SUBROUTINE a_disp_pcsaft( discret, fa_psi, fa_psi_max, rhoi_disp, rho_disp, adisp, mydisp, dadisp_dr,user )
130 
131  Use petscmanagement
132 !
133  USE parameters, ONLY: pi, np, nc
134  USE basic_variables, ONLY: ncomp, t, parame, xi, densta, ensemble_flag
135  USE eos_variables, ONLY: dhs, sig_ij, uij
136  USE eos_constants, ONLY: ap, bp
137  IMPLICIT NONE
138 
139 #include <finclude/petscsys.h>
140 
141 
142 
143 
144 !
145 ! ----------------------------------------------------------------------
146  type(userctx) :: user
147  INTEGER, INTENT(IN) :: discret
148  INTEGER, INTENT(IN) :: fa_psi(ncomp)
149  INTEGER, INTENT(IN) :: fa_psi_max
150  REAL, INTENT(IN) :: rhoi_disp(user%gxs:user%gxe,ncomp)
151  REAL, INTENT(OUT) :: rho_disp(user%gxs:user%gxe)
152  REAL, INTENT(OUT) :: adisp(user%gxs:user%gxe)
153  REAL, INTENT(OUT) :: mydisp(user%gxs:user%gxe,ncomp)
154  REAL, INTENT(OUT) :: dadisp_dr(user%gxs:user%gxe,ncomp)
155 ! ----------------------------------------------------------------------
156  INTEGER :: jj, m
157  INTEGER :: icomp, jcomp, kcomp
158  REAL, DIMENSION(ncomp) :: x_disp
159  REAL :: eta_disp, zms_disp
160  REAL, DIMENSION(0:6) :: apar, bpar, apar_rk, bpar_rk
161  REAL :: m_mean, c1, i1, i2
162  REAL :: r2_ord1, r2_ord2
163  REAL :: eta_rk, m_mean_rk, zms2eta
164  REAL :: c1_m_mean, c1_eta, c1_rk
165  REAL :: i1_rk, i2_rk
166  REAL :: r2_ord1_rk, r2_ord2_rk
167  REAL :: term1, term2, term3
168  INTEGER :: iphas
169  REAL, DIMENSION(np,nc) :: mydisp2
170 ! ----------------------------------------------------------------------
171 
172  DO icomp = 1, ncomp
173  DO jj = (user%xs-fa_psi_max),(user%xe+fa_psi_max)!(-fa_psi_max), (discret+fa_psi_max)
174  m_mean = 0.
175  eta_disp = 0.
176 ! rho_disp(jj) = sum( rhop(jj,1:ncomp) )
177  rho_disp(jj) = sum( rhoi_disp(jj,1:ncomp) )
178  do kcomp=1, ncomp
179 ! x_disp(kcomp) = rhop(jj,kcomp) / rho_disp(jj)
180  x_disp(kcomp) = rhoi_disp(jj,kcomp) / rho_disp(jj)
181  m_mean = m_mean + x_disp(kcomp) * parame(kcomp,1)
182 ! eta_disp = eta_disp + rhop(jj,kcomp) * parame(kcomp,1) * dhs(kcomp)**3.
183  eta_disp = eta_disp + rhoi_disp(jj,kcomp) * parame(kcomp,1) * dhs(kcomp)**3.
184  end do
185  eta_disp = eta_disp * pi / 6.
186  zms_disp = 1. - eta_disp
187  if( zms_disp <= 0. ) write(*,'(a56,i6,f12.5)') 'system too dense for disp contribution ( jj, eta_disp ):', jj, eta_disp
188 
189 
190  ! quantities of the dispersive free energy contribution
191  i1 = 0.
192  i2 = 0.
193  do m = 0, 6
194  apar(m) = ap(m,1) + (1.-1./m_mean)*ap(m,2) + (1.-1./m_mean)*(1.-2./m_mean)*ap(m,3)
195  bpar(m) = bp(m,1) + (1.-1./m_mean)*bp(m,2) + (1.-1./m_mean)*(1.-2./m_mean)*bp(m,3)
196  i1 = i1 + apar(m) * eta_disp**m
197  i2 = i2 + bpar(m) * eta_disp**m
198  end do
199 
200  r2_ord1 = 0.
201  r2_ord2 = 0.
202  do kcomp = 1, ncomp
203  do jcomp = 1, ncomp
204  r2_ord1 = r2_ord1 + rhoi_disp(jj,kcomp)*rhoi_disp(jj,jcomp)*parame(kcomp,1) &
205  *parame(jcomp,1)*sig_ij(kcomp,jcomp)**3 * uij(kcomp,jcomp)/t
206  r2_ord2 = r2_ord2 + rhoi_disp(jj,kcomp)*rhoi_disp(jj,jcomp)*parame(kcomp,1) &
207  *parame(jcomp,1)*sig_ij(kcomp,jcomp)**3 * (uij(kcomp,jcomp)/t)**2
208  end do
209  end do
210 
211  c1 = (1.-m_mean)*(20.*eta_disp-27.*eta_disp**2 +12.*eta_disp**3 -2.*eta_disp**4 )/(zms_disp*(2.-eta_disp))**2
212  c1 = 1. + m_mean*(8.*eta_disp-2.*eta_disp**2)/zms_disp**4 + c1
213  c1 = 1. / c1
214 
215 
216  ! dispersive free energy contribution
217  adisp(jj) = -2.*pi*i1*r2_ord1/rho_disp(jj) - pi*c1*m_mean*i2*r2_ord2/rho_disp(jj)
218 
219 
220  ! quantity-derivatives of the dispersive free energy contribution
221  m_mean_rk = ( parame(icomp,1) - m_mean ) / rho_disp(jj)
222 
223  do m = 0, 6
224  apar_rk(m) = m_mean_rk/m_mean**2 * ( ap(m,2) + (3. - 4./m_mean) * ap(m,3) )
225  bpar_rk(m) = m_mean_rk/m_mean**2 * ( bp(m,2) + (3. - 4./m_mean) * bp(m,3) )
226  end do
227  eta_rk = parame(icomp,1) * dhs(icomp)**3. * pi / 6.
228  i1_rk = apar_rk(0) + apar(1)*eta_rk + apar_rk(1)*eta_disp
229  i2_rk = bpar_rk(0) + bpar(1)*eta_rk + bpar_rk(1)*eta_disp
230  do m = 2, 6
231  i1_rk = i1_rk + apar(m)*REAL(m)*eta_disp**REAL(m-1)*eta_rk + apar_rk(m)*eta_disp**REAL(m)
232  i2_rk = i2_rk + bpar(m)*REAL(m)*eta_disp**REAL(m-1)*eta_rk + bpar_rk(m)*eta_disp**REAL(m)
233  end do
234 
235  r2_ord1_rk = 0.
236  r2_ord2_rk = 0.
237  do kcomp = 1,ncomp
238  r2_ord1_rk = r2_ord1_rk + rhoi_disp(jj,kcomp) * parame(kcomp,1) * sig_ij(icomp,kcomp)**3 * uij(icomp,kcomp)/t
239  r2_ord2_rk = r2_ord2_rk + rhoi_disp(jj,kcomp) * parame(kcomp,1) * sig_ij(icomp,kcomp)**3 *(uij(icomp,kcomp)/t)**2
240  end do
241  r2_ord1_rk = 2. * parame(icomp,1) * r2_ord1_rk
242  r2_ord2_rk = 2. * parame(icomp,1) * r2_ord2_rk
243 
244  zms2eta = zms_disp * (2.-eta_disp)
245  c1_m_mean = ( 8.*eta_disp - 2.*eta_disp*eta_disp ) / zms_disp**4 &
246  - ( 20.*eta_disp - 27.*eta_disp*eta_disp + 12.*eta_disp**3 - 2.*eta_disp**4 ) / zms2eta**2
247  c1_eta = m_mean * ( 8. + 20.*eta_disp - 4.*eta_disp*eta_disp ) / zms_disp**5 &
248  + (1. - m_mean) * ( 40. - 48.*eta_disp + 12.*eta_disp*eta_disp + 2.*eta_disp**3 ) / zms2eta**3
249  c1_rk = - c1 * c1 * ( eta_rk * c1_eta + m_mean_rk * c1_m_mean )
250 
251 
252  ! chemical potential and derivative of adisp (analytically)
253  term1 = - 2. * pi * ( i1 * r2_ord1_rk + r2_ord1 * i1_rk )
254  term2 = - pi * c1 * m_mean * ( i2 * r2_ord2_rk + r2_ord2 * i2_rk )
255  term3 = - pi * i2 * r2_ord2 * ( m_mean * c1_rk + c1 * m_mean_rk )
256  mydisp(jj,icomp) = term1 + term2 + term3
257  dadisp_dr(jj,icomp) = ( mydisp(jj,icomp) - adisp(jj) ) / rho_disp(jj)
258 
259 
260  ! chemical potential and derivative of adisp (numerically)
261 ! do kcomp=1, ncomp
262 ! xi(1,kcomp) = x_disp(kcomp)
263 ! end do
264 ! iphas = 1
265 ! ensemble_flag = 'tv'
266 ! densta(1) = eta_disp
267 ! call ONLY_ONE_TERM_EOS_NUMERICAL ( 'disp_term', 'PC-SAFT ' )
268 ! if( rho_disp(jj) /= 0. ) CALL FUGACITY(mydisp2)
269 ! call RESTORE_PREVIOUS_EOS_NUMERICAL
270 ! mydisp(jj,1:ncomp) = mydisp2(iphas,1:ncomp)
271 ! dadisp_dr(jj,icomp) = ( mydisp(jj,icomp) - adisp(jj) ) / rho_disp(jj)
272 
273 
274  if( rho_disp(jj) == 0. ) then
275  adisp(jj) = 0.
276  mydisp(jj,icomp) = 0.
277  dadisp_dr(jj,icomp) = 0.
278  end if
279 
280  END DO
281  END DO
282 
283 
284 END SUBROUTINE a_disp_pcsaft
285 
286 
287 
288 
289 
290 
291 
292 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
293 ! SUBROUTINE dF_disp_drho_wda
294 !WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
295 !
296  SUBROUTINE df_disp_drho_wda( ii, WDA_var, fa_psi, psi_j, rhop, rhop_sum, &
297  rhoi_disp, rho_disp, adisp, mydisp, dadisp_dr, dF_drho_att,user )
298 
299  Use petscmanagement
300  Use basic_variables, ONLY: ncomp
301  Use mod_dft, Only: zp
302  IMPLICIT NONE
303 
304 #include <finclude/petscsys.h>
305 
306 !
307 ! ----------------------------------------------------------------------
308  type(userctx) :: user
309  petscscalar :: rhop(ncomp,user%gxs:user%gxe)
310 !
311 ! ----------------------------------------------------------------------
312  INTEGER, INTENT(IN) :: ii, wda_var
313  INTEGER, INTENT(IN) :: fa_psi(ncomp)
314  REAL, INTENT(IN) :: psi_j(ncomp)
315 ! REAL, INTENT(IN) :: zp(user%gxs:user%gxe)
316  REAL, INTENT(IN) :: adisp(user%gxs:user%gxe)
317  REAL, INTENT(IN) :: mydisp(user%gxs:user%gxe,ncomp)
318  REAL, INTENT(IN) :: rhop_sum(user%gxs:user%gxe)
319  REAL, INTENT(IN) :: rhoi_disp(user%gxs:user%gxe,ncomp)
320  REAL, INTENT(IN) :: rho_disp(user%gxs:user%gxe)
321  REAL, INTENT(IN) :: dadisp_dr(user%gxs:user%gxe,ncomp)
322  REAL, INTENT(OUT) :: df_drho_att(ncomp)
323 ! ----------------------------------------------------------------------
324  INTEGER :: jj, icomp, nn
325  REAL :: int3
326  REAL :: zmin, zl, zr, zz1, xl, xh
327  REAL, DIMENSION(700) :: y2, hx, hy3
328 ! ----------------------------------------------------------------------
329 
330  zmin = 1d-6
331  DO icomp = 1, ncomp
332  nn = 0
333  zl = zp(ii) - psi_j(icomp)
334  zr = zp(ii) + psi_j(icomp)
335  DO jj = (ii-fa_psi(icomp)), (ii+fa_psi(icomp))
336  IF ( zp(jj+1) > (zl+zmin) ) THEN
337  ! first position: left side of the sphere: zl. Linear Interpolation of h's
338  IF ( nn == 0 ) THEN
339  nn = nn + 1
340  hx(1) = zl
341  hy3(1) = 0.
342 !write(*,*)'FIRST',nn,hx(nn),hy3(nn)
343  ! middle position: within the sphere: zl < jj < zr
344  ELSE
345  nn = nn + 1
346  zz1 = zp(jj) - zp(ii) ! distance z12 between 1 and 2
347  hx(nn) = zp(jj)
348  if(wda_var == 1) hy3(nn) = mydisp(jj,icomp) * ( psi_j(icomp)*psi_j(icomp) - zz1**2 )
349  if(wda_var == 2) hy3(nn) = rhop_sum(jj) * dadisp_dr(jj,icomp) * ( psi_j(icomp)*psi_j(icomp) - zz1**2 )
350 !write(*,*)'MIDDLE',nn,hx(nn),hy3(nn)
351  ! last position: right side of the sphere: zr. Linear Interpolation of h's
352  IF ( zp(jj+1) > (zr-zmin) ) THEN
353  nn = nn + 1
354  hx(nn) = zr
355  hy3(nn) = 0.
356 !write(*,*)'LAST',nn,hx(nn),hy3(nn)
357 
358  EXIT
359  END IF
360  END IF
361  END IF
362  END DO
363  xl = hx(1)
364  xh = hx(nn)
365 
366  if( nn >= 700 ) then
367  write(*,*) 'Surface Tension Code: dF_disp_wd_pcsaft: bigger vectors hx, hy3, ... required!', nn
368  stop 5
369  end if
370 
371  CALL spline ( hx(1:nn), hy3(1:nn), nn, 1.e30, 1.e30, y2(1:nn) )
372  CALL splint_integral( hx(1:nn), hy3(1:nn), y2(1:nn), nn, xl, xh, int3 )
373 
374  if(wda_var == 1) df_drho_att(icomp) = int3 * 0.75 / psi_j(icomp)**3.
375  if(wda_var == 2) df_drho_att(icomp) = int3 * 0.75 / psi_j(icomp)**3. + adisp(ii)
376  END DO
377 
378 
379 END SUBROUTINE df_disp_drho_wda
380 
381 
382 
383 End Module mod_dft_disp_wda
384 
385 
386 ! ! !
387 ! ! ! Subroutine DISP_Weighted_Densities(rhop, rhop_wd, user)
388 ! ! !
389 ! ! ! Use PetscManagement
390 ! ! ! Use BASIC_VARIABLES, Only: ncomp
391 ! ! ! Use mod_DFT, Only: fa_disp,ab_disp,zp,dzp
392 ! ! ! Implicit None
393 ! ! !
394 ! ! ! #include <finclude/petscsys.h>
395 ! ! !
396 ! ! ! !passed
397 ! ! ! Type (userctx) :: user
398 ! ! ! PetscScalar :: rhop(ncomp,user%gxs:user%gxe)
399 ! ! ! REAL, INTENT(OUT) :: rhop_wd(user%gxs:user%gxe,ncomp)
400 ! ! !
401 ! ! !
402 ! ! ! !local
403 ! ! ! INTEGER :: i,j,k
404 ! ! ! INTEGER :: n
405 ! ! ! INTEGER, parameter :: NMAX = 800
406 ! ! ! REAL :: x_int(NMAX),y_int(NMAX),y2(NMAX) !Fehlermeldung einbauen, falls dim > 400!!
407 ! ! ! REAL :: zmin,dz,zz
408 ! ! ! REAL :: xlo,xhi,int1
409 ! ! ! INTEGER :: fa_disp_max
410 ! ! !
411 ! ! !
412 ! ! !
413 ! ! ! zmin = 1d-6
414 ! ! ! fa_disp_max = maxval(fa_disp(1:ncomp))
415 ! ! !
416 ! ! ! Do k = 1,ncomp
417 ! ! !
418 ! ! ! Do i = user%xs - fa_disp_max , user%xe + fa_disp_max
419 ! ! ! n = 1
420 ! ! ! x_int = 0.0
421 ! ! ! y_int = 0.0
422 ! ! !
423 ! ! ! Do j = i-fa_disp(k),i+fa_disp(k)
424 ! ! !
425 ! ! ! If( ( zp(i)-zp(j+1) ) < ab_disp(k) .and. ( zp(i) - zp(j) ) >= ab_disp(k) ) Then !the position of j+1 is already within i-d/2 while j is still outside this range in this case, the integration steplength (dz) is just the distance, which j+1 overlaps with i-d/2 and what is integrated is the interpolated value of the integrand
426 ! ! !
427 ! ! ! If(n/= 1) stop 'n /=1 in DISP_Weighted_Densities' !here always n=1!
428 ! ! ! zz = zp(j) - zp(i) !distance between grid points j and i
429 ! ! ! dz = zp(j+1) - (zp(i) - ab_disp(k)) !the part of the intervall between zp(j) and zp(j+1) which is already within i-d/2
430 ! ! ! !if(dz < epsilon(dz)) dz = epsilon(dz) !bei unguenstiger Kombination von sig und ngrid kann dz unter Machinengenauigkeit epsilon liegen, dann ist x(2) = x(1) + dz = x(1) -> das fuehrt zu Abbruch in Spline Interpolation
431 ! ! ! x_int(n) = 0.0 !array containing x-values for spline integration
432 ! ! ! y_int(n) = 0.0
433 ! ! !
434 ! ! !
435 ! ! ! Else If (zp(j) > (zp(i)-ab_disp(k)) .and. zp(j) <= (zp(i)+ab_disp(k))) Then !grid point j within i+-d2
436 ! ! !
437 ! ! ! n = n + 1
438 ! ! ! x_int(n) = x_int(n-1) + dz !first time in this If condition, dz is stil the old value from above!
439 ! ! ! zz = zp(j) - zp(i)
440 ! ! ! dz = dzp
441 ! ! ! y_int(n) = rhop(k,j) * (ab_disp(k)*ab_disp(k) - zz*zz )
442 ! ! !
443 ! ! !
444 ! ! ! If (zp(j) < (zp(i)+ab_disp(k)) .and. zp(j+1) >= (zp(i)+ab_disp(k)) ) Then !zp(j) is still within zp(i)+d2 but zp(j+1) is already outside zp(i)+d2
445 ! ! ! dz = zp(i) + ab_disp(k) - zp(j)
446 ! ! ! !If(dz <= epsilon(dz)) exit !wie oben, kann auch hier bei ungluecklicher Wahl von sig und ngrid dz < eps werden und somit x(n) = x(n-1) -> Abbruch in Spline interpolation. Dann einfach ngrid aendern!
447 ! ! ! zz = zp(j) - zp(i)
448 ! ! ! n = n + 1
449 ! ! ! x_int(n) = x_int(n-1) + dz
450 ! ! ! y_int(n) = 0.0
451 ! ! !
452 ! ! !
453 ! ! ! End If
454 ! ! ! End If
455 ! ! ! End Do
456 ! ! !
457 ! ! !
458 ! ! ! xlo = x_int(1)
459 ! ! ! xhi = x_int(n)
460 ! ! !
461 ! ! ! If(n > NMAX) stop 'Increase NMAX in DISP_Weighted_Densities (auch in AD Routine!!)'
462 ! ! !
463 ! ! ! write(*,*)'n',n
464 ! ! ! pause
465 ! ! ! write(*,*)'rx',x_int(1:n)
466 ! ! ! pause
467 ! ! ! write(*,*)'ry',y_int(1:n)
468 ! ! ! pause
469 ! ! !
470 ! ! !
471 ! ! !
472 ! ! ! CALL spline( x_int(1:n), y_int(1:n), n, 1.E30, 1.E30, y2(1:n) )
473 ! ! ! CALL splint_integral ( x_int(1:n), y_int(1:n), y2(1:n), n, xlo, xhi, int1 )
474 ! ! ! rhop_wd(i,k) = 0.75 * int1 / ab_disp(k)**3
475 ! ! !
476 ! ! ! if ( rhop_wd(i,k) < 0.0 ) then
477 ! ! ! rhop_wd(i,k) = 0.0
478 ! ! ! do j = 2, n
479 ! ! ! rhop_wd(i,k) = rhop_wd(i,k) + (y_int(j)+y_int(j-1))/2.0 *(x_int(j)-x_int(j-1))
480 ! ! ! end do
481 ! ! ! end if
482 ! ! ! if ( rhop_wd(i,k) < 0.0 ) rhop_wd(i,k) = rhop(k,i)
483 ! ! !
484 ! ! ! End Do
485 ! ! ! End Do
486 ! ! !
487 ! ! !
488 ! ! ! End Subroutine DISP_Weighted_Densities
489 ! ! !
490 ! ! !
491 ! ! !
492 ! ! ! Subroutine DISP_mu(rhop_wd,f_disp,my_disp,df_disp_drk,user)
493 ! ! !
494 ! ! ! Use PetscManagement
495 ! ! ! Use PARAMETERS, Only: PI
496 ! ! ! Use EOS_CONSTANTS, Only: ap,bp
497 ! ! ! Use BASIC_VARIABLES, Only: ncomp,t,parame
498 ! ! ! Use EOS_VARIABLES, Only: dhs,sig_ij,uij
499 ! ! ! Use mod_DFT, Only: fa_disp
500 ! ! ! Implicit None
501 ! ! !
502 ! ! ! #include <finclude/petscsys.h>
503 ! ! !
504 ! ! ! !passed
505 ! ! ! Type (userctx) :: user
506 ! ! ! REAL, INTENT(IN) :: rhop_wd(user%gxs:user%gxe,ncomp)
507 ! ! ! REAL, INTENT(OUT) :: my_disp(user%gxs:user%gxe,ncomp) !chemPot_disp / kT
508 ! ! ! REAL, INTENT(OUT) :: f_disp(user%gxs:user%gxe) !F_disp / NkT
509 ! ! ! REAL, INTENT(OUT) :: df_disp_drk(user%gxs:user%gxe,ncomp) ! d(F/NkT) / drho_k = (mu/kT - F_disp / NkT)/rho
510 ! ! !
511 ! ! ! ! ! !local
512 ! ! ! ! ! INTEGER :: k,ii,kk,m
513 ! ! ! ! ! REAL :: m_mean, m_rk(ncomp)
514 ! ! ! ! ! REAL :: apar(0:6),bpar(0:6)
515 ! ! ! ! ! REAL :: ap_rk(ncomp,0:6),bp_rk(ncomp,0:6)
516 ! ! ! ! ! REAL :: xi(ncomp),z3
517 ! ! ! ! ! REAL :: I1,I2,I1_rk,I2_rk
518 ! ! ! ! ! REAL :: order1,order2,ord1_rk,ord2_rk
519 ! ! ! ! ! REAL :: c1_con,c2_con, c1_rk,rho2
520 ! ! ! ! ! REAL :: rhop_wd_sum, eta_disp, eta_rk, zms
521 ! ! ! ! ! INTEGER :: fa_disp_max
522 ! ! ! ! !
523 ! ! ! ! !
524 ! ! ! ! ! fa_disp_max = maxval(fa_disp(1:ncomp))
525 ! ! ! ! !
526 ! ! ! ! ! Do k = 1,ncomp
527 ! ! ! ! ! Do ii = user%xs-fa_disp_max,user%xe+fa_disp_max
528 ! ! ! ! !
529 ! ! ! ! ! rhop_wd_sum = SUM(rhop_wd(ii,1:ncomp))
530 ! ! ! ! !
531 ! ! ! ! ! m_mean = 0.0
532 ! ! ! ! ! eta_disp = 0.0
533 ! ! ! ! ! Do kk = 1,ncomp
534 ! ! ! ! ! xi(kk) = rhop_wd(ii,kk) / rhop_wd_sum
535 ! ! ! ! ! m_mean = m_mean + xi(kk)*parame(kk,1)
536 ! ! ! ! ! eta_disp = eta_disp + rhop_wd(ii,kk)*parame(kk,1)*dhs(kk)**3
537 ! ! ! ! ! End Do
538 ! ! ! ! !
539 ! ! ! ! ! eta_disp = eta_disp * PI / 6.0
540 ! ! ! ! ! eta_rk = parame(k,1) * dhs(k)**3 * PI / 6.0
541 ! ! ! ! !
542 ! ! ! ! ! m_rk(k) = ( parame(k,1) - m_mean ) / rhop_wd_sum
543 ! ! ! ! !
544 ! ! ! ! !
545 ! ! ! ! ! DO m = 0, 6
546 ! ! ! ! ! apar(m) = ap(m,1) + (1.0-1.0/m_mean)*ap(m,2) &
547 ! ! ! ! ! + (1.0-1.0/m_mean)*(1.0-2.0/m_mean)*ap(m,3)
548 ! ! ! ! ! bpar(m) = bp(m,1) + (1.0-1.0/m_mean)*bp(m,2) &
549 ! ! ! ! ! + (1.0-1.0/m_mean)*(1.0-2.0/m_mean)*bp(m,3)
550 ! ! ! ! !
551 ! ! ! ! ! ! --- derivatives of apar, bpar to rho_k ---------------------------
552 ! ! ! ! ! ap_rk(k,m) = m_rk(k)/m_mean**2 * ( ap(m,2) + (3.0 -4.0/m_mean) *ap(m,3) )
553 ! ! ! ! ! bp_rk(k,m) = m_rk(k)/m_mean**2 * ( bp(m,2) + (3.0 -4.0/m_mean) *bp(m,3) )
554 ! ! ! ! ! END DO
555 ! ! ! ! !
556 ! ! ! ! !
557 ! ! ! ! ! I1 = 0.0
558 ! ! ! ! ! I2 = 0.0
559 ! ! ! ! ! I1_rk = 0.0
560 ! ! ! ! ! I2_rk = 0.0
561 ! ! ! ! ! DO m = 0, 6
562 ! ! ! ! ! I1 = I1 + apar(m)*eta_disp**REAL(m)
563 ! ! ! ! ! I2 = I2 + bpar(m)*eta_disp**REAL(m)
564 ! ! ! ! ! I1_rk = I1_rk + apar(m)*REAL(m)*eta_disp**REAL(m-1)*eta_rk + ap_rk(k,m)*eta_disp**REAL(m)
565 ! ! ! ! ! I2_rk = I2_rk + bpar(m)*REAL(m)*eta_disp**REAL(m-1)*eta_rk + bp_rk(k,m)*eta_disp**REAL(m)
566 ! ! ! ! ! END DO
567 ! ! ! ! !
568 ! ! ! ! !
569 ! ! ! ! ! ord1_rk = 0.0
570 ! ! ! ! ! ord2_rk = 0.0
571 ! ! ! ! ! order1 = 0.0
572 ! ! ! ! ! order2 = 0.0
573 ! ! ! ! ! DO kk = 1,ncomp
574 ! ! ! ! ! !sig_ij(kk,k) = 0.5 * ( dhs(kk) + dhs(k) )
575 ! ! ! ! ! !uij(kk,k) = (1.0 - kij(kk,k)) * SQRT( eps(kk) * eps(k) )
576 ! ! ! ! ! order1 = order1 + xi(kk)*xi(k)* parame(kk,1)*parame(k,1)*sig_ij(kk,k)**3 * uij(kk,k)/t
577 ! ! ! ! ! order2 = order2 + xi(kk)*xi(k)* parame(kk,1)*parame(k,1)*sig_ij(kk,k)**3 * (uij(kk,k)/t)**2
578 ! ! ! ! ! ord1_rk = ord1_rk + 2.0*parame(k,1)*rhop_wd_sum*xi(kk)*parame(kk,1)*sig_ij(kk,k)**3 *uij(kk,k)/t
579 ! ! ! ! ! ord2_rk = ord2_rk + 2.0*parame(k,1)*rhop_wd_sum*xi(kk)*parame(kk,1)*sig_ij(kk,k)**3 *(uij(kk,k)/t)**2
580 ! ! ! ! ! END DO
581 ! ! ! ! !
582 ! ! ! ! ! z3 = eta_disp
583 ! ! ! ! ! zms = 1.0 - z3
584 ! ! ! ! !
585 ! ! ! ! ! c1_con= 1.0/ ( 1.0 + m_mean*(8.0*z3-2.0*z3*z3)/zms**4 &
586 ! ! ! ! ! + (1.0 - m_mean)*(20.0*z3-27.0*z3*z3 +12.0*z3**3 -2.0*z3**4 ) &
587 ! ! ! ! ! /(zms*(2.0-z3))**2 )
588 ! ! ! ! ! c2_con= - c1_con*c1_con *( m_mean*(-4.0*z3*z3+20.0*z3+8.0)/zms**5 &
589 ! ! ! ! ! + (1.0 - m_mean) *(2.0*z3**3 +12.0*z3*z3-48.0*z3+40.0) &
590 ! ! ! ! ! /(zms*(2.0-z3))**3 )
591 ! ! ! ! ! c1_rk= c2_con*eta_rk - c1_con*c1_con*m_rk(k) * ( (8.0*z3-2.0*z3*z3)/zms**4 &
592 ! ! ! ! ! - (-2.0*z3**4 +12.0*z3**3 -27.0*z3*z3+20.0*z3) / (zms*(2.0-z3))**2 )
593 ! ! ! ! !
594 ! ! ! ! !
595 ! ! ! ! ! rho2 = rhop_wd_sum * rhop_wd_sum
596 ! ! ! ! !
597 ! ! ! ! ! my_disp(ii,k) = -2.0*PI* ( order1*rho2*I1_rk + ord1_rk*I1 ) &
598 ! ! ! ! ! - PI* c1_con*m_mean * ( order2*rho2*I2_rk + ord2_rk*I2 ) &
599 ! ! ! ! ! - PI* ( c1_con*m_rk(k) + c1_rk*m_mean ) * order2*rho2*I2
600 ! ! ! ! !
601 ! ! ! ! ! f_disp(ii) = -2.0 * PI * rhop_wd_sum * I1 * order1 & !hier * rho_wd_sum, bei Elmar/rho_wd_sum, da in order1 bei Elmar mit rhoi, hier mit xi!!
602 ! ! ! ! ! -PI * rhop_wd_sum * c1_con * m_mean * I2 * order2
603 ! ! ! ! !
604 ! ! ! ! ! df_disp_drk(ii,k) = ( my_disp(ii,k) - f_disp(ii) ) / rhop_wd_sum
605 ! ! ! ! !
606 ! ! ! ! ! End Do
607 ! ! ! ! !
608 ! ! ! ! ! End Do
609 ! ! !
610 ! ! !
611 ! ! ! End Subroutine DISP_mu
612 ! ! !
613 ! ! !
614 ! ! !
615 ! ! ! Subroutine DISP_dFdrho_wda(ii,rhop,rhop_wd,my_disp,f_disp,df_disp_drk,dF_drho_disp,user)
616 ! ! !
617 ! ! ! Use PetscManagement
618 ! ! !
619 ! ! ! Use BASIC_VARIABLES, Only: ncomp
620 ! ! ! Use mod_DFT, Only: zp,dzp,fa_disp,ab_disp
621 ! ! !
622 ! ! ! Implicit None
623 ! ! ! #include <finclude/petscsys.h>
624 ! ! !
625 ! ! ! !passed
626 ! ! ! INTEGER, INTENT(IN) :: ii
627 ! ! ! Type (userctx) :: user
628 ! ! ! PetscScalar :: rhop(ncomp,user%gxs:user%gxe)
629 ! ! ! REAL, INTENT(IN) :: rhop_wd(user%gxs:user%gxe,ncomp)
630 ! ! ! REAL, INTENT(IN) :: my_disp(user%gxs:user%gxe,ncomp) !chemPot_disp / kT
631 ! ! ! REAL, INTENT(IN) :: f_disp(user%gxs:user%gxe) !F_disp / NkT
632 ! ! ! REAL, INTENT(IN) :: df_disp_drk(user%gxs:user%gxe,ncomp) ! d(F/NkT) / drho_k = (mu/kT - F_disp / NkT)/rho
633 ! ! ! REAL, INTENT(OUT) :: dF_drho_disp(ncomp)
634 ! ! !
635 ! ! ! ! ! !local
636 ! ! ! ! ! INTEGER :: n,icomp,jj
637 ! ! ! ! ! REAL :: zmin,zz,dz
638 ! ! ! ! ! INTEGER, parameter :: NMAX = 800
639 ! ! ! ! ! REAL :: x_int(NMAX), y_int(NMAX), y2(NMAX)
640 ! ! ! ! ! REAL :: xhi,xlo,int2
641 ! ! ! ! ! REAL :: rhop_sum
642 ! ! ! ! !
643 ! ! ! ! ! zmin = 1d-6
644 ! ! ! ! ! DO icomp = 1, ncomp
645 ! ! ! ! ! n = 1
646 ! ! ! ! ! x_int = 0.0
647 ! ! ! ! ! y_int = 0.0
648 ! ! ! ! !
649 ! ! ! ! ! DO jj = (ii-fa_disp(icomp)), (ii+fa_disp(icomp))
650 ! ! ! ! !
651 ! ! ! ! ! !IF ( zp(jj+1) > (zl+zmin) ) THEN
652 ! ! ! ! ! If( ( zp(ii)-zp(jj+1) ) < ab_disp(icomp) .and. ( zp(ii) - zp(jj) ) >= ab_disp(icomp) ) Then !the position of j+1 is already within i-d/2 while j is still outside this range in this case, the integration steplength (dz) is just the distance, which j+1 overlaps with i-d/2 and what is integrated is the interpolated value of the integrand
653 ! ! ! ! !
654 ! ! ! ! ! If(n/= 1) stop 'n /=1 in DISP_Weighted_Densities' !here always n=1!
655 ! ! ! ! ! zz = zp(jj) - zp(ii) !distance between grid points j and i
656 ! ! ! ! ! dz = zp(jj+1) - (zp(ii) - ab_disp(icomp)) !the part of the intervall between zp(j) and zp(j+1) which is already within i-d/2
657 ! ! ! ! ! !if(dz < epsilon(dz)) dz = epsilon(dz) !bei unguenstiger Kombination von sig und ngrid kann dz unter Machinengenauigkeit epsilon liegen, dann ist x(2) = x(1) + dz = x(1) -> das fuehrt zu Abbruch in Spline Interpolation
658 ! ! ! ! ! x_int(n) = 0.0 !array containing x-values for spline integration
659 ! ! ! ! ! y_int(n) = 0.0
660 ! ! ! ! !
661 ! ! ! ! ! Else If (zp(jj) > (zp(ii)-ab_disp(icomp)) .and. zp(jj) <= (zp(ii)+ab_disp(icomp))) Then !grid point j within i+-d2
662 ! ! ! ! !
663 ! ! ! ! ! n = n + 1
664 ! ! ! ! ! x_int(n) = x_int(n-1) + dz !first time in this If condition, dz is stil the old value from above!
665 ! ! ! ! ! zz = zp(jj) - zp(ii)
666 ! ! ! ! ! dz = dzp
667 ! ! ! ! ! y_int(n) = my_disp(jj,icomp) * (ab_disp(icomp)*ab_disp(icomp) - zz*zz )
668 ! ! ! ! !
669 ! ! ! ! ! !rhop_sum = sum(rhop(1:ncomp,jj))
670 ! ! ! ! ! !y_int(n) = rhop_sum * df_disp_drk(jj,icomp) * (ab_disp(icomp)*ab_disp(icomp) - zz*zz)
671 ! ! ! ! !
672 ! ! ! ! ! If (zp(jj) < (zp(ii)+ab_disp(icomp)) .and. zp(jj+1) >= (zp(ii)+ab_disp(icomp)) ) Then !zp(j) is still within zp(i)+d2 but zp(j+1) is already outside zp(i)+d2
673 ! ! ! ! ! dz = zp(ii) + ab_disp(icomp) - zp(jj)
674 ! ! ! ! ! !If(dz <= epsilon(dz)) exit !wie oben, kann auch hier bei ungluecklicher Wahl von sig und ngrid dz < eps werden und somit x(n) = x(n-1) -> Abbruch in Spline interpolation. Dann einfach ngrid aendern!
675 ! ! ! ! ! zz = zp(jj) - zp(ii)
676 ! ! ! ! ! n = n + 1
677 ! ! ! ! ! x_int(n) = x_int(n-1) + dz
678 ! ! ! ! ! y_int(n) = 0.0
679 ! ! ! ! !
680 ! ! ! ! ! End If
681 ! ! ! ! ! End If
682 ! ! ! ! ! END DO
683 ! ! ! ! ! xlo = x_int(1)
684 ! ! ! ! ! xhi = x_int(n)
685 ! ! ! ! !
686 ! ! ! ! ! If(n > NMAX) stop 'Increase NMAX in DISP_dFdrho_wda (auch in AD Routine!!)'
687 ! ! ! ! !
688 ! ! ! ! ! CALL spline ( x_int(1:n), y_int(1:n), n, 1.E30, 1.E30, y2(1:n) )
689 ! ! ! ! ! CALL splint_integral( x_int(1:n), y_int(1:n), y2(1:n), n, xlo, xhi, int2 )
690 ! ! ! ! !
691 ! ! ! ! ! dF_drho_disp(icomp) = int2 * 0.75 / ab_disp(icomp)**3
692 ! ! ! ! ! !dF_drho_disp(icomp) = int2 * 0.75 / ab_disp(icomp)**3 + f_disp(ii)
693 ! ! ! ! ! END DO
694 ! ! ! ! !
695 ! ! !
696 ! ! ! End Subroutine DISP_dFdrho_wda
697 ! ! !
698 
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains constant...
Definition: modules.f90:6
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
Definition: modules.f90:200
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
Definition: modules.f90:120
In this module, the application context is defined.
Definition: mod_PETSc.F90:7
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
Definition: modules.f90:29