Challenge

Project 1 - Parsing NASA thermodynamic data

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.

To guide you we have broken down the problem into meaningful bits that you can work on individually.

1. 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(Tip: use fopen and fgetl). 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.

Also use the LOCAL TEMPERATURE RANGES which is unique for each individual species, not the GLOBAL TEMPERATURE RANGE.

2. Calculate the molecular weight of each species and display it in the command window.

3. Plot the Cp, Enthalpy and Entropy for the local temperature range (low temperature : high temperature) specific for each species.

4. 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.

5. The main program that you will submit will just take the "THERMO.dat" file as an input and generate Cp, H and S plots.

Code for specific heat function

%Specific Heat Calculation Function 
function Cp=Specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,T,R,tempmid)

% calculating specific heat for higher and lower temperature respectively.
if (T<=tempmid)
Cp=(a8+(a9.*T)+(a10.*(T.^2))+(a11.*(T.^3))+(a12.*(T.^4)))*R;
else
Cp = (a1+(a2.*T)+(a3.*(T.^2))+(a4.*(T.^3))+(a5.*(T.^4)))*R;
end
end

Code for entropy function

% Entropy Calculation Function

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 respectively

if (T<=tempmid)
S=(a8.*log(T)+(a9*T)+((a10*(T.^2))/2)+((a11*(T.^3))/3)+((a12*(T.^4))/4)+a14)*R;
else
S=(a1.*log(T)+(a2*T)+((a3*(T.^2))/2)+((a4*(T.^3))/3)+((a5*(T.^4))/4)+a7)*R;
end
end



Code for enthalpy function

% Enthalpy Calculation function.

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 respectively.

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=(a1+((a2*T)/2)+((a3*(T.^2))/3)+((a4*(T.^3))/4)+((a5*(T.^4))/5)+((a6./T))).*R.*T;
end
end

Code for molecular weight calculation function

% Molecular Weight Calculation Function
function MW=Molecular_weight(species)

% Defining Atomic Name of the species

atomic_name = ['H', 'C', 'O', 'N', 'Ar'];

% Hydrogen Carbon, Oxygen, Nitrogen, Argon

% Defining Atomic masses of main species

atomic_weight = [1 12 16 14 40];

MW = 0;  % Molecular weight starting range
position=0;
% Adding Atomic Number to obtain particular value

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 name

if (strcmp(species(i), atomic_name(j))) % function to compare 2 strings
    MW=MW+atomic_weight(j);
    position=j;
end
end 
n = str2num(species(i));  % Finding more elements in the species and incrementing atomic weight of the species

if n>1
    MW=MW+atomic_weight(position)*(n-1); 
end
end

end

EXPLANATION

  • Firstly we create an Molecular weight_function MW and assigning its species input to that.
  • Then define the main element of all 53 species in an array atomic_name that are 'H','C','O','N', 'Ar'.
  • Then by taking the above main elements we will create thereatomic_weight array 1 12 16 14 40
  • Then we will assign molecular starting range from MW to zero and then create "for" loop condition which runs to the length of the species and an another nested "for" loop is created which runs to the length of the string atomic_name
  • Then we will create a condition using "If" condition and "strcmp" command to compare the species and atomic_name strings to calculate molecular masses if by comparison both string found same then we will assign its molecular weight.
  • Now we will convert the string to numbers using "str2num" command and assign to then we run a condition of "if" loop to find whether the species contains more than one element and if there are more than 1 elements that is n>1 then we will Increment the atomic weight by multiplication of position and n-1 to the atomic weight array.

Main programe

clear all
close all
clc

% Input
R = 8.314; % Gas Constant (J / (mol - K))

% Reading data File
% Open and read THERMO.dat file
f1 = fopen('THERMO.dat', 'r') 
get=fgetl(f1) ;

% Now reading Temperature from this file 
temp = fgetl(f1);

% Splitting
s = strsplit(temp,' ');

% Converting strings cells into numbers
global_templow= str2num(s{2});
global_tempmid= str2num(s{3});
global_temphigh=str2num(s{4});


% Skipping 3 lines
fgetl(f1);
fgetl(f1);
fgetl(f1);

% Reading the species 
for i = 1:53
    tline=fgetl(f1);
    A=strsplit(tline, ' ');   % Splitting cell into array
    species =(A{1});  % To read the name of the species


Q=strfind(tline,'G');
local_templow = tline(Q+3:55);
local_temphigh = tline(Q+13:65);
local_tempmid= tline(Q+23:75);

templow= str2double(local_templow); %Local Low Temperature

temphigh= str2double(local_temphigh); %Local High Temperature

tempmid= str2double(local_tempmid); %Local Mid Temperature



tline1= fgetl(f1);  % getting next line
% Finding the string E
a=strfind(tline1,'E');  

% Finding first 7 higher and second & lower coefficients

% Finding the 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);

% Temperature range
T=linspace(templow,temphigh,500);

% calculate specific heat
Cp = Specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,T,R,tempmid);

% calculate Entropy
S = Entropy(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,T,R,tempmid);

% calculate Enthalpy
H = Enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,T,R,tempmid);

% calculate Molecular Weight of the species. 
MW=Molecular_weight(species);

% writing molecular weight file
MW_file = fopen( 'Molecular Weight.txt', 'w');
fprintf(MW_file,'Molecular weight of %s is %d', species, MW);
fclose(MW_file);       % closing the file

% Plotting Cp, H & S with temperature
% saving in a folder 
cd('C:/Users/HP/Desktop/Project 1/species')    % changing directory
mkdir(species);          % creating directory
cd(species);

% Plot 1 | Cp vs T

figure(1)
plot(T, Cp, 'linewidth',3, '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', 3,'color','r');
xlabel('Temperature (K)');
ylabel('Entropy (KJ/mol-K)');
title(sprintf('Entropy vs Temperature range of %s' , species));
grid on
saveas (figure(2),'Entropy.jpg');

%Plot 3 | H vs T

figure(3)
plot(T,H,'linewidth',3, 'color','g') ;
xlabel('Temperature (K)');
ylabel('Enthalpy (KJ/mol)');
title(sprintf('Enthalpy vs Temperature range of %s', species));
grid on
saveas(figure(3),'Enthalpy.jpg');

cd('C:/Users/HP/Desktop/Project 1'); %Changing directory to original matlab path
% Molecular weight
fprintf('Molecular weight of %s:',species)
MW=Molecular_weight(species)


end

Explanation of main programe

  • clear all,close all and clc is used to clear all previous commands and plot
  • 'fopen ' is used to open the file named 'dat'. 'r'is used for read mode.
  • 'fgetl'is used to read the file line-by-line.
  • For getting the Global temperature

'strsplit' command is used for splitting the string or character vectors at specified delimiter.

The global temperature info is stored in string so we use the command str2double so it returns the values in {} as a string. Which gives us the cell array. From which we can get the global temperature value. For skipping the next 3 command we use fgetl command.

  • For getting temperature info

Species name is given as A{1}.

local_templow value is get by using command tline(Q+3:55).As well as higher temp and mid temp also found out. Here i have used the terms local_temp which show iam targeting the temperatureof the species and converting to the string by using again str2double command.
  • 'for' loop is used to read all 53 species one by one and plot them to different folder.
  • Extraction of 14 co-efficients

The coefficient locations are like 5 in 2 nd row, next 5 in 3 rd rowand restn the 4 th raw.

Now for extracting this we are going to locate the string 'E' first which is ipresent in each coefficent value. For that 'strfind' command is used. After finding the location of E tline1(1:a(1)+3) gives the values from 1 to 12 by adding +3 it will give the whole coefficient value. After getting the first coefficient , the second coefficient value starts from end of first coefficient value. by doing this we can extract the 14 coefficient values.

  • 'linspace' is used to generate the temperature range.
  • Calling functions
After extracting coefficient All function defined previously like the "specific Heat, Entropy, Enthalpy & Molecular weight" are called one by one.
  • Creating folder

Inorder to create a folder i have used the command mkdir which allows matlab to create a new folder to store the species data.

  • Plotting the graph

Plot the graph between Temperature and specific heat, enthalpy vs temperature and entropy vs temperature.

saveas command is used to save the graph. cd command is used to define path to the folder where the data has to be stored.

fprintf command is used to show the molecular weight in command window.

Results

Graph for O2

N2

CO2

OTHER SCREENSHOTS

Showing molecular weight

Folders

Reference

Mathwork

Skill lync

Google

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.