1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
| module Partage
implicit none
integer, parameter :: nbniv=220 !nb total de niveaux dans le modele CR
integer, parameter :: nfreq=3000
real, dimension(nbniv) :: ener,g
integer, dimension(nbniv) :: n,charge,nlast,llast,nel_eq
real, dimension(nbniv,nbniv) :: a
end module Partage
program main
use Partage
implicit none
real, dimension(nbniv,nbniv) :: a,c,s,rrad,t
real, dimension(nbniv-1,nbniv-1) :: q
real, dimension(nbniv-1) :: y
real, dimension(nbniv) :: pop,boltz
integer, dimension(3) :: i0_ion
integer, dimension(10) :: aa, bb
real, dimension(10) :: corr_ener
real :: eji,eij,fij,gaunt,te,Ne,x,exi1,vac,d,tps
real :: s0,s1,zmoy,rap,tex,aux,poptot0,popi0,potion,lambda,zrad,deg
real :: hnumin,hnumax,pas,hplanck,clum,celec, aij, eV,corr,grnd,temp,densi
integer :: k,i,j,i0,N_noy,kion,nb_niv,ii,jj,i_CR,iraie,ios,val,choix,choix2,Z
real, dimension(:,:), allocatable :: mat
real, parameter :: ryd=13.605804
integer, dimension(nbniv-1) :: indx
real (kind (0D0)) :: tt,xx
character tex1*2,tex2*5,tex3*8,tex4*7,tex5*12,tex6*16,tex7*16,tex8*6
real, dimension(nfreq) :: hnu,em,londe,intens
! ==========================================================
! Donnees:
celec=1.6022e-19
hplanck=6.6261e-34
clum=3.e8
grnd=6593.03515625
! ==========================================================
print*, 'Choisissez votre configuration : Modèle CR (1) / Forcer l''''ETL (2)'
read(*,*) choix
!============================================================================================================
! SECTION DES LECTURE DES DATAS AIJ ET ENERJ DES NIVEAUX
!============================================================================================================
! Lecture des donnees des energies:
open(14,file='Al1_ener_D',form='formatted',position='rewind',status='unknown')
read(14,'(a2,i3,a5,i3,a8,f12.5,a7)')tex1,N_noy,tex2,kion,tex3,potion,tex4
read(14,'(i4)')nb_niv
do i=1,nb_niv
i_CR=i_CR+1
read(14,'(2i4,f15.8,f16.1,3i4)') ii,jj,ener(i_CR),g(i_CR),nlast(i_CR),llast(i_CR),nel_eq(i_CR)
!print*, ener(i_CR)
!print*,corr_ener(i_CR),ener(i_CR)
!pause
charge(i_CR)=0
enddo
!
! Lecture des taux de transitions radiatives:
3 open(114,file='Al1_trad_D',form='formatted',position='rewind',status='unknown')
read(114,'(a2,i3,a5,i3)')tex1,N_noy,tex2,kion
1 read(114,'(2i4,2e14.5)',end=2)ii,jj,zrad,lambda
! zrad taux entre ii et jj en s-1, lambda, l.o. en angstrom
if (choix==1 .or. choix==3) then
a(ii,jj)=zrad
else
a(ii,jj)=0.
endif
goto 1
2 continue
close(114)
if (choix==3) then
goto 56
endif
!
! ion suivant:
i0_ion(2)=nb_niv+1
!
! Lecture des donnees des energies:
open(15,file='Al2_ener_D',form='formatted',position='rewind',status='unknown')
read(15,'(a2,i3,a5,i3,a8,f12.5,a7)')tex1,N_noy,tex2,kion,tex3,potion,tex4
read(15,'(i4)')nb_niv
do i=1,nb_niv
i_CR=i_CR+1
read(15,'(2i4,f15.8,f16.1,3i4)') ii,jj,ener(i_CR),g(i_CR),nlast(i_CR),llast(i_CR),nel_eq(i_CR)
charge(i_CR)=1
enddo
close(15)
!
! Lecture des taux de transitions radiatives:
90 open(115,file='Al2_trad_D',form='formatted',position='rewind',status='unknown')
read(115,'(a2,i3,a5,i3)')tex1,N_noy,tex2,kion
88 read(115,'(2i4,2e14.5)',end=89)ii,jj,zrad,lambda
! zrad taux entre ii et jj en s-1, lambda, l.o. en angstrom
! print *,ii,jj,zrad,lambda
if (choix==1 .or. choix==3) then
a(ii+i0_ion(2)-1,jj+i0_ion(2)-1)=zrad
else
a(ii+i0_ion(2)-1,jj+i0_ion(2)-1)=0.
endif
goto 88
89 continue
close(115)
if (choix==3) then
goto 57
endif
!
! ion suivant:
i0_ion(3)=i0_ion(2)+nb_niv
!
open(16,file='Al3_ener_D',form='formatted',position='rewind',status='unknown')
read(16,'(a2,i3,a5,i3,a8,f12.5,a7)')tex1,N_noy,tex2,kion,tex3,potion,tex4
read(16,'(i4)')nb_niv
do i=1,nb_niv
i_CR=i_CR+1
read(16,'(2i4,f15.8,f16.1,3i4)') ii,jj,ener(i_CR),g(i_CR),nlast(i_CR),llast(i_CR),nel_eq(i_CR)
charge(i_CR)=2
enddo
if (choix2==1) then
open (68,file='boltzmann_plot_general_alu',status='old')
do i=1,nbniv
boltz(i)=log(pop(i)/g(i))
write (68,'(F30.5,F10.5)') ener(i), boltz(i)
enddo
endif
close(68)
!===============================================================================================================
!
!===============================================================================================================
ios=0.
val=0.
open(10,file='donnes_LIBS_clair',form='formatted',status='unknown')
read(10,'(a14,a15,a14)') tex6,tex7,tex8
do while (ios==0)
read(10,'(e16.7,e16.7,e16.7)',iostat=ios)tps,temp,densi
val=val+1
enddo
close(10)
open(10,file='donnes_LIBS_clair',form='formatted',status='unknown')
read(10,'(a14,a15,a14)') tex6,tex7,tex8
do Z=1,val
read(10,'(e16.7,e16.7,e16.7)',iostat=ios) tps,densi,temp
if (Z==1) then
call modstat(temp,densi,choix,pop,poptot0)
!pause
else
call modnonstat(temp,densi,choix,pop,poptot0)
!pause
endif
enddo
close(10)
print *, 'Extraire un Boltzmann plot general ? (1) Oui / (2) Non'
read(*,*) choix2
if (choix2==2) stop
i_CR=0
i0_ion(1)=1 !indice du premier niveau dans un ion
a=0.0 ; c=0.0 ; s=0.0 ; rrad=0.0 ; t=0.0
!============================================================
! CALCUL DES EMISSIVITES DES RAIES (SPECTRE)
!============================================================
hnumin=1.8 ; hnumax=6.2 !eV borne min=700 nm//borne max=200nm
pas=(hnumax-hnumin)/float(nfreq-1)
em=0.0
intens=0.0
if(choix == 2) then
choix=3
goto 3
56 goto 90
57 continue
endif
!
! contribution de toutes les transitions radiatives:
open(09,file='Al_ener_D_corr',form='formatted',status='unknown')
read(09,'(a11)') tex5
aa=0.
bb=0.
corr_ener=0.
do i=1,10
read(09,'(i4,i2,f11.8)') ii, jj, corr
aa(i)=ii
bb(i)=jj
corr_ener(i)=corr
enddo
close (09)
open(30,file='spectre_alu_pour_boltzplotLIBS',status='old')
do i=1,nbniv
do j=1,i-1
val=0.
do k=1,10
if (i .ne. aa(k)) then
cycle
else
if (j .ne. bb(k)) then
cycle
else
eij=ener(i)-ener(j)+corr_ener(k)
! print*, aa(k), bb(k), corr_ener(k), eij
! pause
endif
endif
val=val+1.
enddo
if (val==0) then
eij=ener(i)-ener(j) !! pas forcement superieur à 0 !
endif
iraie=int(((eij-hnumin)/pas))+1
if(iraie<0.or.iraie>nfreq) cycle
! if (eij<0) pause
em(iraie)=em(iraie)+pop(i)*a(i,j)*eij
intens(iraie)=intens(iraie)+pop(i)*a(i,j)
write(30,'(F15.10,F40.4)') ener(i)+grnd,intens(iraie)
write(26,'(F8.5,F40.4)') ((iraie-1)*pas)+hnumin, a(i,j)
enddo
enddo
close(26)
close(30)
do i=1,nfreq
hnu(i)=hnumin+(i-1)*pas
londe(i)=((hplanck*clum)/(hnu(i)*celec))*1e9
enddo
!=============================================================
! ECRITURE DU SPECTRE
!=============================================================
open(25,file='spectre_alu',status='old')
do i=1,nfreq
write(25,'(F15.10,F40.4)') londe(i),em(i)
enddo
close(25)
!=============================================================
! CLASSEMENT DE LA MATRICE DE FORT.26
!=============================================================
open(26,file='fort.26',form='formatted',status='old')
ios=0.
val=0.
do while (ios==0)
read(26,'(F15.5,F40.4)',iostat=ios) eV, aij
val=val+1
enddo
allocate (mat(val,2))
close(26)
open(26,file='fort.26',form='formatted',status='old')
do i=1,val
read(26,'(F15.5,F40.4)',iostat=ios) mat(i,1), mat(i,2)
enddo
close (26)
call tri_mat(mat,val,2)
do i=1,val
write(26,'(F8.5,F40.4)') mat(i,1), mat(i,2)
enddo
!
!============================================================
! FIN DU PROGRAMME PRINCIPAL
!============================================================
CONTAINS
subroutine tri_mat(mat,n,m)
implicit none
integer :: n,m
real, dimension(n,m) :: mat
integer :: ligne
!=========================================
call tri_vecteur(mat,n)
end subroutine tri_mat
subroutine tri_vecteur(v,n)
implicit none
integer :: n,i
real, dimension(n,2) :: v
logical :: tri_termine
do
tri_termine=.true.
do i=2,n
if (v(i,1) < v(i-1,1)) then
tri_termine = .false.
v(i-1:i,1)=v(i:i-1:-1,1)
v(i-1:i,2)=v(i:i-1:-1,2)
endif
enddo
if (tri_termine) exit
enddo
end subroutine tri_vecteur
end program main |
Partager