Project

Parsing NASA Thermodynamic data

Aim: To write a code in Matlab/Octave to parse the NASA thermodynamic data file and then calculate thermodynamic properties of various gas species.

Objectives:

  • To write a function that extracts the 14 co-efficients for a given species from the given file.
  • To write functions that calculate the enthalpy, entropy and specific heats using the NASA polynomials.
  • To write a function that calculates the molecular weight of each species.
  • To write a function that plots the Cp, Enthalpy and Entropy of an input species.

Introduction: Parsing is the process of breaking a data block into smaller chunks by following a set of rules, so that it can be more easily interpreted, managed, or transmitted by a computer. NASA came up with polynomials that can be used to evaluate thermodynamic properties such as Cp, H and S using polynomials. They have also documented the co-efficients that are required to evaluate these polynomials for 1000+ species.

Procedure:

  • The value of the universal gas constant R is given as 8.31 as an input.
  • Then the given THERMO.dat file has to be accessed to obtain the necessary data
  • \'fopen\' command is used to open the desired file and the keyword \'r\' is used to read the file.
  • This THERMO.dat file is assigned to a variable \'f1\'
  • The file is read line by line by using the \'fgetl\' command. The first line represents the title of the file so it is ignored.
  • The second line has the global maximum, global mid and global minimum values which is split into the three values by using the strsplit command and converted into numbers
  • An array of temperature is generated using linspace command
  • The next 3 lines are ignored as they contain only commands. A for loop is employed.
  • Again a for loop is created to read the data of all the species. fgetl command inside the for loop makes our task easier
  • Then the next 3 lines of the file is read which contains the high and low temperature data of the particular species.
  • The read lines are in the form of a string so they are converted into numbers using the str2num command and stored in specific variables so they can be used for further calculations.
  • The low temperatures values are stored in variables lc1,lc2,lc3,lc4,lc5,lc6 and lc7 and the high temperature values are stored invariables hc1,hc2,hc3,hc4,hc5,hc6 and hc7.
  • The next part of the program contains a for loop with formulas to calculate Specific Heat, Enthalpy and Entropy for lower temperatures given T<=t.
  • An else command is used to calculate the thermodynamic properties at higher temperature if the temperature fails to satisfy the criteria given above
  • Plot of Specific Heat vs Temperature is plotted
  • Plot of Enthalpy vs Temperature is plotted
  • Plot of Entropy vs Temperature is plotted
  • Using the saveas command the three figures are saved in the new folder which is created by the element name.
  • Using the \"cd\" command the folder is back to the original folder.
  • The function runs for 52 times through the for loop and it creates seperate folders for each species and saves all the plots in the folders.
  • Molecular Weights of different species is calculated and
clear all 
close all
clc

%universal gas constant
R=8.31;

f1=fopen(\'THERMO.dat\',\'r\')
line1=fgetl(f1)

%initial lines
for i=1:4
    fgetl(f1)
end
T=linspace(300,5000,500);
for i=1:52
line=fgetl(f1)


A=strsplit(line,\' \')
species=A(1)


line2=fgetl(f1)
sf=strfind(line2,\'E\')
cf1=line2(1:sf(1)+3)
cf2=line2(sf(1)+4:sf(2)+3)
cf3=line2(sf(2)+4:sf(3)+3)
cf4=line2(sf(3)+4:sf(4)+3)
cf5=line2(sf(4)+4:sf(5)+3)

line3=fgetl(f1)
cf6=line3(1:sf(1)+3)
cf7=line3(sf(1)+4:sf(2)+3)
cfe1=line3(sf(2)+4:sf(3)+3)
cfe2=line3(sf(3)+4:sf(4)+3)
cfe3=line3(sf(4)+4:sf(5)+3)

line4=fgetl(f1)
cfe4=line4(1:sf(1)+3)
cfe5=line4(sf(1)+4:sf(2)+3)
cfe6=line4(sf(2)+4:sf(3)+3)
cfe7=line4(sf(3)+4:sf(4)+3)
 
%high temperature coefficients
hc1=str2num(cf1);
hc2=str2num(cf2);
hc3=str2num(cf3);
hc4=str2num(cf4);
hc5=str2num(cf5);
hc6=str2num(cf6);
hc7=str2num(cf7);
lc1=str2num(cfe1);
lc2=str2num(cfe2);
lc3=str2num(cfe3);
lc4=str2num(cfe4);
lc5=str2num(cfe5);
lc6=str2num(cfe6);
lc7=str2num(cfe7);

%low temperature coefficiemts
lc=[lc1 lc2 lc3 lc4 lc5 lc6 lc7];
hc=[hc1 hc2 hc3 hc4 hc5 hc6 hc7];
 for j=1:length(T)
    t=1000;
    if T(j)<=t
        
        Cp(j) = R*(lc(1)+lc(2)*T(j)+lc(3)*(T(j))^2 +lc(4)*(T(j))^3 +lc(5)*(T(j))^4);
         H(j) = R*T(j)*(lc(1)+lc(2)*T(j)/2 +lc(3)*((T(j))^2)/3 +lc(4)*((T(j))^3)/4 + lc(5)*((T(5))^4)/5 + lc(6)/T(j));
         S(j) = R*(lc(1)*log(T(j))+lc(2)*T(j)+lc(3)*((T(j))^2)/2 +lc(4)*((T(j))^3)/3 + lc(5)*((T(j))^4)/4 + lc(7));
         
    else
        Cp(j) = R*(hc(1)+hc(2)*T(j)+hc(3)*(T(j))^2 +hc(4)*(T(j))^3 +hc(5)*(T(j))^4);
         H(j) = R*T(j)*(hc(1)+hc(2)*T(j)/2 +hc(3)*((T(j))^2)/3 +hc(4)*((T(j))^3)/4 + hc(5)*((T(5))^4)/5 + hc(6)/T(j));
         S(j) = R*(hc(1)*log(T(j))+hc(2)*T(j)+hc(3)*((T(j))^2)/2 +hc(4)*((T(j))^3)/3 + hc(5)*((T(j))^4)/4 + hc(7));
        
    end
  
end
 spec=char(species)
 
 fd = sprintf(\'%s\',spec);
 cur_dir=pwd
mkdir(spec);
    cd(spec);
    
%Plot 1, Specific heat (Cp) vs Temperature (T)
figure(1);
plot(T,Cp);
xlabel(\'Temperature in K\');
ylabel(\'Specific heat in kJ\');
title(\'Specific heat vs Temperature\');
      
%Plot 2, Enthalpy (H) vs Temperature (T)  
figure(2);
plot(T,H);
xlabel(\'Temperature in K\');
ylabel(\'Enthalpy in kJ/(mol)\');
title(\'Enthalpy vs Temperature\');
      
%Plot 3, Entropy (S) vs Temperature (T)
figure(3);
plot(T,S);
xlabel(\'Temperature in K\');
ylabel(\'Entropy in kJ/(mol K)\');
title(\'Entropy vs Temperature\');


% saving the plots that got generated

saveas(figure(1), \'cp.png\');
saveas(figure(2), \'h.png\');
saveas(figure(3), \'s.png\');
cd(cur_dir);
 
end

%Molecular Weight of Particular Species
molecular_weight(i)=Molecular_Weight(species_element);

Function for Molecular weight:

function M=Molecular_Weight(species_element)
        atoms={\'H\',\'C\',\'N\',\'O\',\'AR\'};
        AtomicWeight=[1 12 14 16 40];
        M=0;
        for i=1:length(species_element)
            for j=1:length(atoms)
                if strcmp(species_element(i),atoms(j))
                    M=M+AtomicWeight(j);
                    p=j;
                end
                n=str2num(species_element(i));
                if n>1
                    M=M+(AtomicWeight(p)*(n-1));
           end
      end
end

The plots obtained for O2 is as follows:

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.