Parsing NASA's Thermodynamic Data File.
AIM: Write a code in Matlab to parse the NASA's Thermodynamic Data File and then calculate Thermodynamic properties of
various gas species.
OBJECTIVES:
- 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 (low temperature : high temperature) specific for
each species.
- 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.
- Screenshot of the window where all the folders are saved.
- Plots for O2, N2 and CO2 species.
GOVERNING EQUATIONS:
where,
R = Universal Gas constant
T = Temperature
Cp = Specific heat (KJ)
S = Entropy(KJ/mol-K)
H = Enthalpy(KJ/mol)
a(i) = Coefficients, where, i = 1 to 14
BODY OF THE CONTENT:
PARSING
- Parsing, syntax analysis, or syntactic analysis is the process of analyzing a string of symbols, either in natural language,
computer languages or data structures, conforming to the rules of a formal grammar. The term parsing comes from Latin pars (orationis), meaning part (of speech).
- Parsing in computer languages refers to syntactic analysis of the input code into its components parts in order to facilitate the writing of compilers and interpreters. It can be used to describe split or separation.
- Parsing a file means reading in a data stream of some sort and building an in memory model of the semantic content of that data. This aims at facilitating perfoming some kind of transformation on the data.
TYPES OF PARSERS
- The task of the parser is essentially to determine if and how the input can be derived from the start symbol of the grammar.
- This can be done in essentially two ways:
- Top-down parsing - Top-down parsing can be viewed as an attempt to find left-most derivations of an input-stream by
searching for parse trees using a top-down expansion of the given formal grammar rules. Tokens are consumed from left to
right. Inclusive choice is used to accommodate ambiguity by expanding all alternative right-hand-sides of grammar rules.
This is known as the primordial soup approach. Very similar to sentence diagramming, primordial soup breaks down the
constituencies of sentences.
- Bottom-up parsing - A parser can start with the input and attempt to rewrite it to the start symbol. Intuitively, the parser
attempts to locate the most basic elements, then the elements containing these, and so on. LR parsers are examples of
bottom-up parsers. Another term used for this type of parser is Shift-Reduce parsing.
MAIN CODE THAT CALCULATES THERMODYNAMIC PROPERTIES OF 53 SPECIES IS AS FOLLOWS:
clear all
close all
clc
%Input
R = 8.314; % Universal Gas Constant
% Opening the file and reading THERMO.dat file
f1 = fopen('THERMO.dat','r')
get = fgetl(f1);
% Reading temperatures from this file
temp = fgetl(f1);
%Spliting
s = strsplit(temp);
% Converting strings cells into numbers
templow = str2num(s{2});
tempmid = str2num(s{3});
temphigh = str2num(s{4});
% Temperature range
T = linspace(templow,temphigh,1000);
%Skipping comment lines
for i=1:3
get=fgetl(f1);
end
% Reading the species
for j=1:53
tline=fgetl(f1);
A=strsplit(tline,' '); % Spliting into cell array
species = (A{1}); % To read the name of the species
% Converting string to number
lowtemp = str2num(A{end-3});
midtemp = str2num(A{end-2});
hightemp = str2num(A{end-1});
tline1 = fgetl(f1); % Getting next line
a = strfind(tline1,'E'); % Finding the string E
% Finding First 7 higher and second 7 lower coefficients
%Finding Higher coefficients
a1 = tline1(1:a(1)+3);
a1 = str2num(a1);
a2 = tline1(a(1)+4:a(2)+3);
a2 = str2num(a2);
a3 = tline1(a(2)+4:a(3)+3);
a3 = str2num(a3);
a4 = tline1(a(3)+4:a(4)+3);
a4 = str2num(a4);
a5 = tline1(a(4)+4:a(5)+3);
a5 = str2num(a5);
tline2 = fgetl(f1);
b = strfind(tline2,'E');
a6 = tline2(1:b(1)+3);
a6 = str2num(a6);
a7 = tline2(b(1)+4:b(2)+3);
a7 = str2num(a7);
% Finding Lower coefficients
a8 = tline2(b(2)+4:b(3)+3);
a8 = str2num(a8);
a9 = tline2(b(3)+4:b(4)+3);
a9 = str2num(a9);
a10 = tline2(b(4)+4:b(5)+3);
a10 = str2num(a10);
tline3 = fgetl(f1);
c = strfind(tline3,'E');
a11 = tline3(1:c(1)+3);
a11 = str2num(a11);
a12 = tline3(c(1)+4:c(2)+3);
a12 = str2num(a12);
a13 = tline3(c(2)+4:c(3)+3);
a13 = str2num(a13);
a14 = tline3(c(3)+4:c(4)+3);
a14 = str2num(a14);
% Calculating Specific Heat
Cp = Specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,T,R,tempmid);
% Calculating Entropy
S = Entropy(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,T,R,tempmid);
% Calculating Enthalpy
H = Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,T,R,tempmid);
% Calculating molecular weight of the Species
W = Molecular_weight(species);
% Writing molecular weight file
MW_file = fopen('Molecular Weight.txt','w');
fprintf(MW_file,'Molecular weight of %s is %d ',species,W);
fclose(MW_file); % Closing the file
%Plotting Cp, H and S with Temperature
% Saving in a folder
cd('C:UsersSB ComputersDocumentsMATLAB Codes(Skill-Linc)New Folder') % Changing directory
mkdir(species); % Creating directory
cd(species);
% Plot 1 Cp vs T
figure(1)
plot(T,Cp,'linewidth',2,'color','b');
xlabel('Temperature(K)');
ylabel('Specific Heat(KJ)');
title(sprintf('Specific heat vs Temperature range of %s',species));
grid on
saveas(figure(1),'Specific Heat.jpg');
% Plot 2 S vs T
figure(2)
plot(T,S,'linewidth',2,'color','r');
xlabel('Temperature');
ylabel('Entropy(KJ/mol-K)');
title(sprintf('Entropy vs Temperature range of %s',species));
grid on
saveas(figure(2),'Entropy.jpg');
% Plot 3 Cp vs T
figure(3)
plot(T,H,'linewidth',2,'color','g');
xlabel('Temperature');
ylabel('Enthalpy(KJ/mol)');
title(sprintf('Enthalpy vs Temperature range of %s',species));
grid on
saveas(figure(3),'Enthalpy.jpg');
cd('C:UsersSB ComputersDocumentsMATLAB Codes(Skill-Linc)') % Changing directory to original matlab path
% Molecular weight
W = Molecular_weight(species)
end
EXPLANATION OF THE ABOVE CODE:
- In the very first step we will input R, open the file THERMO.dat and peruse the same. For reading the file we'll be usinf fopen command.
- After this, we will read the first line of the THERMO.dat file using fgetl command and then we will read temperatures file and we will split the temperatures using strsplit command to convert it into cell array and then we will convert this string to number using str2num command to find low, high and mid temperatures.
- Next step is to assign the temperature range using linspace command. We skip the first three comment lines by using a for loop and fgetl command inside the for loop.
- Followed this we will run the loop to find 53 species or elements in the data file by assigning fgetl command and then spliting into the cell array to find the species line and then find the species name followed by finding the number of the temperatures in the species line.
- Then we read the new line. In order to read the coefficient in the data file we will first find the 'E' string using strfind
command to find before and after numbers of the coefficients then we will find remaining 14 coefficients and convert
them to numbers from strings. Note that, first 7 Coefficients are for Higher temperatures and then Second 7 Coefficients are for Lower temperatures.
- Next most important step is to specify Specific heat Cp, Entropy S, Enthalpy H functions to find these parameters using these 14 coefficients for Lower and Higher Temperatures. Then we will specify molecular weight W function to find the Molecular weight of the 53 different species.
- Now we will write the Molecular weight.txt file using fprintf command and then close the txt file using fclose command.
- Post that we change the directory using cd command and then create directory folder where we have to save our files using mkdir command and then will change the directory to this created folder.
- Now, we will plot Specific heat, Entropy and Enthalpy with the Temperature for different species. For title we will be using sprintf command. Then we will use saveas command to save the plots of different species in the directory folder. Now we will change the directory to which our main code file runs in the MATLAB.
FUNCTION CODE THAT CALCULATES SPECIFIC HEAT:
function Cp = Specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,T,R,tempmid)
% Calculating specific heat for higher and lower temperatures repectively.
if (T <= tempmid)
Cp = R*(a8 + (a9*T) + (a10*(T).^2) + (a11*(T).^3) + (a12*(T).^4));
else
Cp = R*(a1 + (a2*T) + (a3*(T).^2) + (a4*(T).^3) + (a5*(T).^4));
end
end
EXPLANATION OF THE ABOVE CODE:
- Firstly we will define a function named Specific_heat which stores 14 coefficients with Universal Gas Constant, Temperature and mid temperature.
- Now we will creatre an condition using if loop and make the temperature less than and equal to mid temperature to
specify lower temperature coefficent in the formula.
- And for all other temperatures above mid temperature we will use else statement.
- Eventually after the execution, the specific heat of all the species will be calculated by this function.
FUNCTION CODE THAT CALCULATES ENTROPY:
function S = Entropy(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,T,R,tempmid)
% Calculating entropy for higher and lower temperature repectively.
if (T <= tempmid)
S = R*(a8.*log(T) + (a9*T) + ((a10*(T).^2)/2) + ((a11*(T).^3)/3) + ((a12*(T).^4)/4) +
a14);
else
S = R*(a1.*log(T) + (a2*T) + ((a3*(T).^2)/2) + ((a4*(T).^3)/3) + ((a5*(T).^4)/4) + a7);
end
end
EXPLANATION OF THE ABOVE CODE:
- Firstly we will define a function named Entropy which stores 14 coefficients with Universal Gas Constant, Temperature and mid temperature.
- Now we will creatre an condition using if loop and make the temperature less than and equal to mid temperature to
specify lower temperature coefficent in the formula.
- And for all other temperatures above mid temperature, we will use else statement.
- Eventually after the execution, the specific heat of all the species will be calculated by this function.
FUNCTION CODE THAT CALCULATES ENTHALPY:
function H = Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,T,R,tempmid)
% Calculating enthalpy for higher and lower temperature repectively.
if (T <= tempmid)
H = R*T.*(a8 + ((a9*T)/2) + ((a10*(T).^2)/3) + ((a11*(T).^3)/4) + ((a12*(T).^4)/5) + ((a13./T)));
else
H = R*T.*(a1 + ((a2*T)/2) + ((a3*(T).^2)/3) + ((a4*(T).^3)/4) + ((a5*(T).^4)/5) + ((a6./T)));
end
end
EXPLANATION OF THE ABOVE CODE:
- Firstly we will define a function named Enthalpy which stores 14 coefficients with Universal Gas Constant, Temperature and mid temperature.
- Now we will creatre an condition using if loop and make the temperature less than and equal to mid temperature to
specify lower temperature coefficent in the formula.
- And for all other temperatures above mid temperature, we will use else statement.
- Eventually after the execution, the specific heat of all the species will be calculated by this function.
FUNCTION CODE THAT CALCULATES MOLECULAT WEIGHT:
function W = Molecular_weight(species)
% Defining Atomic name of the species
atomic_name = ['H','C','O','N','Ar'];
% Defining Atomic masses of main species
atomic_weight = [1.008 12.011 15.999 14.007 39.948];
W=0; % Molecular weight starting range
for i=1:length(species) % Loop runs to the length of the species
for j=1:length(atomic_name) % Loop runs to the length of the atomic names
if strcmp(species(i), atomic_name(j)) % Function to compare 2 strings
W = W + atomic_weight(j);
position = j;
end
end
n = str2num(species); % To find if there is more element in the species then incrementing atomic weight of the species
if n>1
W = W + atomic_weight(position)*(n-1);
end
end
fprintf('Molecular Weight of %s :- ',species);
fprintf('%f',W);
disp(' ')
end
EXPLANATION OF THE ABOVE CODE:
- Initially, we create a Molecular_weight function W and assign the species input to it.
- Then we define the main elements of all 53 species in an array named atomic_name that are :- 'H','C','O','N','Ar'.
- Then by taking above main elements we will create an atomic_weight array which consists of atomic weights of all the above elements. The source can be the internet, which has mentioned the atomic weights of all the elements above as:1.008 12.011 15.999 14.007 39.948 respectively.
- Then we will assign molecular weight starting range W To zero and then create a for loop condition which runs to the length of the species and another nested for loop is created which runs to the length of the string atomic_name.
- Then we will create an condition using if command and use strcmp command to compare the species and atomic_name
strings to calculate molecular masses, if by comparison both strings are found to be the same then we will assign its molecular weight.
- Eventually we will convert string to number using str2num command and assign it to n. Then we run an condition of if loop to find whether the species contains more than one element, if there is more then 1 element that is, n>1 then we will increment the atomic weight by multiplication of position and n-1 to the atomic_weight array.
- Followed this we will print the molecular weight using fprintf command and display it using disp command.
No errors were encountered by me.
PLOTS FOR O2, N2 AND CO2 ARE AS FOLLOWS:
Enthalpy v/s Temperature plot for the specie O2:

Entropy v/s Temperature plot for the specie O2:

Specific Heat v/s Temperature plot for the specie O2:

Enthalpy v/s Temperature plot for the specie N2:

Entropy v/s Temperature plot for the specie N2:

Specific Heat v/s Temperature plot for the specie N2:

Enthalpy v/s Temperature plot for the specie CO2:

Entropy v/s Temperature plot for the specie CO2:

Specific Heat v/s Temperature plot for the specie CO2:

Screenshot of the Directory where 53 species are saved with their respective plots:

Output consisting of molecular weight of different species:














Variables and arrays in the Workspace:

CONCLUSION:
This is how we can calculate a function that extracts the 14 co-efficients and calculates the enthalpy, entropy and specific heats for all the species in the data file of NASA, 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, save the plots as images with appropriate names and dump them in separate folders for each species with suitable name, which are generated automatically.