Project 1 - Parsing NASA thermodynamic data
AIM: To write a program in Matlab to parse the NASA thermodynamic data file and then calculate the thermodynamic properties of various gas species.
OBJECTIVE:
- To write a function that extracts the 14 co-efficient and calculates the enthalpy, entropy, and specific heats for all species in the data file.
- Calculating the molecular weight of each species and displaying it in the command window.
- Plotting cp, enthalpy, and entropy for local temperature range specified for each species.
- Save the plot as images with appropriate names and dump them in separate folders for each species with a suitable name.
INTRODUCTION:
PARSING DATA:
- Parsing means to make something understandable. For programming, this means converting information represented in one form into another form that's easier to work with. This is done by partially analyzing the data, understanding its underlying structure (by making some assumptions based on what you're expecting to see), and then explicitly representing that structure in the code.
- 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 performing some kind of transformation on the data.
EQUATIONS:
The equations that we are going to use in the Functions to calculate cp, H, and S are:

Where,
Cp=specific heat
R =molar gas constant
T=temperature
S=Entropy
H=Enthalpy
a=coefficients
BODY OF THE CONTENT:
1. Specific Heat:
It is the amount of energy that must be added, in the form of heat, to one unit of mass of the substance in order to cause an increase of one unit in its temperature.
Code for calling function Specific_heat( ):
function Cp = Specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,T,R,global_midtemp)
%calculating specific_heat for higher and lower temperature respectively
if(T>= global_midtemp)
Cp=R*(a1+(a2*T)+(a3*(T).^2)+(a4*(T).^3)+(a5*(T).^4));
else
Cp=R*(a8+(a9*T)+(a10*(T).^2)+(a11*(T).^3)+(a12*(T).^4));
end
end
2. Enthalpy:
Enthalpy, a property of a thermodynamic system, is equal to the system's internal energy plus the product of its pressure and volume. In a system enclosed so as to prevent mass transfer, for processes at constant pressure, the heat absorbed or released equals the change in enthalpy.
Code for calling function Enthalpy( ):
function H = Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,T,R,global_midtemp)
%calculating enthalpy for higher and lower temperature respectively
if(T>=global_midtemp)
H=R*((a1*T)+((a2*(T).^2)/2)+((a3*(T).^3)/3)+((a4*(T).^4)/4)+((a5*(T).^5)/5)+a6);
else
H=R*((a8*T)+((a9*(T).^2)/2)+((a10*(T).^3)/3)+((a11*(T).^4)/4)+((a12*(T).^5)/5)+a13);
end
end
3. Entropy:
Entropy 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.
Code for calling function Entropy( ):
function S=Entropy(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,T,R,global_midtemp)
%calculating entropy for higher and lower temperature respectively
if(T>= global_midtemp)
S=R*(a1.*log(T)+(a2*T)+((a3*(T).^2)/2)+((a4*(T).^3)/3)+((a5*(T).^4)/5)+a7);
else
S=R*(a8.*log(T)+(a9*T)+((a10*(T).^2)/2)+((a11*(T).^3)/3)+((a12*(T).^4)/4));
end
end
4. Molecular Weight:
The molecular mass is the mass of a given molecule: it is measured in daltons. Different molecules of the same compound may have different molecular masses because they contain different isotopes of an element.
Code for calculating molecular weight by calling function wt( ):
function Molecular_weight=wt(species_name)
Elements=['H' 'C' 'O' 'N' 'A' 'S'];
Atomic_weight =[1 12 16 14 40 32];
species=upper(species_name)
Molecular_weight=0;
for i=1:length(species)
for j=1:length(Elements)
if strcmp(species(i),Elements(j))
Molecular_weight=Molecular_weight+Atomic_weight(j);
k=j;
else
n=str2double(species(i));
if (n>1)
Molecular_weight=Molecular_weight+Atomic_weight(k)*(n-1);
break
end
end
end
end
end
MAIN CODE:
clear all
close all
clc
%R=molar gas constant
R=8.314;
%syntax to open the file THERMO.dat
f1=fopen('THERMO.dat','r')
%To read lines
l1=fgetl(f1);
l2=fgetl(f1);
value=strsplit(l2,' ');
%To get global temperatures from file in number form
global_lowtemp=str2num(value{2})
global_midtemp=str2num(value{3})
global_hightemp=str2num(value{4})
%temperature range
T=linspace(global_lowtemp,global_hightemp,1000);
%skipping these 3 lines
l3=fgetl(f1);
l4=fgetl(f1);
l5=fgetl(f1);
%Reading species ,calcuating cp,h,s and plotting
for i=1:53
tline=fgetl(f1);
A=strsplit(tline,' ');
name_of_species=(A{1});
lowtemp= str2num(A{end-3});
midtemp=str2num(A{end-2});
hightemp=str2num(A{end-1});
%Finding 7 higher coefficients and 7 lower coefficients
tline1=fgetl(f1);
a=findstr(tline1,'E');
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);
a=findstr(tline2,'E');
a6=tline2(1:a(1)+3);
a6=str2num(a6);
a7=tline2(a(1)+4:a(2)+3);
a7=str2num(a7);
a8=tline2(a(2)+4:a(3)+3);
a8=str2num(a8);
a9=tline2(a(3)+4:a(4)+3);
a9=str2num(a9);
a10=tline2(a(4)+4:a(5)+3);
a10=str2num(a10);
tline3=fgetl(f1);
a=findstr(tline3,'E');
a11=tline3(1:a(1)+3);
a11=str2num(a11);
a12=tline3(a(1)+4:a(2)+3);
a12=str2num(a12);
a13=tline3(a(2)+4:a(3)+3);
a13=str2num(a13);
a14=tline3(a(3)+4:a(4)+3);
a14=str2num(a14);
%calculate specific heat(cp),Enthalpy(H),Entropy(S)
Cp=Specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,T,R,global_midtemp);
H=Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,T,R,global_midtemp);
S=Entropy(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,T,R,global_midtemp);
%calculating molecular weight and printing it.
Molecular_weight=wt(name_of_species);
fprintf('molecular weight of %s= %f\n',name_of_species,Molecular_weight);
%PLOTTING CP,H,T
cd('D:\MATLAB\test')
%creating the folder
mkdir(name_of_species);
cd(name_of_species);
%plotting T vs cp
figure(1)
plot(T,Cp,'linewidth',5,'color','r')
xlabel('Temperature(T)')
ylabel('Specific heat(cp)')
grid on
title(name_of_species)
saveas(figure(1),'specific heat.jpg');
%Plotting T vs H
figure(2)
plot(T,H,'linewidth',5,'color','b')
xlabel('Temperature(T)')
ylabel('Enthalpy(H)')
grid on
title(name_of_species)
saveas(figure(2),'Enthalpy.jpg');
%Plotting T vs S
figure(3)
plot(T,S,'linewidth',5,'color','y')
xlabel('Temperature(T)')
ylabel('Entropy(S)')
grid on
title(name_of_species)
saveas(figure(3),'Entropy.jpg');
cd('D:\MATLAB\test')
end
The explanation for code:
- Initially, the value of ‘R’ is defined.
- Then we use a command to open the file ‘THERMO.dat’.
- Further, we use the ‘fgetl’ to start reading the lines and after reading the first two lines, from the second line convert the strings to numbers and assign global (low, mid, and high) temperatures.
- Then we have written a command to get the temperature range for calculation and plotting purposes.
- Then again using the fgetl command to go to the next 3 lines and skip it.
- Then we use a for loop to get 53 species and their temperatures (low, mid, high) and the 14 coefficients.
- In the for loop we again use the fgetl command and then the next line is read and from that line, the species name and the three local temperatures are read and stored.
- Then we use fgetl command to go to a further line and get the first 7 coefficients and store them. Similarly using the fgetl command we move to the next two lines and get the remaining coefficients.
- Then after getting the 14 coefficients, we use these coefficients and by calling the functions we calculate cp, H, S.
- Further, we use the Molecular weight function and calculate the molecular weight for that species.
- Further, I have used a command to change the directory so that I can save the files at a particular location. After changing the directory I used ‘mkdir' to create a new folder with the name of the current species and then a ‘cd’ command to make mkdir the current directory.
- Then further we use the plot command to plot temperature vs (cp, enthalpy, entropy) .
- In this plotting, we use the figure command to get the three different plots and save as command to save the figures in the
- Then again we change our directory to again start the loop. So the loop continues to function till we get all the 53 species and then gets terminated.
ERRORS:
In this, there was a typing error in the function name. I changed the function name (i.e. ‘s’ to ‘S’ ) and the problem was solved.
Here I made a mistake in writing the formula in the function .so after correcting the formula I was able to get the output.
OUTPUTS:
- Plots for oxygen(o2) :


- Plots for nitrogen(N2) :


Plots for carbon dioxide(co2) :


- Screenshot of the folder:

Molecular weights:-
species =
'O'
molecular weight of O= 16.000000
species =
'O2'
molecular weight of O2= 32.000000
species =
'H'
molecular weight of H= 1.000000
species =
'H2'
molecular weight of H2= 2.000000
species =
'OH'
molecular weight of OH= 17.000000
species =
'H2O'
molecular weight of H2O= 18.000000
species =
'HO2'
molecular weight of HO2= 33.000000
species =
'H2O2'
molecular weight of H2O2= 34.000000
species =
'C'
molecular weight of C= 12.000000
species =
'CH'
molecular weight of CH= 13.000000
species =
'CH2'
molecular weight of CH2= 14.000000
species =
'CH2(S)'
molecular weight of CH2(S)= 46.000000
species =
'CH3'
molecular weight of CH3= 15.000000
species =
'CH4'
molecular weight of CH4= 16.000000
species =
'CO'
molecular weight of CO= 28.000000
species =
'CO2'
molecular weight of CO2= 44.000000
species =
'HCO'
molecular weight of HCO= 29.000000
species =
'CH2O'
molecular weight of CH2O= 30.000000
species =
'CH2OH'
molecular weight of CH2OH= 31.000000
species =
'CH3O'
molecular weight of CH3O= 31.000000
species =
'CH3OH'
molecular weight of CH3OH= 32.000000
species =
'C2H'
molecular weight of C2H= 25.000000
species =
'C2H2'
molecular weight of C2H2= 26.000000
species =
'C2H3'
molecular weight of C2H3= 27.000000
species =
'C2H4'
molecular weight of C2H4= 28.000000
species =
'C2H5'
molecular weight of C2H5= 29.000000
species =
'C2H6'
molecular weight of C2H6= 30.000000
species =
'CH2CO'
molecular weight of CH2CO= 42.000000
species =
'HCCO'
molecular weight of HCCO= 41.000000
species =
'HCCOH'
molecular weight of HCCOH= 42.000000
species =
'H2CN'
molecular weight of H2CN= 28.000000
species =
'HCN'
molecular weight of HCN= 27.000000
species =
'HNO'
molecular weight of HNO= 31.000000
species =
'N'
molecular weight of N= 14.000000
species =
'NNH'
molecular weight of NNH= 29.000000
species =
'N2O'
molecular weight of N2O= 44.000000
species =
'NH'
molecular weight of NH= 15.000000
species =
'NH2'
molecular weight of NH2= 16.000000
species =
'NH3'
molecular weight of NH3= 17.000000
species =
'NO'
molecular weight of NO= 30.000000
species =
'NO2'
molecular weight of NO2= 46.000000
species =
'HCNO'
molecular weight of HCNO= 43.000000
species =
'HOCN'
molecular weight of HOCN= 43.000000
species =
'HNCO'
molecular weight of HNCO= 43.000000
species =
'NCO'
molecular weight of NCO= 42.000000
species =
'CN'
molecular weight of CN= 26.000000
species =
'HCNN'
molecular weight of HCNN= 41.000000
species =
'N2'
molecular weight of N2= 28.000000
species =
'AR'
molecular weight of AR= 40.000000
species =
'C3H8'
molecular weight of C3H8= 44.000000
species =
'C3H7'
molecular weight of C3H7= 43.000000
species =
'CH3CHO'
molecular weight of CH3CHO= 44.000000
species =
'CH2CHO'
molecular weight of CH2CHO= 43.000000
Screenshots for the above data attached:










Conclusion :
Using MATLAB code, the necessary coefficients required to evaluate various thermodynamic parameters for different species are extracted from NASA thermodynamic data file. The specific heat, enthalpy, and entropy for all the species are calculated and plotted against the local temperature range. The molecular weight is calculated for all the species.
References :
https://in.mathworks.com/help/matlab/ref/mkdir.html
https://in.mathworks.com/matlabcentral/answers/317006-create-new-folders-by-mkdir
https://in.mathworks.com/help/matlab/ref/saveas.html
https://in.mathworks.com/matlabcentral/answers/17580-how-to-define-a-path-in-saveas-command
https://in.mathworks.com/help/matlab/ref/msgbox.html
https://www.mathworks.com/matlabcentral/answers/341599-create-folder-and-keep-files

