Fortran Walkthrough
This section reprises the steps of the Python Walkthrough — evaluating spectra and photometric colors for Sirius A — but now using the MSG Fortran interface.
Preparation
In your working directory, create a new file
fortran-walkthrough.f90
with the following source code:
program fortran_walkthrough
! Uses
use forum_m
use fmsg_m
! No implicit typing
implicit none
! Parameters
real(RD), parameter :: lam_min = 3000._RD
real(RD), parameter :: lam_max = 7000._RD
integer, parameter :: n_lam = 501
! Variables
type(specgrid_t) :: specgrid
type(axis_t) :: axis
character(LABEL_LEN) :: label
integer :: i
real(RD) :: R2_d2
real(RD) :: lam(n_lam)
real(RD) :: lam_c(n_lam-1)
real(RD) :: x_vec(2)
real(RD) :: F(n_lam-1)
real(RD) :: F_obs(n_lam-1)
integer :: unit
type(photgrid_t) :: photgrid_U
type(photgrid_t) :: photgrid_B
type(photgrid_t) :: photgrid_V
real(RD) :: F_U
real(RD) :: F_B
real(RD) :: F_V
real(RD) :: F_U_obs
real(RD) :: F_B_obs
real(RD) :: F_V_obs
real(RD) :: U
real(RD) :: B
real(RD) :: V
! Load the specgrid
call load_specgrid('sg-demo.h5', specgrid)
! Set photospheric parameters to correspond to Sirius A
do i = 1, 2
call specgrid%get_axis(i, axis)
call axis%get_label(label)
select case(label)
case('log(g)')
x_vec(i) = 4.2774_RD
case('Teff')
x_vec(i) = 9909.2_RD
case default
stop 'unrecognized axis label'
end select
end do
! Set the dilution factor R2_d2 = R**2/d**2, where R is Sirius A's
! radius and d its distance
R2_d2 = 2.1351E-16_RD
! Set up the wavelength abscissa
lam = [((lam_min*(n_lam-i) + lam_max*(i-1))/(n_lam-1), i=1,n_lam)]
lam_c = 0.5_RD*(lam(:n_lam-1) + lam(2:))
! Evaluate the observed flux
call specgrid%interp_flux(x_vec, lam, F)
F_obs = R2_d2*F
! Write it to a file
open(NEWUNIT=unit, FILE='spectrum.dat', STATUS='REPLACE')
do i = 1, n_lam-1
write(unit, *) lam_c(i), F_obs(i)
end do
close(unit)
! Load the photgrids
call load_photgrid_from_specgrid('sg-demo.h5', 'pb-Generic-Johnson.U-Vega.h5', photgrid_U)
call load_photgrid_from_specgrid('sg-demo.h5', 'pb-Generic-Johnson.B-Vega.h5', photgrid_B)
call load_photgrid_from_specgrid('sg-demo.h5', 'pb-Generic-Johnson.V-Vega.h5', photgrid_V)
! Evaluate fluxes
call photgrid_U%interp_flux(x_vec, F_U)
call photgrid_B%interp_flux(x_vec, F_B)
call photgrid_V%interp_flux(x_vec, F_V)
F_U_obs = R2_d2*F_U
F_B_obs = R2_d2*F_B
F_V_obs = R2_d2*F_V
! Evaluate apparent magnitudes
U = -2.5_RD*LOG10(F_U_obs)
B = -2.5_RD*LOG10(F_B_obs)
V = -2.5_RD*LOG10(F_V_obs)
print *, ' V=', V
print *, 'U-B=', U-B
print *, 'B-V=', B-V
! Finish
end program fortran_walkthrough
A few brief comments on the code:
The
use forum_m
statement provides access to the Fortran Utility Module (ForUM). For the purposes of the demo program, this module defines the RD kind type parameter for double precision real variables.The
use fmsg_m
statement provides access to the MSG Fortran interface. Primarily, this interface serves to define thespecgrid_t
andphotgrid_t
datatypes.Because Fortran doesn’t have
dict
datatypes, the photospheric parameters must be passed to MSG as a plain array (here, stored in the variablex_vec
). Aselect case
construct is used to make sure the correct values are stored in each array element.
Compiling
The next step is to compile the demo program. Make sure the
MSG_DIR
environment variable is set, as described in the
Quick Start chapter. Then, enter the following on the command line:
gfortran -o fortran-walkthrough fortran-walkthrough.f90 -I$MSG_DIR/include `$MSG_DIR/scripts/fmsg_link`
The -I$MSG_DIR/include
option tells the compiler where to find
the module definition (.mod
) files, while the
$MSG_DIR/scripts/fmsg_link
clause (note the enclosing
backticks) runs a link script that returns the compiler flags
necessary to link the program against the appropriate libraries.
Running
To run the code, first create a symbolic link to the demo grid:
ln -s $MSG_DIR/data/grids/sg-demo.h5
Then, execute the command
./fortran-walkthrough
The code will create a file spectrum.dat
containing the flux
spectrum for Sirius A (as an ASCII table), and print out the
apparent V-band magnitude and colors of the star.