Project 1 - Parsing NASA thermodynamic data
PARSING NASA THERMODYNAMIC DATA
AIM- 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. Calculate the molecular weight of each species and display it in the command window.Plot the Cp, Enthalpy and Entropy for the local temperature range specific for each species.
OBJECTIVES-
- Write a code in MATLAB to parse the NASA thermodynamic data file.
- 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.
- Calculate the molecular weight of each species and displaying it in the command window.
- Plot the Cp, Enthalpy and Entropy for the local temperature range (low temperature : high temperature) specific for each species.
- Save the plots as images with appropriate names and dumping them in separate folders for each species with suitable name.
INTRODUCTION-
NASA came up with polynomials that can be used to evaluate thermodynamic properties such as Cp, H and S. They have also documented the co-efficients that are required to evaluate these polynomials for 1000+ species.
The formulae are shown below.
Here R is the universal gas constant, T is the temeprature
The FIRST 7 coefficients are HIGH-temperature coefficients and the SECOND 7 coefficients are LOW-temperature coefficients.
Parsing data or information means to break it down into component parts so that its syntax can be analyzed, categorized, and understood. A parser is a compiler or interpreter component that breaks data into smaller elements for easy translation into another language. A parser takes input in the form of a sequence of tokens or program instructions and usually builds a data structure in the form of a parse tree or an abstract syntax tree. A parser is commonly used as a component of an interpreter or a compiler.
The overall process of parsing involves three stages:
- Lexical Analysis: A lexical analyzer is used to produce tokens from a stream of input string characters, which are broken into small components to form meaningful expressions.
- Syntactic Analysis: Checks whether the generated tokens form a meaningful expression. This makes use of a context-free grammar that defines algorithmic procedures for components. These work to form an expression and define the particular order in which tokens must be placed.
- Semantic Parsing: The final parsing stage in which the meaning and implications of the validated expression are determined and necessary actions are taken.
SOLUTION-
- We use the command fopen opens the thermodynamic data file [therm.dat] and stores it to a file Id called f1. 'fgetl' of f1 command takes the value of the first line of the therm.dat file.
- The 2nd line in the file represents global temperatures, thus the values are stored for temperature calculations using it.
- Since the temperatures are inside the string we use 'strsplit' command that splits the string in the specified delimiter, here ' ' (space) is the delimiter, after splitting the values are assigned to variables ( global low, mid and high temperatures), using 'str2double' command string value is converted to the numeric value.
- A temperature range with 500 values between global high and low temperature is made by using 'linspace' command, the number of values is specified by this command too.
- Preallocations are made to store the properties or data of all the elements present in the file.
- We then skip the 3 comment lines present in the therm.dat file, which has command 'fgetl of f1'.
- Command 'cd(pwd)' opens a present working directory. 'mkdir' command makes a new folder with the name specified inside brackets.
- A folder named 'Elements' is created in the working directory which is used to store all the related output files of the program.
- Command 'cd()' makes the new folder as the directory. At last, a 'for' loop must run 'j' times, where j is a number of elements.
- After the loop gets executed, cd .. is used to get back to the original directory.
MATLAB SCRIPT-
For main program:
%program for file parsing of NASA thermodynamic file
close all
clear all
clc
%opening the external file
f1= fopen('THERMO.dat','r')
line_1= fgetl(f1); %skipping this line
line_2= fgetl(f1);
%obtaining global temperature values
%storing them as numbers in seperate values
global_values= strsplit(line_2,' ');
g_low_temp= str2num(global_values{2})
g_mid_temp= str2num(global_values{3})
g_high_temp= str2num(global_values{4})
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= enthalpy(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)
For calculation of specific heat:
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
For calculation of enthalpy:
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
For calculation of entropy:
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
For calculation of molecular weight:
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
RESULTS-
Plots of O2:
Plots of N2:
Plot for CO2:
Screenshots of folders of species generated after executing code:
REFERENCES:
https://in.mathworks.com/help/matlab/ref/deblank.html
https://in.mathworks.com/help/matlab/ref/mkdir.html?searchHighlight=mkdir&s_tid=doc_srchtitle