Project 1 - Parsing NASA thermodynamic data
Aim of the project:
We are required to write a code to parse the thermodynamic data file and calculate the thermodynamic properties of various gas species.
Objective
- Write a function that extracts the 14 coefficients 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 a proper name. All these should be generated automatically.
-
The main program you 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.
The formulas known to us are given below:
File Parsing:
File parsing refers to how information can be read from a particular text file or any type of file and how that information can be used in a computer program.
It indeed is very hard trying to find necessary information from a data file if it is not organized. Here comes the necessity of parsing a file.
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 formal grammar. Parse essentially means to ''resolve (a sentence) into its component parts and describe their syntactic roles''. The term parsing comes from Latin pars (orationis), meaning part (of speech). Within computational linguistics the term is used to refer to the formal analysis by a computer of a sentence or other string of words into its constituents, resulting in a parse tree showing their syntactic relation to each other, which may also contain semantic and other information. Some parsing algorithms may generate a parse forest or list of parse trees for a syntactically ambiguous input.
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.
Process of File Parsing:
- Step 1 - Define the function
- Step 2 - Create an InputParser object
- Step 3 - Add inputs to the scheme.
- Step 4 - Set properties to adjust parsing.
- Step 5 - Parse the inputs.
- Step 6 - Use the inputs in the function.
- Step 7 - Calling function.
NASA Thermodynamic File:-
THERMO.dat file is a data file containing 14 coefficients for 53 different elements given by NASA. These coefficients are utilized to calculate a particular element's specific heat, enthalpy & entropy. Each element has its own range of local temperatures. Below a screenshot of the THERMO.dat file is displayed.
NASA thermodynamics file which is THERMO.dat file in which there are temperature range and 53 species are given in these data and each species contains 14 coefficients and temperature ranges and we have to parse these 14 coefficients to find Specific heat, Entropy and Enthalpy using formula as:-
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
List of 53 Elements contained in 'THERMO.dat' file:
AR C C2H C2H2 C2H3 C2H4
C2H5 C2H6 C3H7 C3H8 CH CH2
CH2(S) CH2CHO CH2CO CH2O CH2OH CH3
CH3CHO CH3O CH3OH CH4 CN CO
CO2 H H2 H2CN H2O H2O2
HCCO CCOH HCN HCNN HCNO HCO
HNCO HNO HO2 HOCN N N2
N2O NCO NH NH2 NH3 NNH
NO NO2 O O2 OH
Specific Heat:-
The specific heat is the amount of heat per unit mass required to raise the temperature by one degree Celsius. The relationship between heat and temperature change is usually expressed in the form shown below where c is the specific heat.
Cp = R*(a1 + (a2*T) + (a3*(T).^2) + (a4*(T).^3) + (a5*(T).^4))
Function Code for Specific Heat:
% Specific heat calculation function
function Cp = Specificheat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,Temp,R,global_medium_temp)
% Comparing with global temperature
% If less than global temperature - minimum coefficients are taken
if Temp <= global_medium_temp
Cp = R.*(a8 + (a9.*Temp) + (a10*(Temp).^2) + (a11*(Temp).^3) + (a12*(Temp).^4));
else
Cp = R.*(a1 + (a2.*Temp) + (a3*(Temp).^2) + (a4*(Temp).^3) + (a5*(Temp).^4));
% Else maximum coefficients are taken
end
Explanation: We made a function named 'Specificheat' which will have output 'Cp'. By using the formula provided to us we calculate Cp. We know the first 7 are higher temperature coefficients in the data file and the rest 7 are lower temperature coefficients. So we use a for loop to execute that logic.
Entropy:-
% Entropy Calculation function
function S = Entropy_calc(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,Temp,R,global_medium_temp)
% Comparing with global temperature
% If less than global temperature - minimum coefficients are taken
if Temp <= global_medium_temp
S = R.*(a8.*log(Temp) + (a9.*Temp) + (a10*((Temp).^2)/2) + (a11*((Temp).^3)/3) + (a12*((Temp).^4)/4) + a14);
else
% Else - maximum coefficients are taken
S = R.*(a1.*log(Temp) + (a2.*Temp) + (a3*((Temp).^2)/2) + (a4*((Temp).^3)/3) + (a5*((Temp).^4)/4) + a7);
end
% Enthalpy Calculation function
function H = Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,Temp,R,global_medium_temp)
% Comparing with global temperature
% If less than global temperature - minimum coefficients are taken
if Temp <= global_medium_temp
H = R*Temp.*(a8 + ((a9*Temp)/2) + ((a10*(Temp).^2)/3) + ((a11*(Temp).^3)/4) + ((a12*(Temp).^4)/5) +((a13./Temp)));
else
% Else maximum coefficients are taken
H = R*Temp.*(a1 + ((a2*Temp)/2) + ((a3*(Temp).^2)/3) + ((a4*(Temp).^3)/4) + ((a5*(Temp).^4)/5) +((a6./Temp)));
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 mass because they contain different isotopes of an element.
Function code for Molecular Weight:
% Molecular Weight Calculation function
function Molecularweight = Molecular_weight(Species_SP)
% Standard - Atomic Name
atomic_name = ['H','C','O','N','A'];
% Hydrogen, Carbon, Oxygen, Nitrogen, Argon
% Standard Atomic Number
Atomic_Weight = [1.008 12.011 15.999 14.007 39.948];
% Starting Range of Molecule
Molecularweight = 0;
�ding Atomic number to obtain particular value
for i = 1:length(Species_SP)
for j = 1:length(atomic_name)
if strcmpi(Species_SP(i),atomic_name(j))
Molecularweight = Molecularweight + Atomic_Weight(j);
position = j;
end
end
n = str2num(Species_SP(i));
if n>1
Molecularweight = Molecularweight + Atomic_Weight(position)*(n-1);
end
end
end
close all
clc
% We initialize by reading the 'THERMO.dat' file
% We use 'r' for reading the file
f1 = fopen('THERMO.dat', 'r');
gt = fgetl(f1); %Getting the header for the file
% We obtain the temperatures by reading the Header Information
% Getting the first line as the 'global_temp'
global_temp = fgetl(f1);
% We split the string into a matrix for convenience
t = strsplit(global_temp);
% Converting the cells in the matrix using str2num
global_low_temp = str2num(t{2});
global_medium_temp = str2num(t{3});
global_high_temp = str2num(t{4});
% We assume the temperature range and declare the gas constant
Temp = linspace(global_low_temp,global_high_temp,1000);
R = 8.314; %Unit -> J/mol-K
% There are three comment lines in the file which we need to skip
% We can just use a for loop to skip through these lines
for i = 1:3
gt = fgetl(f1);
end
for i = 1:53
% For the first iteration, first element will be picked
gt = fgetl(f1);
A = strsplit(gt,' ');
Species_SP = (A{1})
line_1 = fgetl(f1);
% Finding 'E' to be replaced
a = strfind(line_1, 'E');
% Extracting higher and lower temperature coeffiecients
% 1st line - We take string 3 letters more after finding 'E's
% This will make the first 7 co-efficients
% 1st line for the current iteration
a1 = line_1(1:a(1)+3);
a1 = str2num(a1);
% 2nd line for the current iteration
a2 = line_1(a(1)+4:a(2)+3);
a2 = str2num(a2);
% 3rd line for the current iteration
a3 = line_1(a(2)+4:a(3)+3);
a3 = str2num(a3);
% 4th line for the current iteration
a4 = line_1(a(3)+4:a(4)+3);
a4 = str2num(a4);
% 5th line for the current iteration
a5 = line_1(a(4)+4:a(5)+3);
a5 = str2num(a5);
% Going to the second line
line_2 = fgetl(f1);
% 2nd line - We take string 3 letters more after finding 'E's
b = strfind(line_1,'E');
% 6th line for the current iteration
a6 = line_2(1:b(1)+3);
a6 = str2num(a6);
% 7th line for the current iteration
a7 = line_2(a(1)+4:b(2)+3);
a7 = str2num(a7);
% This will make the second 7 co-efficients
% 8th line for the current iteration
a8 = line_2(b(2)+4:b(3)+3);
a8 = str2num(a8);
% 9th line for the current iteration
a9 = line_2(b(3)+4:b(4)+3);
a9 = str2num(a9);
th line for the current iteration
a10 = line_2(b(4)+4:b(5)+3);
a10 = str2num(a10);
% Going to the third line
line_3 = fgetl(f1);
% 3rd line - We take string 3 letters more after finding 'E's
c = strfind(line_1,'E');
th line for the current iteration
a11 = line_3(1:c(1)+3);
a11 = str2num(a11);
th line for the current iteration
a12 = line_3(c(1)+4:c(2)+3);
a12 = str2num(a12);
th line for the current iteration
a13 = line_3(c(2)+4:c(3)+3);
a13 = str2num(a13);
th line for the current iteration
a14 = line_3(c(3)+4:c(4)+3);
a14 = str2num(a14);
% Specific heat calculation
Cp = Specificheat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,Temp,R,global_medium_temp);
% Enthalpy calculation
H = Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,Temp,R,global_medium_temp);
% Entropy calculation
S = Entropy_calc(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,Temp,R,global_medium_temp);
�lculating molecular weight of species
Molecularweight(i) = Molecular_weight(Species_SP);
% Read & Write Molecular list
Molecular_list = fopen('Molecular weight.txt','a+');
fprintf(Molecular_list,'Molecular weight of %s is %d \n', Species_SP, Molecularweight);
fclose(Molecular_list);
% plotting(CP,H,S,Temp,Species_SP)
% Saving as a folder
cur_dir = pwd;
mkdir(Species_SP);
cd(Species_SP);
% Plot 1, Specific heat (CP) vs Temperature Range (Temp)
figure(1)
plot(Temp,Cp,'linewidth',2,'color','r');
xlabel('Temperature [K]');
ylabel('Specific Heat [kJ]');
title(sprintf('Varying Specific Heat with Temperature Range of %s',Species_SP));
grid on
saveas(figure(1),'Specific Heat.jpg');
% Plot 2, Enthalpy (H) vs Temperature Range (Temp)
figure(2)
plot(Temp,H,'linewidth',2,'color','g');
xlabel('Temperature [K]');
ylabel('Enthalpy in [kJ/(mol)]');
title(sprintf('Varying Enthalpy with Temperature Range of %s',Species_SP));
grid on
saveas(figure(2),'Ethalpy.jpg');
% Plot 3, Entropy (S) vs Temperature Range (Temp)
figure(3)
plot(Temp,S,'linewidth',2,'color','b');
xlabel('Temperature [K]');
ylabel('Entropy in [kJ/(mol-K)]');
title(sprintf('Varying Entropy with Temperature Range of %s',Species_SP));
grid on
saveas(figure(3),'Entropy.jpg');
cd(cur_dir);
% Molecular weight
M = Molecular_weight(Species_SP);
fprintf('molecular weight %s :',Species_SP);
fprintf('f\n\n',M);
end
Syntax Used during Coding
|
Fopen : |
Open a file or obtain information about open files |
|
‘r’ : |
Open the file for reading |
|
fgetl |
Read line from file |
|
strsplit |
Split string or character vector at specified delimiter |
|
str2num |
Convert character array or string to numeric array |
|
strfind |
Find one string within another |
|
linspace |
Generate linearly spaced vectors |
|
fprintf |
Write formatted data to file |
|
pwd |
Identify current directory |
|
mkdir |
Make new directory |
|
cd |
Change working directory |
- close all
clc
We first start by resetting and clearing everything
- % We initialize by reading the 'THERMO.dat' file
% We use 'r' for reading the file
f1 = fopen('THERMO.dat', 'r');
gt = fgetl(f1); %Getting the header for the file
We then read the 'THERMO.dat' file by opening it and getting the header for the file.
- % We obtain the temperatures by reading the Header Information
% Getting the first line as the 'global_temp'
global_temp = fgetl(f1);
After the header line in the file, we see the global temperatures are given in the next line. So we get the next line and store it to 'global_temp'.
- % We split the string into a matrix for convenience
t = strsplit(global_temp);
- % Converting the cells in the matrix using str2num
global_low_temp = str2num(t{2});
global_medium_temp = str2num(t{3});
global_high_temp = str2num(t{4});
We then convert the strings into numbers for usage. Three split strings are converted into numbers and are stored into variables.
- % We assume the temperature range and declare the gas constant
Temp = linspace(global_low_temp,global_high_temp,1000);
R = 8.314; %Unit -> J/mol-K
We now take a temperature range array by using linspace and declare the Gas Constant.
- % There are three comment lines in the file which we need to skip
% We can just use a for loop to skip through these lines
for i = 1:3
gt = fgetl(f1);
end
-
for i = 1:53
% For the first iteration, first element will be picked
gt = fgetl(f1);
A = strsplit(gt,' ');
Species_SP = (A{1})
line_1 = fgetl(f1);
% Finding 'E' to be replaced
a = strfind(line_1, 'E');
% Extracting higher and lower temperature coeffiecients
% 1st line - We take string 3 letters more after finding 'E's
% This will make the first 7 co-efficients
% 1st line for the current iteration
a1 = line_1(1:a(1)+3);
a1 = str2num(a1);
% 2nd line for the current iteration
a2 = line_1(a(1)+4:a(2)+3);
a2 = str2num(a2);
% 3rd line for the current iteration
a3 = line_1(a(2)+4:a(3)+3);
a3 = str2num(a3);
% 4th line for the current iteration
a4 = line_1(a(3)+4:a(4)+3);
a4 = str2num(a4);
% 5th line for the current iteration
a5 = line_1(a(4)+4:a(5)+3);
a5 = str2num(a5);
% Going to the second line
line_2 = fgetl(f1);
% 2nd line - We take string 3 letters more after finding 'E's
b = strfind(line_1,'E');
% 6th line for the current iteration
a6 = line_2(1:b(1)+3);
a6 = str2num(a6);
% 7th line for the current iteration
a7 = line_2(a(1)+4:b(2)+3);
a7 = str2num(a7);
% This will make the second 7 co-efficients
% 8th line for the current iteration
a8 = line_2(b(2)+4:b(3)+3);
a8 = str2num(a8);
% 9th line for the current iteration
a9 = line_2(b(3)+4:b(4)+3);
a9 = str2num(a9);
th line for the current iteration
a10 = line_2(b(4)+4:b(5)+3);
a10 = str2num(a10);
% Going to the third line
line_3 = fgetl(f1);
% 3rd line - We take string 3 letters more after finding 'E's
c = strfind(line_1,'E');
th line for the current iteration
a11 = line_3(1:c(1)+3);
a11 = str2num(a11);
th line for the current iteration
a12 = line_3(c(1)+4:c(2)+3);
a12 = str2num(a12);
th line for the current iteration
a13 = line_3(c(2)+4:c(3)+3);
a13 = str2num(a13);
th line for the current iteration
a14 = line_3(c(3)+4:c(4)+3);
a14 = str2num(a14);
% Specific heat calculation
Cp = Specificheat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,Temp,R,global_medium_temp);
% Enthalpy calculation
H = Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,Temp,R,global_medium_temp);
% Entropy calculation
S = Entropy_calc(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,Temp,R,global_medium_temp);�lculating molecular weight of species
Molecularweight(i) = Molecular_weight(Species_SP);
% Read & Write Molecular list
Molecular_list = fopen('Molecular weight.txt','a+');
fprintf(Molecular_list,'Molecular weight of %s is %d \n', Species_SP, Molecularweight);
fclose(Molecular_list);
% plotting(CP,H,S,Temp,Species_SP)
% Saving as a folder
cur_dir = pwd;
mkdir(Species_SP);
cd(Species_SP);
% Plot 1, Specific heat (CP) vs Temperature Range (Temp)
figure(1)
plot(Temp,Cp,'linewidth',2,'color','r');
xlabel('Temperature [K]');
ylabel('Specific Heat [kJ]');
title(sprintf('Varying Specific Heat with Temperature Range of %s',Species_SP));
grid on
saveas(figure(1),'Specific Heat.jpg');
% Plot 2, Enthalpy (H) vs Temperature Range (Temp)
figure(2)
plot(Temp,H,'linewidth',2,'color','g');
xlabel('Temperature [K]');
ylabel('Enthalpy in [kJ/(mol)]');
title(sprintf('Varying Enthalpy with Temperature Range of %s',Species_SP));
grid on
saveas(figure(2),'Ethalpy.jpg');
% Plot 3, Entropy (S) vs Temperature Range (Temp)
figure(3)
plot(Temp,S,'linewidth',2,'color','b');
xlabel('Temperature [K]');
ylabel('Entropy in [kJ/(mol-K)]');
title(sprintf('Varying Entropy with Temperature Range of %s',Species_SP));
grid on
saveas(figure(3),'Entropy.jpg');
cd(cur_dir);
% Molecular weight
M = Molecular_weight(Species_SP)
f2 = fopen('molecular mass','w');
fprintf('%s n %s n %f n','species','Molecular mass',M)
fclose(f2)
end
- Specific Heat VS Temperature
- Enthalpy VS Temperature
- Entropy VS Temperature
After plotting we save them according to our convention as 'jpg' file.
-> Then we print the molecular weight to the console also.
Thus we terminate our for loop and our code is completed.
Code Output in Console:
Species_SP =
'O'
molecular weight O : 15.999000
Species_SP =
'O2'
molecular weight O2 : 31.998000
Species_SP =
'H'
molecular weight H : 1.008000
Species_SP =
'H2'
molecular weight H2 : 2.016000
Species_SP =
'OH'
molecular weight OH : 17.007000
Species_SP =
'H2O'
molecular weight H2O : 18.015000
Species_SP =
'HO2'
molecular weight HO2 : 33.006000
Species_SP =
'H2O2'
molecular weight H2O2 : 34.014000
Species_SP =
'C'
molecular weight C : 12.011000
Species_SP =
'CH'
molecular weight CH : 13.019000
Species_SP =
'CH2'
molecular weight CH2 : 14.027000
Species_SP =
'CH2(S)'
molecular weight CH2(S) : 14.027000
Species_SP =
'CH3'
molecular weight CH3 : 15.035000
Species_SP =
'CH4'
molecular weight CH4 : 16.043000
Species_SP =
'CO'
molecular weight CO : 28.010000
Species_SP =
'CO2'
molecular weight CO2 : 44.009000
Species_SP =
'HCO'
molecular weight HCO : 29.018000
Species_SP =
'CH2O'
molecular weight CH2O : 30.026000
Species_SP =
'CH2OH'
molecular weight CH2OH : 31.034000
Species_SP =
'CH3O'
molecular weight CH3O : 31.034000
Species_SP =
'CH3OH'
molecular weight CH3OH : 32.042000
Species_SP =
'C2H'
molecular weight C2H : 25.030000
Species_SP =
'C2H2'
molecular weight C2H2 : 26.038000
Species_SP =
'C2H3'
molecular weight C2H3 : 27.046000
Species_SP =
'C2H4'
molecular weight C2H4 : 28.054000
Species_SP =
'C2H5'
molecular weight C2H5 : 29.062000
Species_SP =
'C2H6'
molecular weight C2H6 : 30.070000
Species_SP =
'CH2CO'
molecular weight CH2CO : 42.037000
Species_SP =
'HCCO'
molecular weight HCCO : 41.029000
Species_SP =
'HCCOH'
molecular weight HCCOH : 42.037000
Species_SP =
'H2CN'
molecular weight H2CN : 28.034000
Species_SP =
'HCN'
molecular weight HCN : 27.026000
Species_SP =
'HNO'
molecular weight HNO : 31.014000
Species_SP =
'N'
molecular weight N : 14.007000
Species_SP =
'NNH'
molecular weight NNH : 29.022000
Species_SP =
'N2O'
molecular weight N2O : 44.013000
Species_SP =
'NH'
molecular weight NH : 15.015000
Species_SP =
'NH2'
molecular weight NH2 : 16.023000
Species_SP =
'NH3'
molecular weight NH3 : 17.031000
Species_SP =
'NO'
molecular weight NO : 30.006000
Species_SP =
'NO2'
molecular weight NO2 : 46.005000
Species_SP =
'HCNO'
molecular weight HCNO : 43.025000
Species_SP =
'HOCN'
molecular weight HOCN : 43.025000
Species_SP =
'HNCO'
molecular weight HNCO : 43.025000
Species_SP =
'NCO'
molecular weight NCO : 42.017000
Species_SP =
'CN'
molecular weight CN : 26.018000
Species_SP =
'HCNN'
molecular weight HCNN : 41.033000
Species_SP =
'N2'
molecular weight N2 : 28.014000
Species_SP =
'AR'
molecular weight AR : 39.948000
Species_SP =
'C3H8'
molecular weight C3H8 : 44.097000
Species_SP =
'C3H7'
molecular weight C3H7 : 43.089000
Species_SP =
'CH3CHO'
molecular weight CH3CHO : 44.053000
Species_SP =
'CH2CHO'
molecular weight CH2CHO : 43.045000