Module MPR01_SPARSE ! USE MTD_STRUCT ! Implicit None ! PRIVATE PUBLIC :: SPARSING, SPARSINGF1, SPARSINGF2, SPARSINGF3, SPARSINGF4 ! Integer :: ios ! Variable de contrôle dans les opérations d'E/S Character(len = 300) :: line ! Enregistrement d'une ligne d'un fichier ! CONTAINS ! !-------------------------------------------------------------------- ! ANALYSE LEXICALE D'UN FICHIER !-------------------------------------------------------------------- ! Integer Function SPARSING(f) ! Fonction qui retourne la taille du fichier f de structure (sans les lignes de commentaires) ! ni les tableaux de photoionisations ! Integer :: pos1, pos2 Character(len = *) :: f Logical, parameter :: BLABLA = .FALSE. ! SPARSING = 0 ! Open(100, file = f, status = 'old', action = 'read', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "IN MODULE MPR01_SPARSE, FUNCTION SPARSING: PB-00." ! B1: Do While (ios == 0) Read(100, '(A)', iostat = ios) line IF (ios > 0) STOP "IN MODULE MPR01_SPARSE, FUNCTION SPARSING: PB-01." ! ! Cas des tables de photoionisation, on lit le nombre de niveaux en ligne 3 du fichier ! !0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 !1 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 ! ! pos1 pos2 ! | | !Photoionisations fournies par TOPBASE : 136 ! If (Index(line, 'Photoionisation') /= 0) Then pos2 = scan(line, '1234567890', back=.TRUE.) !pos2 = 44 pos1 = scan(line, '1234567890') !pos1 = 42 Read(line(pos1:pos2), '(I3.3)', iostat = ios) SPARSING IF (ios /= 0) STOP "IN MODULE MPR01_SPARSE, FUNCTION SPARSING: PB-02." IF(BLABLA) Write(*, *) 'line(pos1:pos2), SPARSING : ', line(pos1:pos2), SPARSING SPARSING = SPARSING + 5 EXIT B1 End If SPARSING = SPARSING + 1 End Do B1 ! ! 4 lignes de commentaires au début des fichiers écrit par out1struct ! SPARSING = SPARSING - 5 ! Close(100) ! End Function SPARSING ! !-------------------------------------------------------------------- ! ANALYSE LEXICALE DU FICHIER DES NIVEAUX DE NIST !-------------------------------------------------------------------- ! Subroutine SPARSINGF1(f1, NN1, N1in, N1out, sep) ! ! f1 : Nom du fichier à analyser (ex : MgI_levels_NIST.dat) ! NN1 : Nombre de niveaux brut de NIST ! N1in : Position du début du tableau dans le fichier f1 ! N1out : Position de la fin du tableau dans le fichier f1 ! sep : Vecteur de séparateur des champs ! Character(len = *), intent(in) :: f1 Integer, intent(out) :: NN1,N1in,N1out Integer, dimension(:), intent(out) :: sep ! !Compteurs de lignes : fichier, étranges, théoriques, vides, séparatrices ! Integer :: I, J, K, L, M Integer :: pos1, pos2, pos3, pos33, pos4 Integer :: NN0 Character(len=2) :: CSymbol Character(len=4) :: CIon Logical :: l1, l2, l3 Logical, parameter :: BLABLA = .FALSE. ! !Initialisations ! I = 0; J = 0; K = 0; L = 0; M = 0 pos1 = 0; pos2 = 0; pos3 = 0; pos33 = 0; pos4 = 0 l1 = .TRUE.; l2 = .TRUE.; l3 = .TRUE. ! Write(*, *) 'Lecture du fichier ', f1 Open(10, file = f1, status = 'old', action = 'read', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF1: PB-00." ! B1: Do While (ios == 0) I = I + 1 Read(10, '(A)', iostat = ios) line IF (ios > 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF1: PB-01." ! !DETECTION DE L'ELEMENT, DE L'IONISATION ET DU NOMBRE DE NIVEAUX DONNES PAR NIST ! !0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 !1 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 ! !pos2 pos3 pos33 pos4 ! | | | | ! Mg I 323 Levels Found ! Mg II 149 Levels Found ! pos3 pos4 ! | | !
---------------------------------------------------------------------------------------------------------------------------------- ! Wl / nm Wavenumbers log_gf A-Value Element E_lower_lev. J Config. E_upper_lev. J Config. Gamma (Damping) !vac<200nm<air / cm^(-1) / 1/s (Name) / cm^(-1) lower lower / cm^(-1) upper upper R S W !---------------------------------------------------------------------------------------------------------------------------------- ! 162.1507 61685.068 -17.959 1.732e-11 Mg I 0.000 0.0 3s2 1S 61671.020 80.0 CONTINUUM 0.00 0.00 0.00 ! 162.1970 61667.460 -5.767 1.445e+03 Mg I 0.000 0.0 3s2 1S 61653.414 1.0 80p 1P 3.73 1.49 -5.15 ! !Transitions KURUCZ !------------------ If (Index(f3, 'KURUCZ') /= 0) Then IF (ios > 0 .OR. Index(line, '----------------') == 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF3: PB-01." Read(30, '(2(/))', iostat = ios) IF (ios>0.or.index(line,'----------------')==0) STOP 'IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF3: PB-02.' ! I = 4; NT = 0; N3in = I ! B31: Do While(ios == 0) I = I + 1 Read(30,fmt='(A)',iostat=ios) line IF (ios > 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF3: PB-03." ! !Teste si la ligne contient le terme CONTINUUM ! If (Index(line, 'CONTINUUM') /= 0) Then J = J + 1 CYCLE B31 End If ! !Teste la présence de lignes blanches ! IF (Trim(line) == '') CYCLE B31 ! !Teste si la ligne contient le symbole de l'élément ! If (l1 .AND. Index(line, S_0%Symbol) /= 0) Then NT = NT + 1 CYCLE B31 End If ! !Teste si la ligne est à la fin du tableau ! If (Index(line, 'Number of lines in output') /= 0) Then pos1 = scan(line, '0123456789') pos2 = scan(line, '0123456789', back = .TRUE.) Read(line(pos1:pos2), '(I6)', iostat = ios) NT0 IF (ios /= 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF3: PB-04." N3out = I - 1 l1 = .FALSE. CYCLE B31 End If ! !Teste si la ligne contient un autre symbole ! If (l1) Then K = K + 1 CYCLE B31 End If ! End Do B31 ! Write(*, *) '-----------------------------------------------' Write(*, *) 'Nombres de transitions fournies par KURUCZ : ', NT0 Write(*, *) 'Nombre de lignes dans le fichier : ', I-1 Write(*, *) 'Position du début du tableau : ', N3in Write(*, *) 'Position de la fin du tableau : ', N3out Write(*, *) 'Nombre de lignes étranges : ', J Write(*, *) 'Nombre de lignes concernant un autre élément : ', K Write(*, *) 'Nombre de transitions sélectionnées : ', NT Write(*, *) '-----------------------------------------------' ! End If ! ! Base de données VALD ! Lande factors Damping parameters !Elm Ion WL(A) log(gf) Exc. lo J lo Exc. up J up lower upper mean Rad. Stark Waals !'Mg 1', 1621.5070,-17.959, 0.0000, 0.0, 7.6460, 80.0,99.000,99.000,99.000, 0.000, 0.000, 0.000, <= line1 ! ' 3s2 1S CONT 1 1 1 1 1 1 1 1 1' <= line2 !'Mg 1', 1621.9700, -5.767, 0.0000, 0.0, 7.6440, 1.0,99.000,99.000,99.000, 3.730, 1.490,-5.150, <= line1 ! ' 3s2 1S 80p 1P K 1 1 1 1 1 1 1 1 1' <= line2 ! 1 ! Lande factors Damping parameters !Elm Ion WL(A) log(gf) E_low(eV) J lo E_up(eV) J up lower upper mean Rad. Stark Waals !'Ca 1', 1372.2880, -2.566, 0.0000, 0.0, 9.0350, 1.0, 0.000, 1.000, 1.000, 8.484,-4.619,-7.453, <= line1 !'4s2 1S 4p9d 1P 1 1 1 1 1 1 1 1 1' <= line2 ! !Transitions VALD !---------------- If (Index(f3, 'VALD') /= 0) Then IF (ios > 0 .OR. Index(line, 'Lande factors') == 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF3: PB-05." Read(30, '(A)', iostat = ios) line IF (ios > 0 .OR. Index(line, 'Elm') == 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF3: PB-06." ! I = 2; NT = 0; N3in = I ! B32: Do While(ios == 0) Read(30, '(A)', iostat = ios) line1 IF (ios /= 0) EXIT B32 ! I = I + 1 ! If (Index(line1, 'References') /= 0) Then Write(*, *) 'NT = ', NT, 'References' N3out = I-1 l1 = .FALSE. CYCLE B32 End If ! If (l1) Then ! Read(30,fmt='(A)',iostat=ios) line2 IF (ios > 0) EXIT B32 I = I + 1 ! IF(BLABLA) Read(*, *) ! If (Index(line2,'CONT') /= 0) Then J = J + 1 CYCLE B32 End If ! End If ! If (l1 .AND. Index(line1, S_0%Symbol) /= 0) Then NT = NT + 1 CYCLE B32 End If ! End Do B32 ! NT0 = NT + J ! Write(*, *) '-----------------------------------------------' Write(*, *) 'Nombres de transitions fournies par VALD : ', NT0 Write(*, *) 'Nombre de lignes dans le fichier : ', I-1 Write(*, *) 'Position du début du tableau : ', N3in Write(*, *) 'Position de la fin du tableau : ', N3out Write(*, *) 'Nombre de photoionisation : ', J Write(*, *) 'Nombre de transitions sélectionnées : ', NT Write(*, *) '-----------------------------------------------' ! End If ! Close(30) ! End Subroutine SPARSINGF3 ! !-------------------------------------------------------------------- ! ANALYSE LEXICALE DU FICHIER DES TABLES DE PHOTOIONISATION DE LA TOPBASE !-------------------------------------------------------------------- ! Subroutine SPARSINGF4(f4, NP, N4in, N4out) ! ! f4 : Nom du fichier à analyser ! NP : Nombre de tables de photoionisation brut de la TOPBASE ! N4in : Position du début du tableau dans le fichier f4 ! N4out : Position de la fin du tableau dans le fichier f4 ! Character(len = *), intent(in) :: f4 Integer, intent(out) :: NP, N4in, N4out ! Integer :: I, temp2 Character(len = 300) :: temp1 Logical :: l1 ! I = 0 l1 = .TRUE. ! Write(*, *) 'Lecture du fichier ',f4 Open(40, file = f4, status = 'old', action = 'read', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF4: PB-00." ! NP = 0 ! B4: Do While(ios == 0) I = I + 1 !Compteur de lignes du fichier Read(40, '(A)', iostat = ios) line IF (ios > 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF4: PB-01." ! !Détection du début du tableau ! If (l1 .AND. Index(line, '======') /= 0) Then Read(40, '(1/,A)', iostat = ios) line IF (ios > 0 .AND. Index(line, '======') == 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF4: PB-02." I = I + 2 N4in = I l1 = .FALSE. CYCLE B4 End If ! !Détection des tables ! If (.NOT.l1 .AND. Index(line, '======') == 0) Then Read(line(1:4), '(A)', iostat = ios) temp1 IF (ios /= 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF4: PB-03." ! If (Trim(temp1) == '') Then Read(line(1:8), '(I8)', iostat = ios) temp2 IF (ios /= 0) STOP "IN MODULE MPR01_SPARSE, SUBROUTINE SPARSINGF4: PB-04." ! If (temp2 == NP + 1) Then !Compte la table NP = NP + 1 CYCLE B4 End If ! End If ! End If ! !Détection de la fin du tableau ! IF (.NOT.l1 .AND. Index(line, '======') /= 0) EXIT B4 CYCLE B4 End Do B4 ! Close(40) ! N4out = I ! Write(*, *) '-----------------------------------------------' Write(*, *) 'Nb de tables de photoionisation de la TOPBASE : ', NP Write(*, *) 'Nombre de lignes dans le fichier : ', I Write(*, *) 'Position du début du tableau : ', N4in Write(*, *) 'Position de la fin du tableau : ', N4out Write(*, *) 'Nombre de tables sélectionnées : ', NP Write(*, *) '-----------------------------------------------' ! End Subroutine SPARSINGF4 ! End Module MPR01_SPARSE