Project 1 - Parsing NASA thermodynamic data
AIM :-
TO WRITE A CODE IN MATLAB TO PARSE THE NASA-THERMODYANIC FILE AND TO CALCULATE THE THERMODYNAMIC PROPERTIES(SPECIFIC HEAT, ENTHALPHY,ENTROPHY) AND MOLECULAR WEIGHT AND MAKE PLOTS FOR THE VARIOUS SPECIES.
OBJECTIVES: -
1. TO WRITE A FUNCTION THAT EXTRACTS THE 14 CO-EFFICIENTS OF THE GIVEN SPECIES.
2. TO WRITE A FUNCTION TO CALCULATE THE THERMODYNAMIC PROPERTIES(SPECIFIC HEAT, ENTHALPHY,ENTROPHY) USING NASA POLYNOMIALS FOR THE GIVEN SPECIES.
3. TO WRITE A FUNCTION THAT PLOTS THE CP,S,H OF THE GIVEN SPECIES.
COMMANDS EXPLANATION: -
- IN THIS PROGRAM ‘R’ IS THE UNIVERSAL CONSTANT, R = 8.314.
- USING “THERMO.dat” FILE WHICH CONTAINS 53 SPECIES.
- ‘fopen’ COMMAND IS USED TO OPEN THE FILE IN THE REAL MODE DENOTED BY ‘r’ IN THE PROGRAM.
- THE FILE IS READ LINE BY LINE USING ‘fgetl’ COMMAND.
- THEN THE TEMPERATURE RANGE WERE CLASSIFIED INTO GLOBAL (MAX, MID, MINI) IN THE PROGRAM.
- THE ‘strsplit’ COMMAND IS USED TO SPLIT THE VALUES, CONVERTED TO NUMBERS.
- THE TEMPERATURE ARRAY IS DEFINED BY USING ‘linspace’ COMMAND.
- THE NEXT THREE LINES ARE COMMENTS IN THE FILE SO THEY WERE IGNORED BY USING ‘for loop’ COMMAND.
- THE NAME OF THE ELEMENT IS STORED IN A VARIABLE USING ‘strtok’ COMMAND.
- THE READ LINES ARE CONVERTED INTO NUMBERS USING ‘str2double’ COMMAND AND STORED IN A SPECIFIC VARIABLES.
- THE LOW_TEMP VALUES ARE STORED AS (a1-a7) AND THE HIGH_TEMP VALUES ARE STORED AS (b1-b7).
- CALCULATING THE SPECIFIC HEAT USING THE VALUES OF LOW_TEMP AND HIGH_TEMP WITH THE HELP OF USING FUNCTION (SPECIFIC HEAT).
- CALCULATING THE ENTHALPY USING THE VALUES OF LOW_TEMP AND HIGH_TEMP WITH THE HELP OF USING FUNCTION (ENTHALPY).
- CALCULATING THE ENTROPY USING THE VALUES OF LOW_TEMP AND HIGH_TEMP WITH THE HELP OF USING FUNCTION (ENTROPY).
- THE NEXT LINE IS THE REFERNCE TO A FUNCTION WHICH PLOTS GRAPHS USING THE GIVEN INPUTS.
- THE NEXT LINE IS THE REFERNCE TO A FUNCTION WHICH CALCULATES THE MOLECULAR WEIGHT OF DIFFERENT SPECIES USING THE GIVEN INPUTS.
- THE NEXT LINE IS THE REFERNCE TO A FUNCTION WHICH STORES THE MOLECULAR WEIGHT OF THE DIFFERENT SPECIES USING THE GIVEN INPUTS.
- THE FILE IS CLOSED USING ‘fclose’ COMMAND.
CALCULATION OF ENTROPY: -
THE FUNCTION USES INPUTS AS HIGH_TEMP AND LOW_TEMP CO-EFFICIENTS AND UNIVERSAL GAS CONSTANT, GLOBAL (MAX, MID, MINI).
FORMULA: -
USING “if else” CONDITION THE TEMP VALUES ARE COMPARED TO THE GLOBAL MID_TEMP VALUES AND WITH THE APPROPRIATE EQUATION ENTROPY WILL BE CALCULATED AND IT IS REPRESENTED AS ‘S’.
%Function to calculate entropy function
function S = entropy(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3,b4,b5,b6,b7,R,temp,global_min,global_max,global_mid)
if temp<=global_mid
S = R*(a1.*log(temp) + a2.*temp + a3.*(temp.^2)./2 + a4.*(temp.^3)./3 + a5.*(temp.^4)./4 + a7);
else
S = R*(b1.*log(temp) + b2.*temp + b3.*(temp.^2)./2 + b4.*(temp.^3)./3 + b5.*(temp.^4)./4 + b7);
end
CALCULATION OF ENTHALPY: -
IN THIS FUNCTION THE HIGH_TEMP AND LOW_TEMP CO-EFFICIENTS, UNIVERSAL GAS CONSTANT, GLOBAL (MAX, MID, MIN) TEMPERATURE ARE USED AS INPUT PARAMETERS.
FORMULA: -
USING “if else” CONDITION STATEMENT THE VALUES ARE COMPARED WITH THE GLOBAL_TEMP VALUES AND THE ENTHALPHY IS CALCULATED AND IT IS REPRESENTED AS ‘H’.
%Function to calculate enthalpy function
function H = enthalpy(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3,b4,b5,b6,b7,R,temp,...
global_min,global_max,global_mid)
if temp <=global_mid
H = R.*temp.*(a1 + a2.*(temp./2) + a3.*((temp.^2)./3) + a4.*((temp.^3)./4)...
+ a5.*((temp.^4)./5) + a6./temp);
else
H = R.*temp.*(b1 + b2.*(temp./2) + b3.*((temp.^2)./3) + b4.*((temp.^3)./4)...
+ b5.*((temp.^4)./5) + b6./temp);
end
CALCULATION OF SPECIFIC HEAT: -
IN THIS FUNCTION THE HIGH_TEMP AND LOW_TEMP CO-EFFICIENTS, UNIVERSAL GAS CONSTANT, GLOBAL (MAX, MID, MIN) TEMPERATURE ARE USED AS INPUT PARAMETERS.
FORMULA: -
USING “if else” CONDITION STATEMENT THE VALUES ARE COMPARED WITH THE GLOBAL_TEMP VALUES AND THE SPECIFIC HEAT IS CALCULATED AND IT IS REPRESENTED AS ‘C_p’.
%Function to calculate specific heat function
function c_p = specific_heat(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3,b4,b5,b6,b7,R,...
temp,global_min,global_max,global_mid)
if temp<=global_mid
c_p = R*(a1 + a2.*temp + a3.*(temp.^2) + a4.*(temp.^3) + a5.*(temp.^4));
else
c_p = R*(b1 + b2.*temp+b3.*(temp.^2) + b4.*(temp.^3) + b5.*(temp.^4));
end
CALCULATION OF MOLECULAR WEIGHT: -
THE ELEMENT NAME WERE USED AS A INPUT ARGUMENT AND IT IS SAVED IN THE VARIABLE ‘ELEMENT’ AND THE OUTPUT ARGUMENT IS THE MOLECULAR WEIGHT.
- A STRING ARRAY IS CREATED WITH THE NAME OF THE ATOMS.
- A VARIABLE atomic_wt IS CREATED WHICH CONTAINS THE ATOMIC WEIGHT OF THE RESPECTIVE ATOMS IN STRING ARRAY.
- THE ‘strcmp’ COMMAND IS USED TO COMAPRE THE NAME OF THE ELEMENT WITH THE STRING ARRAY.
- ‘str2double’ COMMAND IS USED TO FIND THE REPETITION OF ELEMENT AND (n-1) IS MULTIPLIED WITH THE atomic_wt OF THE ELEMENT TO CALCULATE THE MOLECULAR WEIGHT.
%Function for clculating molecular weight
function [w] = molecular_weight(element_name)
s = {'H' 'C' 'N' 'O' 'C2H'};
%atomic weight of each elements
atomic_wt = [1 12 14 16 40];
w = 0;
for i = 1:length(element_name)
for j = 1:length(s)
if strcmp(element_name(i), s(j))
w= w + atomic_wt(j);
%storing the position of matched element
position = j;
end
end
n = str2double(element_name(i));
if n > 1
w = w + atomic_wt(position)*(n-1);
end
end
end
FUNCTION TO WRITE THE MOLECULAR WEIGHT OF ALL ELEMENTS TO A FILE: -
- THE NEW FILE IS CREATED WITH THE NAME “mol_wt.dat” AND IT IS OPENED IN APPEND MODE DENOTED BY “a+” SO WE CAN WRITE THE MOLECULAR WEIGHT OF ALL ELEMENTS IN A SINGLE FILE.
- THE NAME OF THE ELEMENT ALONG WITH THE MOLECULAR WEIGHT CAN BE WRITTEN TO THE FILE USING “fprintf” COMMAND.
%Function to writing molecular weight of elements to a file
function writing_to_file(element_name,weight)
dir_name = element_name;
mol_file = fopen('mol_wt.dat','a+');
fprintf(mol_file, 'Molecular weight of %s is %f n', dir_name,weight);
fclose(mol_file);
end
FUNCTION TO PLOT AND SAVE GRAPHS: -
- THE ‘mkdir’ COMMAND IS USED TO CREATE A NEW FOLDER IN A CURRENT FOLDER ‘pwd’ WITH THE SAME ELEMENT NAME.
- THE FIGURE(1) REPRESENTS THE TEMPERATURE VS SPECIFIC HEAT.
- THE FIGURE(2) REPRESENTS THE TEMPERATURE VS ENTHALPY VALUES.
- THE FIGURE(3) REPRESENTS THE TEMPERATURE VS ENTROPY VALUES.
- USING ‘cd’ COMMAND THE FOLDER IS CHANGED BACK TO ITS ORIGINAL FOLDER.
- THIS FUNCTION RUNS ‘53’ TIMES USING ‘for loop’.
%Function to plot graphs for all elements
function plotting(c_p,H,S,temp,element_name)
cd(pwd);
dir_name=element_name;
mkdir(dir_name);
%Plotting temperature vs specific heat
figure(1)
plot(temp,c_p,'lineWidth',3,'color','r');
title(sprintf('Specific Heat vs Temperature rn for %s:',element_name));
xlabel('Temperature');
ylabel('Specific Heat');
% Plotting temperature vs Enthalpy
figure(2)
plot(temp,H,'linewidth',3,'color','g');
title(sprintf('Enthalpy vs Temperature rn for %s:',element_name));
xlabel('Temperature');
ylabel('Enthalpy');
% Plotting temperature vs Entropy
figure(3)
plot(temp,S,'linewidth',3,'color','b');
title(sprintf('Entropy vs Temperature rn for %s:',element_name));
xlabel('Temperature');
ylabel('Entropy');
cd(dir_name);
saveas(1,'c_p_vs_temp.png');
saveas(2,'H_vs_temp.png');
saveas(3,'S_vs_temp.png');
cd .. ;
end
MAIN PROGRAM: -
close all
clear all
clc
% inputs
R= 8.314; % gas constant
% Reading the data file
f1=fopen('THERMO.dat','r');
% Reading the first line of the file
L1= fgetl(f1);
% Getting the global max,mid,minimum tempeeratures
L2= fgetl(f1);
t = strsplit(L2);
global_min = str2double(t{2});
global_mid = str2double(t{3});
global_max = str2double(t{4});
%Defining the temperature range
temp = linspace (global_min,global_max,500);
%Ignoring the comments in the file
for i=1:3
fgetl(f1);
end
for i=1:53
%Reading the first line which includes the information for species
l=fgetl(f1);
%Reading the name of the species
element_name=strtok(l);
%Reading the three lines which contains 7 high temp coefficients & 7 low temp
%coefficients
l1=fgetl(f1);
l2=fgetl(f1);
l3=fgetl(f1);
%Finding the position of E so that we can extract the coefficients
a=strfind(l1,'E');
b=strfind(l2,'E');
c=strfind(l3,'E');
%Extracting high temp coefficient
a1=str2double(l1(1:a(1)+3));
a2=str2double(l1(a(1)+3:a(2)+3));
a3=str2double(l1(a(2)+4:a(3)+3));
a4=str2double(l1(a(3)+4:a(4)+3));
a5=str2double(l1(a(4)+4:a(5)+3));
a6=str2double(l2(1:b(1)+3));
a7=str2double(l2(b(1)+4:b(2)+3));
%Extracting low temp coefficient
b1=str2double(l2(b(2)+4:b(3)+3));
b2=str2double(l2(b(3)+4:b(4)+3));
b3=str2double(l2(b(4)+4:b(5)+3));
b4=str2double(l3(1:c(1)+3));
b5=str2double(l3(c(1)+4:c(2)+3));
b6=str2double(l3(c(2)+4:c(3)+3));
b7=str2double(l3(c(3)+4:c(4)+3));
%Calculating specific heat
c_p = specific_heat(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3,b4,b5,b6,b7,R,temp,...
global_min,global_max,global_mid);
%Calculalting enthalpy
H = enthalpy(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3,b4,b5,b6,b7,R,temp,global_min,...
global_max,global_mid);
%calculating entropy
S = entropy(a1,a2,a3,a4,a5,a6,a7,b1,b2,b3,b4,b5,b6,b7,R,temp,global_min,...
global_max,global_mid);
%Plotting graphs
plotting(c_p,H,S,temp,element_name);
%Calculating molecular weights
mol_wt(i) = molecular_weight(element_name);
disp(mol_wt(i));
Molucular_Weight = strcat(mol_wt(i),element_name)
%Function to write molecular weight to a file
weight = mol_wt(i);
writing_to_file(element_name, weight);
end
fclose(f1)
THE PLOTS FOR CO2: -
THE PLOTS FOR N2: -
THE PLOTS FOR O2: -
THE SCREEN SHOT FOR ELEMENT FOLDERS: -