Challenge

Project 1 - Parsing NASA thermodynamic data

AIM:- To write a code in Matlab to parse the NASA thrmodynamic data file and then calculate the thermodynamic properties of various gas species.

Objective:

1.To write a function that extracts the 14 coefficients and calculates the enthalpy,entropy and specific heats for all the species in NASA thermodynamic data file "THERMO.dat".

The NASA polynomials have the form as shown below:

Cp/R = a1 + a2T + a3T^2 + a4T^3 + a5T^4

H/RT = a1 + a2T/2 + a3T^2/3 + a4T^3/4 + a5T^4/5 + a6/T

S/R = a1*lnT + a2T + a3T^2/2 + a4T^3/3 + a5T^4/4 + a7

where R is the universal gas constant,T is the temperature

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

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 the specific heat, enthalpy & entropy for a particular element.Each element has its own range of local temperature.

clear all
close all
clc
mkdir 'C:NASA File Parsing' %Making directory
%Getting the data file
f1 = fopen('THERMO.dat','r'); %Reading NASA Thermodynamic data file
gt = fgetl(f1);
%Obtaining temperatures - by reading header information
global_temp = fgetl(f1);

%Splitting
t=strsplit(global_temp);

%Converting string cells to numbers using str2num,
global_low_temp = str2num(t{2});
global_medium_temp = str2num(t{3});
global_high_temp = str2num(t{4});

%Temperature range assumed
Temp = linspace(global_low_temp,global_high_temp,1000);

%Universal Gas constant J/(mol-k)
R = 8.314;
%Skipping next three lines
for i=1:3
    gt = fgetl(f1);
end
for i=1:53
    gt =fgetl(f1);
    A = strsplit(gt,' ');

    Species_SP=(A{1})
   

    line_1 = fgetl(f1);
    a = strfind(line_1,'E');

    %Extracting higher and lower temperature coefficients
    % Extracting first 7 coefficients i.e high-temperature coefficients
    A1=line_1(1:(a(1)+3));
    a1=str2num(A1);
    A2=line_1((a(1)+4):(a(2)+3));
    a2=str2num(A2);
    A3=line_1((a(2)+4):(a(3)+3));
    a3=str2num(A3);
    A4=line_1((a(3)+4):(a(4)+3));
    a4=str2num(A4);
    A5=line_1((a(4)+4):(a(5)+3));
    a5=str2num(A5);

    line_2=fgetl(f1);
    b=strfind(line_2,'E');
    a6=line_2(1:(b(1)+3));
    a6=str2num(a6);
    a7=line_2((a(1)+4):(b(2)+3));
    a7=str2num(a7);

    %Extracting second 7 coefficients-Low temp coefficients
    a8=line_2((b(2)+4):(b(3)+3));
    a8=str2num(a8);
    a9=line_2((b(3)+4):(b(4)+3));
    a9=str2num(a9);
    a10=line_2(b(4)+4:b(5)+3);
    a10=str2num(a10);

    line_3=fgetl(f1);
    c=strfind(line_3,'E');

    a11=line_3(1:(c(1)+3));
    a11=str2num(a11);
    a12=line_3((c(1)+4):(c(2)+3));
    a12=str2num(a12);
    a13=line_3((c(2)+4):(c(3)+3));
    a13=str2num(a13);
    a14=line_3((c(3)+4):(c(4)+3));
    a14=str2num(a14);
    
    %Specific heat calculation

    Cp = specific_heat(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(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,Temp,R,global_medium_temp);

    %Calculating molecular weight of species
    Molecularweight(i)=molecular_weight(Species_SP);

    Molecular_list = fopen('Molecular weight.txt','a+');
    fprintf(Molecular_list,'Molecular weight of %s is %d n',Species_SP,Molecularweight);
    fclose(Molecular_list);

    cur_dir=pwd;
    mkdir(Species_SP);
    cd(Species_SP);

    %PLotting the graphs
    figure(1) %Specific heat vs Temperature 
    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');

    figure(2) %Enthalpy vs Temperature
     plot(Temp,H,'LineWidth',2,'Color','g');
    xlabel('Temperature(K)');
    ylabel('Enthalpy(kJ/mol)');
    title(sprintf('Varying Enthalpy with Temperature range of %s',Species_SP));
    grid on
    saveas(figure(2),'Enthalpy.jpg');

    figure(3) %Entropy vs Temperature
    plot(Temp,S,'LineWidth',2,'Color','b');
    xlabel('Temperature(K)');
    ylabel('Entropy(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');
    fclose(f2);
end

%Function to calculate specific heat function for high&low temp

function Cp = specific_heat(a1,a2,a3,a4,a5,a8,a9,a10,a11,a12,Temp,R,global_medium_temp)
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));
end
end
% Function to calculate the entropy
function S = entropy(a1,a2,a3,a4,a5,a7,a8,a9,a10,a11,a12,a14,Temp,R,global_medium_temp)
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 
    S = R.*(a1.*log(Temp)+ (a2.*Temp) + (a3*((Temp).^2)/2) + (a4*((Temp).^3)/3) + ((a5*(Temp).^4)/4) + a7);
end
%Function to calculate the enthalpy
%  H = RT(a1 + a2*T/2 + a3*T^2/3 + a4*T^3/4 + a5*T^4/5 + a6/T)

function H = enthalpy(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,Temp,R,global_medium_temp)
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
    H = R*Temp.*(a1 + ((a2*Temp)/2) + ((a3*(Temp).^2)/3) + ((a4*(Temp).^3)/4) + ((a5*(Temp).^4)/5) + ((a6./Temp)));
end
%Function to calculate molecular weight
function Molecularweight = molecular_weight(Species_SP)
atomic_name = ['H','C','O','N','A'];

fprintf('Molecular Weight of ');
fprintf(Species_SP);
fprintf(' : ');
%Standard atomic number
Atomic_weight = [1.008 12.011 15.999 14.007 39.948];
%Starting range of Molecule
Molecularweight = 0;

%Adding 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

fprintf('%d',Molecularweight);
disp(' ');
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 delimeter

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

Screenshot of the window where all the folders are saved was uploaded.

Specific Heat,Entropy and Enthalpy plots for O2,N2 and CO2 species were also uploaded.

molecular weights for some species were also uploaded.

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.

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.