Program FORMATO ! USE CONFIG USE DATAGRAPH, ONLY: Symb, Z_IONI USE MTD_STRUCT USE MPR01_SPARSE USE MPR02_COLLECT USE MPR03_INOUT USE MPR04_SELECT USE MPR05_GRAPH USE MPR06_ANALYZE USE MPR09_FUNCTIONS USE MPR07_COLLISIONS USE MPR11_CONSTRUCTATOM, ONLY: CONSTRUCTATOM ! Implicit None ! !---------DECLARATIONS----------------------------------------------- ! !DECLARATION DES VARIABLES INTERNES ! Integer :: I, J, pas, choix1 Integer :: N1in, N1out, N2in, N2out, N3in, N3out, N4in, N4out Integer, dimension(8) :: ITIME ! Variables de date et d'heure Integer, dimension(4) :: sep ! Vecteur pour le sparsing du fichier NIST Integer, dimension(:), allocatable :: Npt ! Nbre de pts pour chaque table de photoionistation Character(len = 100) :: fmt0, fmt1, fmt2, fmt3, fmt4, fmt5, fmt51 ! Formats d'affichage à l'écran Character(len = 150) :: info0, CDATE, CTIME Character(len = 150) :: info1, info2, info3, info4 Character(len = 34) :: fname_lines Character(len = 132) :: comment Character(len = 100), dimension(5) :: Vfmt, Vname Character(len = 150), dimension(5) :: Vinfo Character :: choix2 ! !VERSION DU CODE ! Character(len = 4), parameter :: version = "-1.1" Character(len = 150):: title ! !CHEMINS D'ACCES Character(len = 100) :: path_fig = './output/figures/' Character(len = 100) :: path_fig2 = './output/figures/grotrian/' Character(len = 100) :: name_fig_1 = 'Gro_levels' Character(len = 100) :: name_fig_2 = 'Gro_rad' Character(len = 100) :: name_fig_3 = 'Gro_select' Character(len = 100) :: name_fig_4 = 'Gro_col' Character(len = 100) :: name_fig_5 = 'Gro_rad_one' Character(len = 100) :: figure1, figure2, figure3, figure4, figure5 Character(len = 100) :: figureMg1, figureMg2, figureMg3 ! !DECLARATION DES STRUCTURES DE DONNEES BRUTES ! Integer :: N1, N2, NT, NP Type(LEVELS), dimension(:), allocatable :: S_levels_NIST, S_levels_TOPB,S_used_levels Type(LINES), dimension(:), allocatable :: S_lines_KURUCZ Type(PHOTOIONS), dimension(:), allocatable :: S_photoions_TOPB ! !DECLARATION DES STRUCTURES DE DONNEES TEMPORAIRES ! Integer :: NN1, NN2, NN3, NN4 ! Tailles des structures Type(LEVELS), dimension(:), allocatable :: SS1 ! Structure des niveaux de NIST modifiée Type(LEVELS), dimension(:), allocatable :: SS2 ! Structure des niveaux de la TOPBASE modifiée Type(LINES), dimension(:), allocatable :: SS3 ! Structure des transitions de KURUCZ/VALD modifiée Type(PHOTOIONS), dimension(:), allocatable :: SS4 ! Structure des tables de photoionisat° modifiée ! !DECLARATION DES STRUCTURES DE DONNEES SELECTIONNEES ! Type(LEVELS), dimension(:), allocatable :: SSS1 ! Structure des niveaux d'énergie sélectionnés Type(LINES), dimension(:), allocatable :: SSS2 ! Structure des transitions sélectionnées Type(INDEXLINES), dimension(:), allocatable :: SSS3 ! Structure des transitions indexées Type(PHOTOIONS), dimension(:), allocatable :: SSS4 ! Structure des tables de photoionisation ! Type(LINES), Dimension(:), Allocatable :: S_lines ! Structure des transitions sélectionnées Character(len = 6) :: cNlevels, cNlines, cNcoll ! !DECLARATION DES STRUCTURES D'ANALYSE ! Integer :: N ! nombre de transitions vers 1 niveau Type(INDEXLINES), dimension(:), allocatable :: San, San2, San3, San4, San_one Real, dimension(:), allocatable :: Gro_terms, Gro_levels Character(len = 7) :: Gro_elt ! !---------INITIALISATIONS-------------------------------------------- ! pas = 1 ios = 0 er = 0 ! fmt0 = '(/, A, I4, A, I3, A, /)' ! !Format d'affichage et infos de la structure de type LEVELS ! fmt1 = '(I3, 1X, A25, I4, F11.3, 2(1X, ES14.7), 1X, F5.1, 1X, I4, 1X, A)' info1 = 'N°/ Configuration électronique/ Term (SLP)/ En (cm-1)/ En (Ryd)/ En (eV)/ g/ N°TP' ! !Format d'affichage et infos de la structure de type LINES ! fmt2 = '( I6, 1X, 2(A12, I3.3, F11.3, F5.1, 1X), 2(F12.4), F7.3, 1X, ES9.3, F5.2)' ! ! Temp pour lire une vieille veersion de Lines_VALD_mod.dat !2(A12,I3.3,F11.3,F4.1,1X) ! info2 = 'N°/ Config1/ Term1(SL)/ En1(cm-1)/ J1/ Config2/ Term2(SL)/ En2(cm-1)/ J2/& & EN(cm-1)/ Lambda(nm)/ loggf/ Aij/ Gamma_rad' ! !Format d'affichage et info des en-têtes de la structure de type PHOTOIONS ! fmt3 = '(I3, 1X, F11.3, 1X, ES12.5, 1X, I3, 1X, I4)' info3 = 'N°/ En (cm-1)/ En (Ryd)/ Terme (SLP)/ Nbre de points' ! !Format d'affichage de la structure de type INDEXLINES ! fmt4 = '(I5, I4, I4, F8.3, 2(ES11.3), F12.4)' info4 = 'N°/ Nj / Ni / loggf / Aij / Gamma_rad / Lambda (nm)' ! !Format d'affichage des tables de photoionisation ! fmt5 = '(4(ES12.5, ES10.3))' fmt51 = '(4(F10.3, ES10.3))' ! !******************************************************************** !******* CORPS DU PROGRAMME *************************************** !******************************************************************** ! ! Call Get_command_argument(1, fconfig) ! ! LECTURE DES PARAMETRES DE CONFIGURATION ! CALL INQU_FCONFIG() CALL READ_CONFIG() ! !Noms des fichiers temporaires de structures que l'on peut modifier à la main ! If (Index(f3, 'KURUCZ') /= 0) Then fname_lines = './temp/Lines_KURUCZ.dat ' comment = "Oscillator strengths from Kurucz ALD." Else If (Index(f3, 'VALD') /= 0) Then fname_lines = './temp/Lines_VALD.dat ' ! <= MODIF comment = "Oscillator strengths from VALD." Else comment = "Check the file of the radiative transitions!" STOP "ATOMIC DATABASE NOT YET IMPLEMENTED." End If ! Vname = (/'./temp/Levels_NIST.dat ', & & './temp/Levels_TOPBASE.dat ', & & fname_lines, & & './temp/Photoions_TOPBASE_long.dat ', & & './temp/Photoions_TOPBASE_short.dat' /) ! ! EN-TETE ! Mise en forme des en-têtes ! S_0 = ATOM(Z, Symbol, Ion, Eion_cm) ! Write(info0,'(">>>>>>> Z =",I3," Symbol:",A3," Ion: ",A4,"Eion_cm =",F10.3," 1/cm <<<<<<<")') S_0 Write(cNlevels, '(A)') '------' Write(cNlines, '(A)') '------' Write(cNcoll, '(A)') '------' ! ! Vérification que le module de données supplémentaire corresponde bien à l'élément considéré ! If (Symb /= S_0%Symbol .OR. Z_IONI /= DEGRE_IONISATION(S_0%Ion)) Then STOP "Modify the name of the DATAGRAPH module (at the very end of mdatagraph.f90)" End If ! Do Call MENU( ) ! Write(*, '(/, A)', advance = 'no') "Your choice: " Read(*, *, iostat = ios) choix1 Write(*, *) IF (ios /= 0) CYCLE ! Select Case(choix1) ! Case(1) ! TRAVAILLER SUR UN NOUVEL ATOME Call CASE1( ) Case(2) ! AFFICHER LES DONNEES A L'ECRAN Call CASE2( ) Case(3) ! SELECTIONNER LES NIVEAUX IF (.NOT.Allocated(SS1)) CYCLE Call CASE3( ) Case(4) ! SELECTIONNER LES TRANSITIONS RADIATIVES IF (.NOT.Allocated(S_1)) CYCLE Call CASE4( ) Case(5) ! SELECTION DES TABLES DE PHOTOIONISATION IF (.NOT.Allocated(S_1) .OR. .NOT.Allocated(S_2)) CYCLE Call CASE5( ) Case(6) ! CONSTRUCTION DE L'ATOME IF (.NOT.Allocated(S_1) .OR. .NOT.Allocated(S_2) .OR. .NOT.Allocated(S_3)) CYCLE Call CASE6( ) Case(7) ! TRACE DES DIAGRAMME DE GROTRIAN IF (.NOT.Allocated(S_1) .OR. .NOT.Allocated(S_2)) CYCLE Call CASE7( ) Case(8) ! ANALYSE DES TRANSITIONS RADIATIVES IF (.NOT.Allocated(S_1) .OR. .NOT.Allocated(S_2)) CYCLE Call CASE8( ) Case(0) ! FIN DE L'APPLICATION Call CASE0( ) Case Default Call SYSTEM('clear') CYCLE End Select ! End Do ! !******************************************************************** ! CONTAINS ! !******************************************************************** ! Subroutine MENU( ) ! Call DATE_AND_TIME(values = ITIME) CDATE = "yyyy-mm-dd TM" CTIME = "hh H mm" Write(CDATE(1: 4), '(I4.4)', iostat = ios) ITIME(1) IF (ios /= 0) STOP "PROGRAM FORMATO: PB-14." Write(CDATE(6: 7), '(I2.2)', iostat = ios) ITIME(2) IF (ios /= 0) STOP "PROGRAM FORMATO: PB-15." Write(CDATE(9:10), '(I2.2)', iostat = ios) ITIME(3) IF (ios /= 0) STOP "PROGRAM FORMATO: PB-16." Write(CTIME(1: 2), '(I2)', iostat = ios) ITIME(5) IF (ios /= 0) STOP" PROGRAM FORMATO: PB-17." Write(CTIME(6: 7), '(I2.2)', iostat = ios) ITIME(6) IF (ios /= 0) STOP" PROGRAM FORMATO: PB-18." title = Trim(CDATE)//" FoRMATo"//version//" NLTE Model Atom Maker "//Trim(CTIME) Call SYSTEM("clear") Write(*, '(/,A,/)') '---------------------------------------------------------------------------' Write(*, '(A)') title Write(*, '(/,A,/)') '---------------------------------------------------------------------------' Write(*, *) Write(*, '(A)') Trim(info0) Write(*, *) Write(*, *) ! Write(*, *) "Number of selected levels (including the ionization level): ", cNlevels Write(*, *) "Number of selected radiative bound-bound transitions: ", cNlines Write(*, *) "Number of selected collisional bound-bound transitions: ", cNcoll ! Write(*, *) Write(*, *) "1/ New model atom " Write(*, *) "2/ Read the files in the 'temp' directory and display them" Write(*, *) "3/ Select the energy levels" Write(*, *) "4/ Select the radiative bound-bound transitions" Write(*, *) "5/ Select photoionization tables" Write(*, *) "6/ Construct a model atom with the selected data" Write(*, *) "7/ Plot the Grotrian diagrams of the model atom" Write(*, *) "8/ Analyze of radiative transitions" Write(*, '(A,/)') " 0/ Quit" ! Write(*, '(/, A)') comment ! End Subroutine MENU ! !-------------------------------------------------------------------- ! Subroutine CASE0( ) ! Write(*, '(/, A, /)') "EXIT FoRMATo"//version ! ! LIBERATION DE L'ESPACE MEMOIRE ! IF (Allocated(SS1)) Deallocate(SS1, SS2, SS3, SS4) IF (Allocated(SSS1)) Deallocate(SSS1) IF (Allocated(SSS2)) Deallocate(SSS2) IF (Allocated(SSS3)) Deallocate(SSS3) IF (Allocated(SSS4)) Deallocate(SSS4) IF (Allocated(S_1)) Deallocate(S_1, S_used_levels, S_lines) IF (Allocated(S_2)) Deallocate(S_2) IF (Allocated(S_3)) Deallocate(S_3) ! STOP ! End Subroutine CASE0 ! !-------------------------------------------------------------------- ! Subroutine CASE1( ) Write(*, '(A,/,"---------------",2/,4(A40,/))') 'Files to read: ', f1, f2, f3, f4 ! ! VERIFACTION QUE LES STRUCTURES NE SONT PAS ALLOUEES ! IF (Allocated(S_levels_NIST)) Deallocate(S_levels_NIST,S_levels_TOPB,S_lines_KURUCZ,S_photoions_TOPB) IF (Allocated(Npt)) Deallocate(Npt) ! ! DETECTION DE LA TAILLE DES TABLEAUX ! Call SPARSINGF1(f1, N1, N1in, N1out, sep) Call SPARSINGF2(f2, N2, N2in, N2out) ! If (Index(f3, 'KURUCZ') /= 0) Then Call SPARSINGF3(f3, NT, N3in, N3out) Else If (Index(f3, 'VALD') /= 0) Then Call SPARSINGF3(f3, NT, N3in, N3out) Else STOP "IN PROGRAM FORMATO, SUBROUTINE CASE1: PB-01." End If ! Call SPARSINGF4(f4, NP, N4in, N4out) ! ! DIMENSIONNEMENT DES STRUCTURES DE DONNEES BRUTES ! Allocate(S_levels_NIST(N1), S_levels_TOPB(N2), S_lines_KURUCZ(NT), S_photoions_TOPB(NP), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE1: PB-02." Allocate (Npt(N2), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE1: PB-03." ! ! COLLECTE DES DONNEES ! Call COLLECTF1(f1, N1, N1in, sep, S_levels_NIST) Call COLLECTF2(f2, N2, N2in, S_levels_TOPB) Call COLLECTF3(f3, NT, N3in, S_0, S_lines_KURUCZ) Call COLLECTF4(f4, NP, N4in, S_photoions_TOPB, Npt) ! ! ECRITURE DES STRUCTURES DE DONNEES BRUTES ! Vfmt = (/ fmt1, fmt1, fmt2, fmt3, fmt3/) Vinfo = (/info0, info1, info1, info2, info3/) ! Call WRITESTRUCT(Vfmt, Vname, Vinfo, S_levels_NIST, S_levels_TOPB, S_lines_KURUCZ, S_photoions_TOPB) ! ! LIBERATION DE L'ESPACE MEMOIRE ! Deallocate(S_levels_NIST, S_levels_TOPB, S_lines_KURUCZ, S_photoions_TOPB) Deallocate(Npt) ! End Subroutine CASE1 ! !-------------------------------------------------------------------- ! Subroutine CASE2( ) ! ! VERIFICATION QUE LES STRUCTURES NE SONT PAS ALLOUEES ! IF (Allocated(SS1)) Deallocate(SS1, SS2, SS3, SS4) IF (Allocated(Npt)) Deallocate(Npt) ! ! DETECTION DE LA TAILLE DES FICHIERS ! NN1 = SPARSING(Vname(1)) ! NN1 : nombre de niveaux de NIST NN2 = SPARSING(Vname(2)) ! NN2 : nombre de niveaux de la TOPBASE NN3 = SPARSING(Vname(3)) ! NN3 : nombre de transitions de KURUCZ / VALD NN4 = SPARSING(Vname(4)) ! NN4 : nombre de seuils de photoionisation ! ! ALLOCATION DES STRUCTURES ! Allocate(SS1(NN1), SS2(NN2), SS3(NN3), SS4(NN4), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE2: PB-01." Allocate(Npt(NN4),stat=er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE2: PB-02." ! ! LECTURE DES STRUCTURES DANS LE REPERTOIRE TEMP ! Vfmt = (/fmt1, fmt1, fmt2, fmt3, fmt3/) ! Call READSTRUCT(Vname(1), NN1, Vfmt(1), SS1) Call READSTRUCT(Vname(2), NN2, Vfmt(2), SS2) Call READSTRUCT(Vname(3), NN3, Vfmt(3), SS3) Call READSTRUCT(Vname(4), NN4, Vfmt(4), SS4) Npt = (/(SS4(I)%N, I = 1, NN4)/) ! comment = "Structures read in the files of the directory 'temp'." ! ! AFFICHAGE DES STRUCTURES ! Vfmt = (/ fmt0, fmt1, fmt2, fmt3, fmt3/) Vinfo = (/info0, info1, info2, info3, 'Coucou'/) ! Call DISPSTRUCT(SS1, SS2, SS3, SS4, Vfmt, Vinfo) ! End Subroutine CASE2 ! !-------------------------------------------------------------------- ! Subroutine CASE3( ) ! ! VERIFICATION QUE LES STRUCTURES ONT BIEN ETE LUES DANS LE REPERTOIRE TEMP ! IF (Allocated(SSS1)) Deallocate(SSS1) ! ! ALLOCATION DYNAMIQUE DES TABLES ! ! ATTENTION l'allocation de SSS1 est limité par NN1 pour CaII IF(Z == 20 .AND. Trim(Symbol) == 'Ca' .AND. Trim(Ion) == 'II') NN1 = 74 ! Allocate(SSS1(10000), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE3: PB-01." ! ! SELECTION DES NIVEAUX D'ENERGIES ! Call CRITLEVELS2(SS1, SS2, SS4, fmt1, SSS1, N_1) !Call CRITLEVELS(S_0, SS1, SS2, SS4, Lim_E_eV, E_eV_max, n_max, l_max, fmt1, l2, SSS1, N_1) Write(*, '(/,A,I4,/)') 'Nombre de niveaux sélectionnés + ionisation N_1 = ',N_1 Read(*,*) If (l0) Then ; Do I = 1,N_1 ; Write(*, fmt1) I, SSS1(I) ; End Do ; End If ! ! ALLOCATION DES STRUCTURES FINALES ! IF(Allocated(S_1)) Deallocate(S_1) Allocate(S_1(N_1), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE3: PB-02." ! S_1 = SSS1(1:N_1) ! Allocate(Gro_terms(N_1), Gro_levels(N_1), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE3: PB-03." Gro_terms = Real(S_1%term) !Write(*,*) Gro_terms Gro_levels = Real(S_1%en_eV) Gro_elt = S_0%Symbol // ' ' // S_0%Ion ! ! ECRITURE DES STRUCTURES DE DONNEES SELECTIONNEES ! Vfmt = (/ fmt1, fmt2, fmt4, fmt3, fmt3/) Vinfo = (/info0, info1, info2, info4, info3/) Vname = (/'./output/Z_levels.dat ', & & './output/Z_lines.dat ', & & './output/Z_index.dat ', & & './output/Z_photoions_long.dat ', & & './output/Z_photoions_short.dat' /) ! Call WRITESTRUCT(Vfmt, Vname, Vinfo, S_1) ! ! ECRITURE POUR LE MENU ! Write(cNlevels, '(I6.6)', iostat = ios) N_1 IF (ios /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE3: PB-04." ! End Subroutine CASE3 ! !-------------------------------------------------------------------- ! Subroutine CASE4( ) ! ! VERIFICATION QUE LES STRUCTURES ONT BIEN ETE LUES DANS LE REPERTOIRE TEMP ! IF (Allocated(SSS3)) Deallocate(SSS2, SSS3, S_used_levels) ! ! ALLOCATION DYNAMIQUE DES TABLES ! Allocate(SSS2(NN3), SSS3(NN3), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE4: PB-01." Allocate(S_used_levels(NN1),stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE4: PB-02." ! ! SELECTION DES TRANSITIONS ! Call CRITLINES(SS3, SSS1, fmt1, fmt2, N_2, N_1, SSS2, SSS3, S_used_levels) Write(*, '(/,A,I4,/)') 'Nombre de transitions sélectionnées = ', N_2 IF (N_2 == 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE4: PB-03." If (l0) Then ; Do I = 1, N_2 ; Write(*, fmt4) I, SSS3(I) ; End Do ; End If ! ! CALCUL DES COEFFICIENTS DE DE-EXCITATION RADIATIVE DES NIVEAUX ! Call CALCLEVELS(N_1, N_2, l5, SSS3) If (l0) Then ; Do I = 1, N_2 ; Write(*, fmt4) I, SSS3(I) ; End Do ; Read(*,*) ; End If ! ! ALLOCATION DES STRUCTURES FINALES ! IF(Allocated(S_2)) Deallocate(S_lines, S_2) Allocate(S_lines(N_2), S_2(N_2), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE4: PB-04." ! S_lines = SSS2(1:N_2) S_2 = SSS3(1:N_2) S_1 = S_used_levels(1:N_1) ! ! ECRITURE DES STRUCTURES DE DONNEES SELECTIONNEES ! Vfmt = (/ fmt1, fmt2, fmt4, fmt3, fmt3/) Vinfo = (/info0, info1, info2, info4, info3/) Vname = (/'./output/Z_levels.dat ', & & './output/Z_lines.dat ', & & './output/Z_index.dat ', & & './output/Z_photoions_long.dat ', & & './output/Z_photoions_short.dat' /) ! Call WRITESTRUCT(Vfmt, Vname, Vinfo, S2 = S_lines, S3 = S_2) ! ! ECRITURE POUR LE MENU ! Write(cNlines, '(I6.6)', iostat = ios) N_2 IF (ios /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE4: PB-07." ! End Subroutine CASE4 ! !-------------------------------------------------------------------- ! Subroutine CASE5( ) ! ! VERIFICATION QUE LES STRUCTURES ONT BIEN ETE LUES DANS LE REPERTOIRE TEMP ! IF (Allocated(SSS4)) Deallocate(SSS4) ! ! ALLOCATION DYNAMIQUE DES TABLES ! Allocate(SSS4(NN1), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE5: PB-01." ! ! SELECTION DES TABLES DE PHOTOIONISATION ! IF (Allocated(S_used_levels)) SSS1(1 : N_1) = S_used_levels(1 : N_1) Do I = 1,N_1 ; Write(*, fmt1), I, SSS1(I) ; End Do ! Write(*, *) "Ici case5 1" !Call CRITPHOTOIONS(SSS1, SS4, N_1, Npt, fmt3, l6, l7, lambda_min_A, Nmin, Mwin, Lech, SSS4, N_3) Call CRITPHOTOIONS(S_1, SS4, N_1, Npt, fmt3, l6, l7, lambda_min_A, Nmin, Mwin, Lech, SSS4, N_3,ext1_fig) Write(*, '(/,A,I4)') 'Nombre de tables de photoionisation utilisées : ', N_1-1 Write(*, '(A,I4,/)') 'Nombre de tables de photoionisation différentes utilisés : ', N_3 ! Write(comment(1 : 4), '(I4.4)', iostat = ios) N_3 IF (ios /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE5: PB-02." Write(comment(5:), '(A)', iostat = ios) " different ionization tables of the TopBase." ! If (l0) Then ; do I = 1, N_1 Write(*, fmt3) I, SSS4(I)%en_cm, SSS4(I)%en_Ryd, SSS4(I)%term, SSS4(I)%N End Do ; End If ! ! ALLOCATION DES STRUCTURES FINALES ! IF(Allocated(S_3)) Deallocate(S_3) Allocate(S_3(N_1), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE5: PB-03." ! S_3 = SSS4(1 : N_1) ! ! ECRITURE DES STRUCTURES DE DONNEES SELECTIONNEES ! Vfmt = (/fmt1,fmt2,fmt4,fmt3,fmt3/) Vinfo = (/info0,info1,info2,info4,info3/) Vname = (/'./output/Z_levels.dat ', & & './output/Z_lines.dat ', & & './output/Z_index.dat ', & & './output/Z_photoions_long.dat ', & & './output/Z_photoions_short.dat' /) ! !Call WRITESTRUCT(Vfmt,Vname,Vinfo, S_1,S_lines,S_2,S_3) Call WRITESTRUCT(Vfmt, Vname, Vinfo, S1 = S_1, S4 = S_3) ! End Subroutine CASE5 ! !-------------------------------------------------------------------- ! Subroutine CASE6( ) ! ! CONSTRUCTION DE L'ATOME ! Call CONSTRUCTATOM(f3, comment, CDATE) ! Write(cNcoll, '(I6.6)', iostat = ios) (N_1-1)*((N_1-1)-1)/2 IF (ios /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE6: PB-01." ! End Subroutine CASE6 ! !-------------------------------------------------------------------- ! Subroutine CASE7( ) ! ! DIAGRAMME DE GROTRIAN ! figure1 = Trim(path_fig2) // Trim(name_fig_1) // '.' // ext1_fig figure2 = Trim(path_fig2) // Trim(name_fig_2) // '.' // ext1_fig figure3 = Trim(path_fig2) // Trim(name_fig_3) // '.' // ext1_fig figure4 = Trim(path_fig2) // Trim(name_fig_4) // '.' // ext1_fig figure5 = Trim(path_fig2) // Trim(name_fig_5) // '.' // ext1_fig ! !Write(*,*) Gro_terms Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure1, 'XWIN', 'NIVEAUX') Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure1, ext1_fig, 'NIVEAUX') Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure2, 'XWIN', 'TRANS_RAD') Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure2, ext1_fig, 'TRANS_RAD') Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure4, 'XWIN', 'TRANS_COL') Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure4, ext1_fig, 'TRANS_COL') ! For one transition only Call GROTRIAN(Gro_terms, Gro_levels, San_one%Nj, San_one%Ni, Gro_elt, figure5, ext1_fig, 'TRANS_RAD') ! If (Gro_elt == 'Ca I' .AND. N_1 == 152 .OR. & Gro_elt == 'Ca II' .AND. N_1 == 74 .OR. & Gro_elt == 'Mg I' .AND. N_1 == 150) Then !Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure3, 'XWIN', 'SPECIAL') Call GROTRIAN(Gro_terms, Gro_levels, S_2%Nj, S_2%Ni, Gro_elt, figure3, ext1_fig, 'SPECIAL') End If ! figureMg1 = Trim(path_fig2) // 'Grotrian_singlet.' // ext1_fig figureMg2 = Trim(path_fig2) // 'Grotrian_triplet.' // ext1_fig figureMg3 = Trim(path_fig2) // 'Grotrian_inter.' // ext1_fig ! IF (.NOT.Allocated(San2)) RETURN ! If (S_0%Z == 12 .OR. S_0%Z == 20 .AND. S_0%ion == 'I') Then !Call GROTRIAN(Gro_terms, Gro_levels, San2%Nj, San2%Ni, Gro_elt, figureMg1, 'XWIN', 'TRANS_RAD') Call GROTRIAN(Gro_terms, Gro_levels, San2%Nj, San2%Ni, Gro_elt, figureMg1, ext1_fig, 'TRANS_RAD') !Call GROTRIAN(Gro_terms, Gro_levels, San3%Nj, San3%Ni, Gro_elt, figureMg2, 'XWIN', 'TRANS_RAD') Call GROTRIAN(Gro_terms, Gro_levels, San3%Nj, San3%Ni, Gro_elt, figureMg2, ext1_fig, 'TRANS_RAD') !Call GROTRIAN(Gro_terms, Gro_levels, San4%Nj, San4%Ni, Gro_elt, figureMg3, 'XWIN', 'TRANS_RAD') Call GROTRIAN(Gro_terms, Gro_levels, San4%Nj, San4%Ni, Gro_elt, figureMg3, ext1_fig, 'TRANS_RAD') End If ! comment = "Plots are saved in the 'output/figures' directory." ! Deallocate(Gro_terms, Gro_levels) ! End Subroutine CASE7 ! !-------------------------------------------------------------------- ! Subroutine CASE8( ) ! ! ANALYSES ! N = COUNTLINES(S_2, Nselect) IF(Allocated(San)) Deallocate(San) Allocate(San(N), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE8: PB-01." ! If (S_0%Z == 12 .OR. S_0%Z == 20 .AND. S_0%ion == 'I') Then Write(*, *) 'Nombre de raies du niveau ', Nselect, ' : ', N Call ANALYZELINES(S_2, Nselect, San) Call SYSLINES(S_1, S_2,'SYSTEM1',San2) Call SYSLINES(S_1, S_2,'SYSTEM3',San3) Call SYSLINES(S_1, S_2,'INTER',San4) Do I = 1, size(San) ; Write(*, fmt4) I, San(I) ; End Do ;Read(*, *) End If ! Call SYSLINES(S_1, S_2,'ONE_LINE',San_one,Nraie) ! comment = "Ionization energy: eV." Write(comment(24 : 29), '(F6.3)', iostat = ios) S_1(N_1)%en_eV IF (ios /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE8: PB-02." ! ! Tracé progressif de toutes les transitions ! If (Gro_rad_detail) Then Do I = 1, N_2 IF(Allocated(San)) Deallocate(San) Allocate(San(I), stat = er) IF (er /= 0) STOP "IN PROGRAM FORMATO, SUBROUTINE CASE8: PB-03." ! San = S_2(1:I) ! figure1 = Trim(path_fig2) // 'Gro' // '.' // ext1_fig Call GROTRIAN(Gro_terms, Gro_levels, San%Nj, San%Ni, Gro_elt, figure1, ext1_fig, 'TRANS_RAD') !Write(*, *) 'Nombre de raies du niveau ', I, ' : ', N End Do End If ! !Call ANALYZELINES(S_1,S_2,'INTERCOMBINATION') !Call ANALYZELINES(S_1,S_2,'SINGLET_SYSTEM') !Call ANALYZELINES(S_1,S_2,'TRIPLET_SYSTEM') ! End Subroutine CASE8 ! End Program FORMATO