Module MPR03_INOUT ! USE MTD_STRUCT ! Implicit None ! PRIVATE PUBLIC :: WRITESTRUCT, READSTRUCT, DISPSTRUCT ! Interface READSTRUCT Module Procedure LEVELS_READSTRUCT, LINES_READSTRUCT, PHOTOIONS_READSTRUCT, INDEXLINES_READSTRUCT End Interface READSTRUCT ! Interface WRITESTRUCT Module Procedure TEMP_WRITESTRUCT, OUT_WRITESTRUCT End Interface WRITESTRUCT ! Integer :: ios, er, I, J ! Variable de contrôle dans les affectations dynamiques de mémoire ! CONTAINS ! !-------------------------------------------------------------------- ! ECRITURE DES STRUCTURES DE DONNEES !-------------------------------------------------------------------- ! Subroutine TEMP_WRITESTRUCT(Vfmt, Vname, Vinfo, S1, S2, S3, S4) ! DONNEES BRUTES ! S1 : Structure des niveaux de NIST ! S2 : Structure des niveaux de la TOPBASE ! S3 : Structure des transitions de KURUCZ ! S4 : Structure des tables de photoionisation de la TOPBASE ! Vfmt : Vecteur de format d'écriture des structures ! Vname : Vecteur de noms de fichiers à écrire ! Vinfo : Vecteur des infos des fichiers à écrire ! Type(LEVELS), dimension(:), intent(in) :: S1 Type(LEVELS), dimension(:), intent(in) :: S2 Type(LINES), dimension(:), intent(in) :: S3 Type(PHOTOIONS), dimension(:), intent(in) :: S4 Character(len = *), dimension(:), intent(in) :: Vfmt, Vname,Vinfo ! Integer :: N1, N2, N3, N4 Integer :: I, J, K, unite ! N1 = size(S1) N2 = size(S2) N3 = size(S3) N4 = size(S4) ! !Ecriture des fichiers ! O1: Do I = 1, 5 unite = 10 * I Open(unite, file = Vname(I), status = 'replace', action = 'write', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-00." Write(unite, '(A)', iostat = ios) Trim(Vinfo(1)) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-01." If (I == 1 .OR. I == 3) Write(unite, '(A)') "Energy levels with respect to the ground state" If (I == 2 .OR. I == 4 .OR. I == 5) Write(unite, '(A)') "Energy levels with respect to the ionization level" If (I == 1) Write(unite, '(A, I4, /, A)', iostat = ios) 'Number of NIST energy levels: ', N1, Trim(Vinfo(2)) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-02." If (I == 2) Write(unite, '(A, I4, /, A)', iostat = ios) 'Number of TOPBASE energy levels: ', N2, Trim(Vinfo(3)) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-03." If (I == 3) Write(unite, '(A, I5, /, A)', iostat = ios) 'Number of transitions from KALD/VALD: ', N3, Trim(Vinfo(4)) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-04." If (I == 4) Write(unite, '(A, I4, /, A)', iostat = ios) 'Photoionisations from TOPBASE: ', N4, Trim(Vinfo(5)) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-05." If (I == 5) Write(unite, '(A, I4, /, A)', iostat = ios) 'Photoionisations from TOPBASE: ', N4, Trim(Vinfo(5)) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-06." ! J = 1 ! O2: Do ! If (I == 1) Then Write(unite, Vfmt(I), iostat = ios) J, S1(J) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-07." IF (J == N1) EXIT O2 End If ! If (I == 2) Then Write(unite, Vfmt(I), iostat = ios) J, S2(J) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-08." IF (J == N2) EXIT O2 End If ! If (I == 3) Then Write(unite, Vfmt(I), iostat = ios) J, S3(J) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-09." IF (J==N3) EXIT O2 End If ! If (I == 4) Then Write(unite, Vfmt(I), iostat = ios) J, S4(J)%en_cm, S4(J)%en_Ryd, S4(J)%term, S4(J)%N IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-10." ! If (S4(J)%N /= 0) Then Write(unite, '(ES12.5,ES10.3)', iostat = ios) (S4(J)%en_tab(K), S4(J)%seff_tab(K), K = 1, S4(J)%N) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE TEMP_WRITESTRUCT: PB-11." End If ! If (J == N4) EXIT O2 End If ! If (I == 5) Then Write(unite,Vfmt(I), iostat = ios) J, S4(J)%en_cm, S4(J)%en_Ryd, S4(J)%term, S4(J)%N If (J == N4) EXIT O2 End If ! J = J + 1 ! End Do O2 ! Close(unite) ! End Do O1 ! End Subroutine TEMP_WRITESTRUCT ! !-------------------------------------------------------------------- ! Subroutine OUT_WRITESTRUCT(Vfmt, Vname, Vinfo, S1, S2, S3, S4) ! DONNEES SELECTIONNEES ! S1 : Structure des niveaux d'énergie sélectionnées ! S2 : Structure des transitions sélectionnées ! S3 : Structure des transitions indexées sélectionnées ! S4 : Structure des tables de photoionisation ! Vfmt : Vecteur de format d'écriture des structures ! Vname : Vecteur de noms de fichiers à écrire ! Vinfo : Vecteur des infos des fichiers à écrire ! Type(LEVELS), dimension(:), optional, intent(in) :: S1 Type(LINES), dimension(:), optional, intent(in) :: S2 Type(INDEXLINES), dimension(:), optional, intent(in) :: S3 Type(PHOTOIONS), dimension(:), optional, intent(in) :: S4 Character(len = *), dimension(:), intent(in) :: Vfmt, Vname, Vinfo ! Integer :: N1, N2, N3, N4 Integer :: I, J ! If (Present(S1)) Then N1 = Size(S1) Open(unit = 10, file = Vname(1), status = 'replace', action = 'write', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-00." ! Write(10, '(A,/,A)') Vinfo(1), Vinfo(2) ! Do I = 1, N1 Write(10, Vfmt(1), iostat = ios) I, S1(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-01." End Do ! Close(10) End If ! If (Present(S2)) Then N2 = Size(S2) Open(unit = 10, file = Vname(2), status = 'replace', action = 'write', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-00." ! Write(10, '(A,/,A)') Vinfo(1), Vinfo(3) ! Do I = 1, N2 Write(10, Vfmt(2), iostat = ios) I, S2(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-02." End Do ! Close(10) ! End If ! If (Present(S3)) Then N3 = Size(S3) Open(unit = 10, file = Vname(3), status = 'replace', action = 'write', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-00." ! Write(10, '(A,/,A)') Vinfo(1), Vinfo(4) ! Do I = 1, N3 Write(10, Vfmt(3), iostat = ios) I, S3(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-03." End Do ! Close(10) ! End If ! If (Present(S4)) Then N4 = Size(S4) Open(unit = 10, file = Vname(4), status = 'replace', action = 'write', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-00." ! Write(10, '(A,/,A)') Vinfo(1), Vinfo(5) ! Do I = 1, N4 Write(10, Vfmt(4), iostat = ios) I, S4(I)%en_cm, S4(I)%en_Ryd, S4(I)%term, S4(I)%N IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-04." Write(10, '(4(F10.3, ES10.3))', iostat = ios) (S4(I)%en_tab(J), S4(I)%seff_tab(J), J = 1, S4(I)%N) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-05." End Do ! Close(10) ! Open(unit = 10, file = Vname(5), status = 'replace', action = 'write', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-00." ! Write(10, '(A,/,A)') Vinfo(1), Vinfo(5) ! Do I = 1, N4 Write(10, Vfmt(5), iostat = ios) I, S4(I)%en_cm, S4(I)%en_Ryd, S4(I)%term, S4(I)%N IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE OUT_WRITESTRUCT: PB-06." End Do ! Close(10) ! End If ! End Subroutine OUT_WRITESTRUCT ! !-------------------------------------------------------------------- ! LECTURE DES STRUCTURES DE DONNEES BRUTES !-------------------------------------------------------------------- ! Subroutine LEVELS_READSTRUCT(f, N, fmtf, S) ! f : Nom du fichier à lire ! N : taille de la structure ! fmtf : format de lecture des données ! S : structure à laquelle on veut affecter les valeurs lues dans f ! Type(LEVELS), dimension(:), intent(out) :: S Integer, intent(in) :: N Character(len = *), intent(in) :: f, fmtf ! Open(10, file = f, status = 'old', action = 'read', position = 'rewind', form = 'formatted', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE LEVELS_READSTRUCT: PB-00." ! Read(10, fmt = '(3/)', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE LEVELS_READSTRUCT: PB-01." ! Do I = 1, N Read(10, fmt = fmtf, iostat = ios) J, S(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE LEVELS_READSTRUCT: PB-02." End Do ! Close(10) ! End Subroutine LEVELS_READSTRUCT ! !-------------------------------------------------------------------- ! Subroutine LINES_READSTRUCT(f, N, fmtf, S) ! f : Nom du fichier à lire ! N : taille de la structure ! fmtf : format de lecture des données ! S : structure à laquelle on veut affecter les valeurs lues dans f ! Type(LINES), dimension(:), intent(out) :: S Integer, intent(in) :: N Character(len = *), intent(in) :: f, fmtf ! Logical :: BLABLA = .FALSE. ! Open(10, file = f, status = 'old', action = 'read', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE LINES_READSTRUCT: PB-00." ! Read(10, fmt = '(3/)', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE LINES_READSTRUCT: PB-01." ! Do I = 1, N Read(10, fmt = fmtf, iostat = ios) J, S(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE LINES_READSTRUCT: PB-02." IF (BLABLA) Write(*, *) "J, S(I) =", J, S(I) End Do ! Close(10) ! End Subroutine LINES_READSTRUCT ! !-------------------------------------------------------------------- ! Subroutine PHOTOIONS_READSTRUCT(f, N, fmtf, S) ! f : Nom du fichier à lire ! N : taille de la structure ! fmtf : format de lecture des données ! S : structure à laquelle on veut affecter les valeurs lues dans f ! Type(PHOTOIONS), dimension(:), intent(out) :: S Integer, intent(in) :: N Character(len = *), intent(in) :: f, fmtf ! Integer :: term, N_temp ! Nombre de sections efficaces correspondant au niveau Double precision :: en_cm, en_Ryd Real :: en_temp, seff_temp ! Open(10, file = f, status = 'old', action = 'read', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE PHOTOIONS_READSTRUCT: PB-00." ! Read(10, fmt = '(3/)', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE PHOTOIONS_READSTRUCT: PB-01." ! Do I = 1, N Read(10, fmt = fmtf, iostat = ios) J, en_cm, en_Ryd, term, N_temp IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE PHOTOIONS_READSTRUCT: PB-02." ! If (N_temp /= 0) Then ! Do J = 1, N_temp Read(10, '(ES12.5,ES10.3)', iostat = ios) en_temp,seff_temp IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE PHOTOIONS_READSTRUCT: PB-03." S(I)%en_tab(J) = en_temp S(I)%seff_tab(J) = seff_temp End Do ! End If ! S(I)%en_cm = en_cm S(I)%en_Ryd = en_Ryd S(I)%term = term S(I)%N = N_temp ! End Do ! Close(10) ! End Subroutine PHOTOIONS_READSTRUCT ! !-------------------------------------------------------------------- ! Subroutine INDEXLINES_READSTRUCT(f,N,fmtf,S) ! f : Nom du fichier à lire ! N : taille de la structure ! fmtf : format de lecture des données ! S : structure à laquelle on veut affecter les valeurs lues dans f ! Integer, intent(in) :: N Character(len = *), intent(in) :: f, fmtf Type(INDEXLINES), dimension(:), intent(out) :: S ! Open(10, file = f, status = 'old', action = 'read', position = 'rewind', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE INDEXLINES_READSTRUCT: PB-00." ! Read(10, fmt = '(5/)', iostat = ios) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE INDEXLINES_READSTRUCT: PB-01." ! Do I = 1, N Read(10, fmt = fmtf, iostat = ios) J, S(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE INDEXLINES_READSTRUCT: PB-02." End Do ! Close(10) ! End Subroutine INDEXLINES_READSTRUCT ! !-------------------------------------------------------------------- ! AFFICHAGE A L'ECRAN DES DONNEES LUES DANS LE REPERTOIRE TEMP !-------------------------------------------------------------------- ! Subroutine DISPSTRUCT(S1, S2, S3, S4, Vfmt, Vinfo) ! S1 : Structure des niveaux d'énergie de NIST ! S2 : Structure de niveaux de la TOPBASE ! S3 : Structure de transitions de KURUCZ ! S4 : Structure de tables de photoionisation de la TOPBASE ! Vfmt : Vecteur des formats d'affichages ! Vinfo : Vecteur des infos à afficher ! Type(LEVELS), dimension(:), intent(in) :: S1, S2 Type(LINES), dimension(:), intent(in) :: S3 Type(PHOTOIONS), dimension(:), intent(in) :: S4 Character(len = *), dimension(:), intent(in) :: Vfmt, Vinfo ! Integer :: N1, N2, N3, N4, pas ! N1 = Size(S1) N2 = Size(S2) N3 = Size(S3) N4 = Size(S4) pas = 1 ! !Affiche la structure des niveaux fournis par NIST ! IF (N1 > 200) pas = 10 Write(*, Vfmt(1), iostat = ios) 'Tableau des niveaux fournis par NIST (', N1, ' niveaux, pas = ', pas, ')' IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-00." ! Do I = 1, N1, pas Write(*, Vfmt(2), iostat = ios) I, S1(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-01." End Do ! Write(*, *) Vinfo(2) ! !Affiche la structure des niveaux fournis par TOPBASE ! pas = 1 Write(*, Vfmt(1), iostat = ios) 'Tableau des niveaux fournis pas la TOPBASE (', N2, ' niveaux, pas = ', pas, ')' IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-02." ! Do I = 1, N2 Write(*, Vfmt(2), iostat = ios) I, S2(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-03." End Do ! Write(*, *) Vinfo(2) ! !Affiche la structure des transitions fournies par KURUCZ/VALD ! IF (N3 < 1000) pas = 10 IF (N3 >= 1000) pas = 50 Write(*, Vfmt(1), iostat = ios) 'Tableau des transitions fournis par KURUCZ / VALD (', N3, ' transitions, pas =', pas, ')' IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-04." ! Do I = 1, N3, pas Write(*, Vfmt(3), iostat = ios) I, S3(I) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-05." End Do ! Write(*, *) Vinfo(3) ! !Affiche la structure des tables de photoionisation de la TOPBASE ! Write(*, Vfmt(1), iostat = ios) 'Tables de photoionisation fournies par la TOPBASE (', N4, ' tables, ', & & Int(Sum(S4%N)/N4), ' lignes en moyenne)' IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-06." ! Do I = 1, N4 Write(*, Vfmt(4), iostat = ios) I, S4(I)%en_cm, S4(I)%en_Ryd, S4(I)%term, S4(I)%N IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-07." ! If (S4(I)%N /= 0) then Write(*, '(4(ES13.6,1x,ES10.3))', iostat = ios) (/ (S4(I)%en_tab(J), S4(I)%seff_tab(J), J = 1, Int(S4(I)%N / 100)) /) IF (ios /= 0) STOP "In MPR03_INOUT, SUBROUTINE DISPSTRUCT: PB-08." End If ! ! Do J = 1, S4(I)%N ! Write(*, '(ES13.6,1x,ES10.3)')S4(I)%en_tab(J), S4(I)%seff_tab(J) ! End Do ! End Do ! Write(*, *) Vinfo(4) ! End Subroutine DISPSTRUCT ! End Module MPR03_INOUT