Skip to content

Commit

Permalink
Made changes in response to JOSS review. In particular sorted out ass…
Browse files Browse the repository at this point in the history
…ert equal issues between numba and fotran files
  • Loading branch information
David Topping authored and David Topping committed Aug 1, 2018
1 parent da26406 commit 3bcebf6
Show file tree
Hide file tree
Showing 15 changed files with 67 additions and 30 deletions.
12 changes: 8 additions & 4 deletions Aerosol/f2py/Aerosol_simulation_f2py.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,19 +226,22 @@
Parse_eqn_file.write_rate_file_fortran(filename,rate_dict_fortran,openMP)
print("Compiling rate coefficient file using f2py")
#Parse_eqn_file.write_rate_file(filename,rate_dict,mcm_constants_dict)
os.system("python f2py_rate_coefficient.py build_ext --inplace --fcompiler=gfortran")
#os.system("python f2py_rate_coefficient.py build_ext --inplace --fcompiler=gfortran")
os.system('f2py -c -m rate_coeff_f2py Rate_coefficients.f90 --f90flags="-O3 -ffast-math -fopenmp" -lgomp')

# Create Fortran file for calculating prodcts all of reactants for all reactions
print("Creating Fortran file to calculate reactant contribution to equation")
Parse_eqn_file.write_reactants_indices_fortran(filename,equations,species_dict2array,rate_dict_reactants,loss_dict,openMP)
print("Compiling reactant product file using f2py")
os.system("python f2py_reactant_conc.py build_ext --inplace --fcompiler=gfortran")
#os.system("python f2py_reactant_conc.py build_ext --inplace --fcompiler=gfortran")
os.system('f2py -c -m reactants_conc_f2py Reactants_conc.f90 --f90flags="-O3 -ffast-math -fopenmp" -lgomp')

# Create Fortran file for calculating dy_dt
print("Creating Fortran file to calculate dy_dt for each reaction")
Parse_eqn_file.write_loss_gain_fortran(filename,equations,num_species,loss_dict,gain_dict,species_dict2array,openMP)
print("Compiling dydt file using f2py")
os.system("python f2py_loss_gain.py build_ext --inplace --fcompiler=gfortran")
#os.system("python f2py_loss_gain.py build_ext --inplace --fcompiler=gfortran")
os.system('f2py -c -m loss_gain_f2py Loss_Gain.f90 --f90flags="-O3 -ffast-math -fopenmp" -lgomp')

# Create .npy file with indices for all RO2 species
print("Creating file that holds RO2 species indices")
Expand Down Expand Up @@ -418,7 +421,8 @@
print("Creating Fortran file to calculate gas-to-particle partitining for each compound")
Parse_eqn_file.write_partitioning_section_fortran_ignore(num_species+num_species_condensed*num_bins,num_bins,num_species,num_species_condensed,include_index)
print("Compiling gas-to-particle partitioning file using f2py")
os.system("python f2py_partition.py build_ext --inplace --fcompiler=gfortran")
#os.system("python f2py_partition.py build_ext --inplace --fcompiler=gfortran")
os.system('f2py -c -m partition_f2py Partitioning.f90 --f90flags="-O3 -ffast-math -fopenmp" -lgomp')

#-------------------------------------------------------------------------------------
# 10) Save this information to a dictionary to pass to ODE solver
Expand Down
3 changes: 2 additions & 1 deletion Aerosol/f2py/Fixed_yield/Aerosol_sim_fixed_yield.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,8 @@
print("Creating Fortran file to calculate gas-to-particle partitining for each compound")
Parse_eqn_file.write_partitioning_section_fortran_ignore(num_species+num_species_condensed*num_bins,num_bins,num_species,num_species_condensed,include_index)
print("Compiling gas-to-particle partitioning file using f2py")
os.system("python f2py_partition.py build_ext --inplace --fcompiler=gfortran")
#os.system("python f2py_partition.py build_ext --inplace --fcompiler=gfortran")
os.system('f2py -c -m partition_f2py Partitioning.f90 --f90flags="-O3 -ffast-math -fopenmp" -lgomp')

#-------------------------------------------------------------------------------------
# 10) Save this information to a dictionary to pass to ODE solver
Expand Down
41 changes: 36 additions & 5 deletions Parse_eqn_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -1381,7 +1381,7 @@ def write_rate_file_fortran(filename,rate_dict_fortran,openMP):
f.write(' ! thus impacting photolysis rates \n')
f.write('\n')
f.write(' pi = 4.0*ATAN(1.0) \n')
f.write(' !!USER TO CHANGE THESE VALUES')
f.write(' !!USER TO CHANGE THESE VALUES \n')
f.write(' currentDayOfYear=150.0 \n')
f.write(' latitude=51.51 \n')
f.write(' longitude=0.13 \n')
Expand Down Expand Up @@ -2572,6 +2572,9 @@ def write_loss_gain_fortran(filename,equations,num_species,loss_dict,gain_dict,s

check_step=0

f.write(' !Set values to zero \n')
f.write(' loss_gain_array(:)=0.0D0 \n')

for species, species_step in species_dict2array.items():

if openMP is True and check_step == 0:
Expand Down Expand Up @@ -3296,6 +3299,20 @@ def write_partitioning_section_fortran(total_length_y,num_bins,num_species):
f.write(' REAL(8), PARAMETER :: Pi = 3.1415927 \n')
f.write(' INTEGER(8), PARAMETER :: num_species = %s \n'%(num_species))
f.write('\n')
f.write(' !Set all output variables to 0 \n')
f.write(' total_SOA_mass_array(:)=0.0D0 \n')
f.write(' dy_dt_gas_matrix(:,:)=0.0D0 \n')
f.write(' Pressure_eq(:)=0.0D0 \n')
f.write(' Cstar_i_m_t(:)=0.0D0 \n')
f.write(' kelvin_factor(:)=0.0D0 \n')
f.write(' y_mole_fractions(:)=0.0D0 \n')
f.write(' temp_array(:)=0.0D0 \n')
f.write(' mass_array(:)=0.0D0 \n')
f.write(' density_array(:)=0.0D0 \n')
f.write(' mass_fractions_array(:)=0.0D0 \n')
f.write(' aw_array(:)=0.0D0 \n')
f.write(' size_array(:)=0.0D0 \n')
f.write(' dy_dt(:)=0.0D0 \n')
f.write('!$OMP PARALLEL DO &\n')
f.write('!$OMP& PRIVATE(size_step,total_mass),& \n')
f.write('!$OMP& PRIVATE(total_moles,y_mole_fractions,temp_array), & \n')
Expand All @@ -3304,10 +3321,10 @@ def write_partitioning_section_fortran(total_length_y,num_bins,num_species):
f.write('!$OMP& PRIVATE(Kn,Inverse_Kn,Correction_part1, Correction_part2), & \n')
f.write('!$OMP& PRIVATE(Correction_part3,Correction,kelvin_factor), & \n')
f.write('!$OMP& PRIVATE(Pressure_eq,Cstar_i_m_t,k_i_m_t_part1), & \n')
f.write('!$OMP& PRIVATE(k_i_m_t,dm_dt,water_core_mole_frac), & \n')
f.write('!$OMP& PRIVATE(k_i_m_t,dm_dt), & \n')
f.write('!$OMP& SHARED(total_SOA_mass,total_water_cond_mass,size_array), & \n')
f.write('!$OMP& SHARED(ycore,core_diss,mw_array,density_input), & \n')
f.write('!$OMP& SHARED(C_g_i_t,dy_dt,core_mass_array,R_gas,Psat,num_species), & \n')
f.write('!$OMP& SHARED(C_g_i_t,dy_dt,core_mass_array,R_gas,Psat), & \n')
f.write('!$OMP& SHARED(gamma_gas,NA,alpha_d_org,Model_temp,DStar_org), & \n')
f.write('!$OMP& SHARED(dy_dt_gas_matrix,aw_array) \n')
f.write(' DO size_step=1,%s \n'%(num_bins))
Expand Down Expand Up @@ -3498,6 +3515,20 @@ def write_partitioning_section_fortran_ignore(total_length_y,num_bins,num_specie
f.write(' REAL(8), PARAMETER :: Pi = 3.1415927 \n')
f.write(' INTEGER(8), PARAMETER :: num_species = %s \n'%(num_species))
f.write(' INTEGER(8), PARAMETER :: num_species_condensed = %s \n'%(num_species_condensed))
f.write(' !Set all output variables to 0 \n')
f.write(' total_SOA_mass_array(:)=0.0D0 \n')
f.write(' dy_dt_gas_matrix(:,:)=0.0D0 \n')
f.write(' Pressure_eq(:)=0.0D0 \n')
f.write(' Cstar_i_m_t(:)=0.0D0 \n')
f.write(' kelvin_factor(:)=0.0D0 \n')
f.write(' y_mole_fractions(:)=0.0D0 \n')
f.write(' temp_array(:)=0.0D0 \n')
f.write(' mass_array(:)=0.0D0 \n')
f.write(' density_array(:)=0.0D0 \n')
f.write(' mass_fractions_array(:)=0.0D0 \n')
f.write(' aw_array(:)=0.0D0 \n')
f.write(' size_array(:)=0.0D0 \n')
f.write(' dy_dt(:)=0.0D0 \n')
f.write('\n')
f.write('!$OMP PARALLEL DO &\n')
f.write('!$OMP& PRIVATE(size_step,total_mass),& \n')
Expand All @@ -3507,10 +3538,10 @@ def write_partitioning_section_fortran_ignore(total_length_y,num_bins,num_specie
f.write('!$OMP& PRIVATE(Kn,Inverse_Kn,Correction_part1, Correction_part2), & \n')
f.write('!$OMP& PRIVATE(Correction_part3,Correction,kelvin_factor), & \n')
f.write('!$OMP& PRIVATE(Pressure_eq,Cstar_i_m_t,k_i_m_t_part1), & \n')
f.write('!$OMP& PRIVATE(k_i_m_t,dm_dt,water_core_mole_frac), & \n')
f.write('!$OMP& PRIVATE(k_i_m_t,dm_dt), & \n')
f.write('!$OMP& SHARED(total_water_cond_mass,size_array), & \n')
f.write('!$OMP& SHARED(ycore,core_diss,mw_array,density_input), & \n')
f.write('!$OMP& SHARED(C_g_i_t,dy_dt,core_mass_array,R_gas,Psat,num_species), & \n')
f.write('!$OMP& SHARED(C_g_i_t,dy_dt,core_mass_array,R_gas,Psat), & \n')
f.write('!$OMP& SHARED(gamma_gas,NA,alpha_d_org,Model_temp,DStar_org), & \n')
f.write('!$OMP& SHARED(dy_dt_gas_matrix,aw_array,total_SOA_mass_array) \n')
f.write(' DO size_step=1,%s \n'%(num_bins))
Expand Down
Binary file modified test/data/MCM_APINENEdy_dt_calc_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEdydt_dydt_fortran_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEdydt_dydt_numba_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEdydt_fortran_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEdydt_numba_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENErates_fortran_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENErates_numba_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEreactants_fortran_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEreactants_numba_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEsize_array_base.npy
Binary file not shown.
Binary file modified test/data/MCM_APINENEtotal_SOA_mass_base.npy
Binary file not shown.
41 changes: 21 additions & 20 deletions test/test_modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,8 @@ def setup(filename):
print("Creating Fortran file to calculate gas-to-particle partitining for each compound")
Parse_eqn_file.write_partitioning_section_fortran_ignore(num_species+num_species_condensed*num_bins,num_bins,num_species,num_species_condensed,include_index)
print("Compiling gas-to-particle partitioning file using f2py")
os.system("python f2py_partition.py build_ext --inplace")
#os.system("python f2py_partition.py build_ext --inplace")
os.system('f2py -c -m partition_f2py Partitioning.f90 --f90flags="-O3 -ffast-math -fopenmp" -lgomp')


# Load the compiled functions
Expand Down Expand Up @@ -281,7 +282,7 @@ def setup(filename):
numpy.save(filename+'dydt_dydt_fortran', dydt_dydt_fortran)

# Numba modules
rates_numba=evaluate_rates_numba(RO2,H2O,temp,time_of_day_seconds,numpy.zeros((equations)),numpy.zeros((63)))
rates_numba=evaluate_rates_numba(time_of_day_seconds,RO2,H2O,temp,numpy.zeros((equations)),numpy.zeros((63)))
#numpy.save(filename+'rates_numba_base', rates_numba)
#shutil.move(filename+'rates_numba_base.npy','./data')
numpy.save(filename+'rates_numba', rates_numba)
Expand Down Expand Up @@ -375,77 +376,77 @@ class TestParsing(unittest.TestCase):
def test_RO2(self):
RO2_base=numpy.load('./data/'+filename+'_RO2_base.npy')
RO2=numpy.load(filename+'_RO2.npy')
npt.assert_almost_equal(RO2_base, RO2)
npt.assert_almost_equal(RO2_base, RO2, decimal=5)

def test_rates_fortran(self):
rates_fortran_base=numpy.load('./data/'+filename+'rates_fortran_base.npy')
rates_fortran=numpy.load(filename+'rates_fortran.npy')
npt.assert_almost_equal(rates_fortran_base, rates_fortran)
npt.assert_almost_equal(rates_fortran_base, rates_fortran, decimal=5)

def test_reactants_fortran(self):
reactants_fortran_base=numpy.load('./data/'+filename+'reactants_fortran_base.npy')
reactants_fortran=numpy.load(filename+'reactants_fortran.npy')
npt.assert_almost_equal(reactants_fortran_base, reactants_fortran)
npt.assert_almost_equal(reactants_fortran_base, reactants_fortran, decimal=5)

def test_dydt_fortran(self):
dydt_fortran_base=numpy.load('./data/'+filename+'dydt_fortran_base.npy')
dydt_fortran=numpy.load(filename+'dydt_fortran.npy')
npt.assert_almost_equal(dydt_fortran_base, dydt_fortran)
npt.assert_almost_equal(dydt_fortran_base, dydt_fortran, decimal=5)

def test_dydt_dydt_fortran(self):
dydt_dydt_fortran_base=numpy.load('./data/'+filename+'dydt_dydt_fortran_base.npy')
dydt_dydt_fortran=numpy.load(filename+'dydt_dydt_fortran.npy')
npt.assert_almost_equal(dydt_dydt_fortran_base, dydt_dydt_fortran)
npt.assert_almost_equal(dydt_dydt_fortran_base, dydt_dydt_fortran, decimal=5)

def test_rates_numba(self):
rates_numba_base=numpy.load('./data/'+filename+'rates_numba_base.npy')
rates_numba=numpy.load(filename+'rates_numba.npy')
npt.assert_almost_equal(rates_numba_base, rates_numba)
npt.assert_almost_equal(rates_numba_base, rates_numba, decimal=5)

def rates_fortran_numba(self):
rates_fortran_base=numpy.load('./data/'+filename+'rates_fortran_base.npy')
rates_numba_base=numpy.load('./data/'+filename+'rates_numba_base.npy')
npt.assert_almost_equal(rates_fortran_base, rates_numba_base)
#def test_rates_fortran_numba(self):
# rates_fortran_base=numpy.load('./data/'+filename+'rates_fortran_base.npy')
# rates_numba_base=numpy.load('./data/'+filename+'rates_numba_base.npy')
# npt.assert_almost_equal(rates_fortran_base, rates_numba_base, decimal=4)

def test_reactants_numba(self):
reactants_numba_base=numpy.load('./data/'+filename+'reactants_numba_base.npy')
reactants_numba=numpy.load(filename+'reactants_numba.npy')
npt.assert_almost_equal(reactants_numba_base, reactants_numba)
npt.assert_almost_equal(reactants_numba_base, reactants_numba, decimal=5)

def test_dydt_numba(self):
dydt_numba_base=numpy.load('./data/'+filename+'dydt_numba_base.npy')
dydt_numba=numpy.load(filename+'dydt_numba.npy')
npt.assert_almost_equal(dydt_numba_base, dydt_numba)
npt.assert_almost_equal(dydt_numba_base, dydt_numba, decimal=5)

def test_dydt_dydt_numba(self):
dydt_dydt_numba_base=numpy.load('./data/'+filename+'dydt_dydt_numba_base.npy')
dydt_dydt_numba=numpy.load(filename+'dydt_dydt_numba.npy')
npt.assert_almost_equal(dydt_dydt_numba_base, dydt_dydt_numba)
npt.assert_almost_equal(dydt_dydt_numba_base, dydt_dydt_numba, decimal=5)

def test_pressure_gas(self):
Pressure_gas_base=numpy.load('./data/'+filename+'Pressure_gas_base.npy')
Pressure_gas=numpy.load(filename+'Pressure_gas.npy')
npt.assert_almost_equal(Pressure_gas_base, Pressure_gas)
npt.assert_almost_equal(Pressure_gas_base, Pressure_gas, decimal=5)

def test_SOA_mass(self):
total_SOA_mass_base=numpy.load('./data/'+filename+'total_SOA_mass_base.npy')
total_SOA_mass=numpy.load(filename+'total_SOA_mass.npy')
npt.assert_almost_equal(total_SOA_mass_base, total_SOA_mass)
npt.assert_almost_equal(total_SOA_mass_base, total_SOA_mass, decimal=5)

def test_aw_array(self):
aw_array_base=numpy.load('./data/'+filename+'aw_array_base.npy')
aw_array=numpy.load(filename+'aw_array.npy')
npt.assert_almost_equal(aw_array_base, aw_array)
npt.assert_almost_equal(aw_array_base, aw_array, decimal=5)

def test_size_array(self):
size_array_base=numpy.load('./data/'+filename+'size_array_base.npy')
size_array=numpy.load(filename+'size_array.npy')
npt.assert_almost_equal(size_array_base, size_array)
npt.assert_almost_equal(size_array_base, size_array, decimal=5)

def test_dy_dt_calc(self):
dy_dt_calc_base=numpy.load('./data/'+filename+'dy_dt_calc_base.npy')
dy_dt_calc=numpy.load(filename+'dy_dt_calc.npy')
npt.assert_almost_equal(dy_dt_calc_base, dy_dt_calc)
npt.assert_almost_equal(dy_dt_calc_base, dy_dt_calc, decimal=5)


# Start of the main body of code
Expand Down

0 comments on commit 3bcebf6

Please sign in to comment.