! This routine write the final results. ! ! It is part of the program SP_Ace, which derives stellar parameters, ! such as gravity, temperature, and element abundances from optical ! stellar spectra, assuming Local Thermodynamic Equilibrium (LTE) ! and 1D stellar atmosphere models. ! ! Copyright (C) 2016 Corrado Boeche ! ! This program is free software: you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation, either version 3 of the License, or ! (at your option) any later version. ! ! This program is distributed in the hope that it will be useful, ! but WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . SUBROUTINE write_res(flag,chisq) USE num_type USE share, ONLY: TGM, ABD, ele_ll,dim_ll,select_ll_mask,& &sn,w_sp,f_sp,f_sp_norm,f_model,cont,& &dimsp,ele2meas,weights,ele2write,n_weig,& &up_ABD,lo_ABD,sn_var,ew,wave_ll,wave_rej,& &rad_rej,dim_rej,sigma,TGM_mask,ABD_mask USE uncertains2, ONLY: up_TGM,lo_TGM USE space_pars, ONLY: null_val,flag_alpha USE data_lib, ONLY: temp_gridL,logg_gridL,met_gridL,ELE_symb IMPLICIT NONE INTEGER(I2B) :: i,N_lin,constraints INTEGER(I1B) :: k,j LOGICAL, DIMENSION(dim_ll) :: mask CHARACTER(LEN=1500) :: values_TGM, values_ABD, values_lab CHARACTER(LEN=1500) :: line, header LOGICAL, INTENT(IN) :: flag REAL(DP), INTENT(IN) :: chisq REAL(DP) :: rad CHARACTER(LEN=5) :: null CHARACTER(LEN=5),DIMENSION(5) :: TGMc,lo_TGMc,up_TGMc CHARACTER(LEN=5),DIMENSION(SIZE(ABD)) :: ABDc,lo_ABDc,up_ABDc !before to compute the number of lines used, remove the rejected lines from select_ll_lines DO i=1,dim_rej rad=max(3*sigma,rad_rej(i)) !plot the rejected lines that are inside a rejected interval WHERE(wave_ll>=(wave_rej(i)-rad_rej(i)).AND.wave_ll<=(wave_rej(i)+rad_rej(i))) select_ll_mask=.FALSE. END DO !give the null value of the user IF(null_val.EQ.'NaN') THEN null=' NaN' ELSE IF(null_val.EQ.'null') THEN null=' null' ELSE IF (null_val.EQ.'-9.99') THEN null='-9.99' END IF IF(flag) THEN !compute the semi-errors for TGM write(lo_TGMc(1),fmt='(I5)') INT(lo_TGM(1),I2B) write(up_TGMc(1),fmt='(I5)') INT(up_TGM(1),I2B) write(lo_TGMc(2),fmt='(F5.2)') lo_TGM(2) write(up_TGMc(2),fmt='(F5.2)') up_TGM(2) write(lo_TGMc(3),fmt='(F5.2)') lo_TGM(3) write(up_TGMc(3),fmt='(F5.2)') up_TGM(3) ELSE !if flag is false lo_TGMc=null up_TGMc=null up_ABDc=null lo_ABDc=null END IF !if the errors have no boudaries inside the grid, then give null value IF(lo_TGM(1)temp_gridL(SIZE(temp_gridL))) up_TGMc(1)=null IF(lo_TGM(2)logg_gridL(SIZE(logg_gridL))) up_TGMc(2)=null IF(lo_TGM(3)met_gridL(SIZE(met_gridL))) up_TGMc(3)=null !write the results of TGM in characters !Teff write(TGMc(1),fmt='(I5)') INT(TGM(1),I2B) !log g write(TGMc(2),fmt='(F5.2)') TGM(2) !met write(TGMc(3),fmt='(F5.2)') TGM(3) !fwhm write(TGMc(4),fmt='(F5.2)') ABS(TGM(4))*2.35 !RV IF(TGM(5)<=-100.OR.TGM(5)>=100.) THEN write(TGMc(5),fmt='(F5.0)') TGM(5) ELSE write(TGMc(5),fmt='(F5.1)') TGM(5) END IF !now do it for ABD DO j=1,INT(SIZE(ABD,1),I1B) IF(ABD(j)>=-0.5.AND.ABD(j)<=0.7.AND.ABD_mask(j)) THEN write(ABDc(j),fmt='(F5.2)') ABD(j)+TGM(3) write(up_ABDc(j),fmt='(F5.2)') up_ABD(j)+TGM(3) write(lo_ABDc(j),fmt='(F5.2)') lo_ABD(j)+TGM(3) ELSE !if the enhancement is >1. or <-1, give the null value ABDc(j)=null up_ABDc(j)=null lo_ABDc(j)=null END IF END DO WHERE(lo_ABD<-0.5) lo_ABDc=null WHERE(up_ABD>0.7) up_ABDc=null !write the first line in the result file write(line,fmt=*) '' write(header,fmt=*) '' !add convergence header=TRIM(header) // ' conv' write(values_ABD,fmt='(TR3,I2)') 0 line=TRIM(line) // TRIM(values_ABD) !add radial velocity header=TRIM(header) // ' RV' write(values_ABD,fmt='(TR3,A5)') TGMc(5) line=TRIM(line) // TRIM(values_ABD) !add fwhm header=TRIM(header) // ' FWHM' write(values_ABD,fmt='(TR3,A5)') TGMc(4) line=TRIM(line) // TRIM(values_ABD) !add S/N header=TRIM(header) // ' S/N' write(values_ABD,fmt='(TR3,F5.1)') sn line=TRIM(line) // TRIM(values_ABD) !add chisq constraints=INT(COUNT(TGM_mask),I2B)+INT(COUNT(ABD_mask),I2B) header=TRIM(header) // ' chisq' write(values_ABD,fmt='(TR3,F6.2)') chisq/(n_weig-constraints) line=TRIM(line) // TRIM(values_ABD) header=TRIM(header) // ' Teff ' // ' inf ' // ' sup' write(values_TGM,fmt='(TR1,A5,TR1,A5,TR1,A5)') TGMc(1),lo_TGMc(1),up_TGMc(1) line=TRIM(line) // TRIM(values_TGM) header=TRIM(header) // ' logg' // ' inf' // ' sup' write(values_TGM,fmt='(TR2,A5,TR1,A5,TR1,A5)') TGMc(2),lo_TGMc(2),up_TGMc(2) line=TRIM(line) // TRIM(values_TGM) header=TRIM(header) // ' [M/H]' // ' inf' // ' sup' write(values_TGM,fmt='(TR2,A5,TR1,A5,TR1,A5)') TGMc(3),lo_TGMc(3),up_TGMc(3) line=TRIM(line) // TRIM(values_TGM) !now write the elements IF(flag_alpha) THEN !write "metals" mask=.FALSE. WHERE(INT(ele_ll)==26.AND.select_ll_mask) mask=.TRUE. write(values_lab,fmt='(TR3,A6,TR1,A16)') ELE_symb(93), ' inf sup Nlin' header=TRIM(header) // TRIM(values_lab) N_lin=INT(COUNT(mask),I2B) IF(N_lin>0) THEN j=INT(MINLOC(ABS(ele2meas-26),1),I1B) write(values_ABD,fmt='(TR4,A5,TR1,A5,TR1,A5,TR1,I4)') ABDc(j),lo_ABDc(j),up_ABDc(j),N_lin ELSE write(values_ABD,fmt='(TR4,A5,TR1,A5,TR1,A5,TR1,I4)') null,null,null,0 END IF line=TRIM(line) // TRIM(values_ABD) !write alpha mask=.FALSE. WHERE(INT(ele_ll)==94.AND.select_ll_mask) mask=.TRUE. write(values_lab,fmt='(TR3,A6,TR1,A16)') ELE_symb(94), ' inf sup Nlin' header=TRIM(header) // TRIM(values_lab) N_lin=INT(COUNT(mask),I2B) IF(N_lin>0) THEN j=INT(MINLOC(ABS(ele2meas-94),1),I1B) write(values_ABD,fmt='(TR4,A5,TR1,A5,TR1,A5,TR1,I4)') ABDc(j),lo_ABDc(j),up_ABDc(j),N_lin ELSE write(values_ABD,fmt='(TR4,A5,TR1,A5,TR1,A5,TR1,I4)') null,null,null,0 END IF line=TRIM(line) // TRIM(values_ABD) ELSE !if flag_alpha=.FALSE. then DO k=1,INT(SIZE(ele2write,1),I1B) !define the position of the element ele2meas(k) in the array ele2write, if any IF(ANY(ele2meas==ele2write(k))) THEN mask=.FALSE. j=INT(MINLOC(ABS(ele2meas-ele2write(k)),1),I1B) WHERE(INT(ele_ll)==ele2meas(j).AND.select_ll_mask) mask=.TRUE. write(values_lab,fmt='(TR3,A6,TR1,A16)') ELE_symb(INT(ele2meas(j))), ' inf sup Nlin' header=TRIM(header) // TRIM(values_lab) N_lin=INT(COUNT(mask),I2B) write(values_ABD,fmt='(TR4,A5,TR1,A5,TR1,A5,TR1,I4)') ABDc(j),lo_ABDc(j),up_ABDc(j),N_lin line=TRIM(line) // TRIM(values_ABD) ELSE write(values_lab,fmt='(TR3,A6,TR1,A16)') ELE_symb(INT(ele2write(k))), ' inf sup Nlin' header=TRIM(header) // TRIM(values_lab) write(values_ABD,fmt='(TR4,A5,TR1,A5,TR1,A5,TR1,I4)') null,null,null,0 line=TRIM(line) // TRIM(values_ABD) END IF END DO END IF OPEN(unit=10,file='space_TGM_ABD.dat',action='WRITE') write(10,fmt=*) TRIM(header) write(10,fmt=*) TRIM(line) CLOSE(10) !now write the files with the EWs of the measured lines OPEN(unit=10,file='space_ew_meas.dat',action='WRITE') DO i=1,dim_ll IF(select_ll_mask(i)) THEN write(10,fmt='(F8.3,2X,F4.1,2X,F6.1)') wave_ll(i), ele_ll(i), ew(i)*1000. END IF END DO CLOSE(10) OPEN(unit=9,file='space_model.dat',action='WRITE') write(9,fmt="(F9.3,TR1,F8.5,TR1,F8.5,TR1,F8.5,TR1,F8.5,TR1,F4.2,TR1,I4)")& & (w_sp(i),f_sp(i),f_sp_norm(i),f_model(i),cont(i),weights(i),NINT(sn_var(i)), i=1,dimsp) CLOSE(9) END SUBROUTINE write_res