Project 1 - Parsing NASA thermodynamic data
AIM:
To evaluate the thermodynamic properties cp,H&S polynomials came up with NASA also evaluate the polynomials for 1000+species that are documented.
OBJECTIVES:
- To write Write a function that extracts the 14 co-efficients and calculates the enthalpy, entropy and specific heats for all the species in the data file. You will be reading this file NASA thermodynamic data. The formulae are shown below.
- To calculate the molecular weight of each species and display it in the command window.
- To plot the Cp, Enthalpy and Entropy for the local temperature range (low temperature : high temperature) specific for each species.
- To save the plots as images with appropriate names and dump them in separate folders for each species with suitable name. All these should be generated automatically.
- The main program that you will submit will just take the "THERMO.dat" file as an input and generate Cp, H and S plots.
THEORY:
The thermodynamic properties in terms of the coefficients are given as :
CpR=a1+a2⋅T+a3⋅T2+a4⋅T3+a5⋅T4CpR=a1+a2⋅T+a3⋅T2+a4⋅T3+a5⋅T4
HRT=a1+a2⋅T2+a3⋅T23+a4⋅T34+a5⋅T45+a6THRT=a1+a2⋅T2+a3⋅T23+a4⋅T34+a5⋅T45+a6T
SR=a1⋅lnT+a2⋅T+a3⋅T22+a4⋅T33+a5⋅T44+a7SR=a1⋅lnT+a2⋅T+a3⋅T22+a4⋅T33+a5⋅T44+a7
The FIRST 7 coefficients are HIGH-temperature coefficients and the SECOND 7 coefficients are LOW-temperature coefficients.
Here R is the universal gas constant, T is the temperature.
- Specific Heat : It is defined as the amount of heat required to raise the temperature of unit mass of a substance by 1 degree.
- Enthalpy : It is the sum of the internal energy and the product of the pressure and volume of a thermodynaic process. Enthalpy is an energy-like property or state function—it has the dimensions of energy (and is thus measured in units of joules or ergs), and its value is determined entirely by the temperature, pressure, and composition of the system and not by its history.
- Entropy : It is the measure of a system’s thermal energy per unit temperature that is unavailable for doing useful work. Because work is obtained from ordered molecular motion, the amount of entropy is also a measure of the molecular disorder, or randomness, of a system. The concept of entropy provides deep insight into the direction of spontaneous change for many everyday phenomena.
- File parsing here means extracting the useful information from a file and utilizing that information for our program.
PROGRAM:
%program for file parsing of NASA thermodynamic file
close all
clear all
clc
%opening the external file
f1 = fopen('THERMO.dat','r')
header = fgetl(f1)
%obtaining global temperature values
%storing them as numbers in seperate values
groundTruth = fscanf(f1,'%f \n',[1,3]);
g_low_temp= groundTruth(1)
g_mid_temp= groundTruth(2)
g_high_temp= groundTruth(3)
line_3= fgetl(f1);%skipping the line
line_4= fgetl(f1);%skipping the line
line_5= fgetl(f1);
%defining input universal gas constant in KJ/K-mol-K
R= 8.314;
for i= 1:53
T= fgetl(f1);
%extracting the species name
species_name= T(1:9);
species_name= deblank(species_name); %removing blank spaces
%extracting local temperatures
species_temp= T(49:75);
local_values= strsplit(species_temp,' ');
l_low_temp= str2num(local_values{1});
l_mid_temp= str2num(local_values{3});
l_high_temp= str2num(local_values{2});
%storing the local temperatures in a variable
temp= [l_low_temp l_mid_temp l_high_temp];
temp_range=linspace(l_low_temp,l_high_temp,500);
coeff= fgetl(f1);
coeff1= findstr(coeff,'E');
%extracting the coefficients
a1= coeff(1:coeff1(1)+3);
a1= str2num(a1);
a2= coeff(coeff1(1)+4:coeff1(2)+3);
a2= str2num(a2);
a3= coeff(coeff1(2)+4:coeff1(3)+3);
a3= str2num(a3);
a4= coeff(coeff1(3)+4:coeff1(4)+3);
a4= str2num(a4);
a5= coeff(coeff1(4)+4:coeff1(5)+3);
a5= str2num(a5);
new_line= fgetl(f1);
coeff2= findstr(new_line,'E');
a6= new_line(1:coeff2(1)+3);
a6= str2num(a6);
a7= new_line(coeff2(1)+4:coeff2(2)+3);
a7= str2num(a7);
a8= new_line(coeff2(2)+4:coeff2(3)+3);
a8= str2num(a8);
a9= new_line(coeff2(3)+4:coeff2(4)+3);
a9= str2num(a9);
a10= new_line(coeff2(4)+4:coeff2(5)+3);
a10= str2num(a10);
new_line1= fgetl(f1);
coeff_3= findstr(new_line1,'E');
a11= new_line1(1:coeff_3(1)+3);
a11= str2num(a11);
a12= new_line1(coeff_3(1)+4:coeff_3(2)+3);
a12= str2num(a12);
a13= new_line1(coeff_3(2)+4:coeff_3(3)+3);
a13= str2num(a13);
a14= new_line1(coeff_3(3)+4:coeff_3(4)+3);
a14= str2num(a14);
%specific heat calculation
Cp= specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,temp,temp_range,R);
%enthalpy calculation
H= enthaply(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a2,a13,temp,temp_range,R);
%entropy calculation
S= entropy_1(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,temp,temp_range,R);
%calculation of molecular weight
m_weight= weight(species_name);
%saving molecular weight
species_w= fopen('species_mass.txt','w');
fprintf(species_w,'molecular mass of %s is %f',species_name,m_weight);
fclose(species_w);
%plotting and saving
cur_dir=pwd;
%making a new folder for each species
mkdir(species_name);
cd(species_name);
figure(1)
plot(temp_range,Cp,'linewidth',2,'color',[0.2345 0.4567 0.5678])
xlabel('Temperature(K)');
ylabel('Specific heat(KJ/kg-K)');
title(species_name);
figure(2),
plot(temp_range,H,'LineWidth',2,'color',[0.5678 0.3423 0.7874])
xlabel('Temperature(K)');
ylabel('Enthalpy(KJ/Kg)');
title(species_name);
figure(3)
plot(temp_range,S,'LineWidth',2,'color',[0.4532 0.1234 0.3324])
xlabel('Temperature(K)');
ylabel('Entropy(KJ/K)');
title(species_name);
%saving the plots in spearate folder for each species
saveas(1,'specific heat.jpg');
saveas(2,'enthalpy.jpg');
saveas(3,'entropy.jpg');
cd(cur_dir);
%printing the molcular weight of the species
sprintf('molecular weight of %s = %f',species_name,m_weight)
end
%closing the file
fclose(f1)
function[Cp]= specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,temp,temp_range,R)
%a1 a2 a3 a4 a5 are high temperature coefficients
%a8 a9 a10 a11 a12 are low temperature coefficients
for i= 1:length(temp_range)
if temp_range(i)<=temp(2)
Cp(i)= R*(a8 + (a9*temp_range(i)) + (a10*(temp_range(i).^2)) + (a11*(temp_range(i).^3)) + (a12*(temp_range(i).^4)));
else
Cp(i)= R*(a1 + (a2*temp_range(i)) + (a3*(temp_range(i).^2)) + (a4*(temp_range(i).^3)) + (a5*(temp_range(i).^4)));
end
end
function[H]= enthaply(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,temp,temp_range,R)
%a1 a2 a3 a4 a5 are high temperature coefficients
%a8 a9 a10 a11 a12 are low temperature coefficients
for i= 1:length(temp_range)
if temp_range(i)<=temp(2)
H(i)= R*((a8*temp_range(i)) + (a9*((temp_range(i).^2)/2)) + (a10*((temp_range(i).^3)/3)) + (a11*((temp_range(i).^4)/4)) + (a12*((temp_range(i).^5)/5)) + a13);
else
H(i)= R*((a1*temp_range(i)) + (a2*((temp_range(i).^2)/2)) + (a3*((temp_range(i).^3)/3)) + (a4*((temp_range(i).^4)/4)) + (a5*((temp_range(i).^5)/5)) + a6);
end
end
function[S]= entropy_1(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,temp,temp_range,R)
%a1 a2 a3 a4 a5 are high temperature coefficients
%a8 a9 a10 a11 a12 are low temperature coefficients
for i= 1:length(temp_range)
if temp_range(i)<=temp(2)
S(i)= R.*((a8*log(temp_range(i))) + (a9*temp_range(i)) + (a10*((temp_range(i).^2)/2)) + (a11*((temp_range(i).^3)/3)) + (a12*((temp_range(i).^4)/4)) + a14);
else
S(i)= R.*((a1*log(temp_range(i))) + (a2*temp_range(i)) + (a3*((temp_range(i).^2)/2)) + (a4*((temp_range(i).^3)/3)) + (a5*((temp_range(i).^4)/4)) + a7);
end
end
function[m_weight]= weight(species_name)
element= {'H','O','N','Ar','C','S'};
atomic_mass= [1.008, 15.999, 14.007, 39.948, 12.011, 32.065];
m_weight=0;
for i= 1:length(species_name)
for j= 1:length(element)
if strcmp(species_name(i),element(j))
m_weight= m_weight + atomic_mass(j);
a= j;
end
end
b= str2num(species_name(i));
if b>1
m_weight= m_weight + atomic_mass(a)*(b-1);
end
end
end
EXPLANATION:
- The program begins with the clear all, close all and clc commands to free up the command window and the workspace.
- We will then read the data from the external NASA thermodynamic file using fopen(to open the file) and fgetl(to read the content in the file line by line) commands.
- The useful header information will be extracted from the file such as global temperature limits.
- Then we will proceed to extract the individual species data of all the species present in the file using fgetl command to read the file line by line and skipping the line not containing any useful data.
- The data that is to be extracted for all the 53 species mentioned in the file are 14 coefficients(7 for higher temperature and & for lower temperature), species name and the local temperature limits.
- This process will be carried out with the help of a for loop.
- Calculation of specific heat, enthalpy, entropy and molecular weight will be done in separate function files and will be called in the main program.
- Then we will create plots for specific heat v/s temperature, enthalpy v/s temperature and entropy v/s temperature for all the 53 species and these 3 plots will be saved in separate folders for each species.
- After this we will display the molecular weight of all the species in the command window.
- The code for the entire program will be written in MATLAB.
ERROR FACED
OUTPUT
'molecular weight of CO2 = 44.009000'
'molecular weight of O2 = 31.998000'
'molecular weight of N2 = 28.014000'
FOLDER