—-
Phase Changes
A graph of the temperature of a material over time is called a heating curve. The heating curve shows the change of state of a material as more energy (higher temperature) is added to the material. The sloped regions of the graph show how energy is raising the temperature of that state until a plateau (the flat regions of the graph) is reached. This is known as *specific heat*. Specific heat capacity (shown as the variable “$C$” — not to be confused with Celsius of Calories) is the amount of heat required to change the temperature of a mass unit of a substance by one degree. For special conditions, $C_v$ is used for isochoric (constant volume) environments or $C_p$ for isobaric (constant pressure) environments. $Q = mC\Delta T$ is the governing equation, where $Q$ is the total energy in kilojoules, $m$ is the mass of the substance in grams, and $\Delta T$ is the difference between the final and initial temperatures of the substance in Kelvin.
During the plateau, additional energy is needed to bring the entire mass of the matter to a point where it can move to the next state. This is known as the *latent heat* of the substance and is shown as the variable $L$. The total energy is given by the equation $Q=mL$.
Below is a graph showing the heating curve for water. Take a look and use the code below and then answer the following questions that investigate the relationships between kinetic energy level, temperature, particle movement, etc.
Using the graph above, answer the following questions:
Now that you understand how the program works to show the relationship between kinetic energy, particle movement, and temperature, it is time to apply your knowledge to improving and extending the power of the program. Develop answers to the following questions by modifying and improving the existing code.
GlowScript 2.7 VPython #COLLAPSE LINES 3, 8, 11, AND 16! These are special bundles of code, called subroutines, which help simplify the coding later in the program. def ShrinkSolidGrowLiquid():#This subroutine changes the sizes of the solid and liquid phases during melting solid.pos=solid.pos+vec(0,-(L_box/(2*ceil(m*Hfus/dE))),0) #SizeIncrement1=L_box/(2*ceil(m*Hfus/dE)) solid.radius=solid.radius-(L_box/(2*ceil(m*Hfus/dE))) liquid.pos=liquid.pos+vec(0,0.5*(L_box/(2*ceil(m*Hfus/dE))),0) liquid.size=liquid.size+vec(0,(L_box/(2*ceil(m*Hfus/dE))),0) def ShrinkLiquid():#This subroutine changes the size of the liquid phase during vaporization liquid.pos=liquid.pos+vec(0,-0.5*L_box/(2*ceil(m*Hvap/dE)),0) #SizeIncrement2=L_box/(2*ceil(m*Hvap/dE)) liquid.size=liquid.size+vec(0,-L_box/(2*ceil(m*Hvap/dE)),0) def MakeNewParticle():#This subroutine creates a new gas particle and adds it to a list of particles newparticle = sphere(pos=vector(L_box*(random()-0.5),(L_box-liquid.size.y)*(random()-0.5)+liquid.size.y/2,L_box*(random()-0.5)),radius=0.05, color=color.cyan) newparticle.mass = 1 newparticle.velocity = vector(random()-0.5,random()-0.5,random()-0.5)*2 #the coefficient of 2 is a scaling factor for visual effect listOfParticles.append(newparticle) def ParticleMovementAndCollisions(): #This subroutine moves gas particles and handles particle-wall and particle-particle collisions for particle in listOfParticles: if Etotal > Eboil: #If all the liquid has evaporated, start increasing the velocity of the gas particles particle.velocity=particle.velocity+sqrt(2*dE/particle.mass)*(particle.velocity/mag(particle.velocity))*2E-4 #Increase velocity with increasing energy. The coefficient of 2E-4 is a scaling factor for visual effect particle.pos = particle.pos + particle.velocity*0.1 #Update particle position, assume dt=0.1 if abs(particle.pos.x) >= container.length/2:#Particle-wall collision in x particle.velocity.x = - particle.velocity.x if abs(particle.pos.y) >= container.height/2 or particle.pos.y <= (liquid.size.y-L_box/2):#Particle-wall collision in y particle.velocity.y = - particle.velocity.y if abs(particle.pos.z) >= container.width/2:#Particle-wall collision in z particle.velocity.z = - particle.velocity.z for i in range(0,len(listOfParticles)):#Particle-particle collisions, loop through every particle for j in range(i+1,len(listOfParticles)):#loop through every OTHER particle diff = listOfParticles[j].pos - listOfParticles[i].pos #displacement vector between two particles distance = mag(diff) #magnitude of displacement is distance if distance <= listOfParticles[i].radius + listOfParticles[j].radius: #if particles will collide, check their next positions nextpos1 = listOfParticles[i].pos + listOfParticles[i].velocity*0.1 #assume dt=0.1 nextpos2 = listOfParticles[j].pos + listOfParticles[j].velocity*0.1 #assume dt=0.1 if mag(nextpos2 - nextpos1) < distance: #if they collide with each other, transfer momentum rhat = norm(diff) #unit vector of displacement mv1 = listOfParticles[i].mass*listOfParticles[i].velocity #momentum of first particle mv2 = listOfParticles[j].mass*listOfParticles[j].velocity #momentum of second particle transfer = 2.*dot(listOfParticles[i].mass*mv2-listOfParticles[j].mass*mv1,rhat)/(listOfParticles[i].mass+listOfParticles[j].mass)*rhat #momentum transferred listOfParticles[i].velocity = (mv1 + transfer)/listOfParticles[i].mass listOfParticles[j].velocity = (mv2 - transfer)/listOfParticles[j].mass #Define initial parameters: mass of system, inital temperature of system, initial energy of system, and length of container m = 100 #mass (g) T = 0 #Initial Temp (K) Etotal = 0 #Inital total energy input dE = 1000 #incremental energy change (J), how much energy is added to our system for each step of the program. You are advised NOT to change dE. L_box = 6 # Define the length of our container #Create our objects: container, sphere for solid phase, blue box for liquid phase, and empty list for gas particles container = box(pos=vec(0,0,0), size=vec(L_box,L_box,L_box), color=color.white, opacity=0.1) # Creates a box of length L_box solid = sphere(pos=vec(0,0,0), radius=L_box/2, color=color.white) #Creates a sphere for the solid phase liquid = box(pos=vector(0,-L_box/2,0), size=vector(L_box,0,L_box), color=color.blue, opacity=0.75, visible=False) #Creates a box for the liquid phase listOfParticles = [] #Creates an empty list of gas particles for the gas phase #Define properties of our material: heat capacities, latent heats, and transition temperatures c_s=2.108 #solid heat capacity (J/gK) Hfus=335.5 #Latent heat of fusion (J/g) c_l=4.186 #liquid heat capacity (J/gK) Hvap=2260 #Latent heat of vaporization (J/g) c_g=1.996 #gas heat capacity (J/gK) Tm=273 #Melting point (K) Tb=373 #Boiling point (K) #Calculate total energy values at different points (J) Esol=5e4 #Energy to raise temp to melting point, i.e. max energy a solid can have Emelt=1e5 #Energy to raise temp AND melt all of the solid Eliq=2e5 #Energy to raise temp, AND melt, AND reach boiling point, i.e. max energy a liquid can have Eboil=4e5 #Energy melt AND reach boiling point AND boil all the liquid #Initialize Graph Grph1 = graph(title='Temperature vs Energy', xtitle='Energy Input to System (J)', ytitle='Temperature (K)', fast=False, ymin=0, ymax=1000) #initialize our graph axes, titles, and boundaries HeatingCurve = gcurve(color=color.red, label='Heating Curve') #Prepare a data series to be plotted Efinal = 1.25*Eboil #Set the final energy to stop the program at while Etotal < Efinal: #Run loop until Energy is larger than Efinal rate(25) #Change this to make your program run faster or slower. 10-100 is recommended. if Etotal < Esol: #If statement for changing temp within solid phase HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J elif Etotal < Emelt: #If statement for changing from solid to liquid liquid.visible=True #make sure the liquid phase is visible ShrinkSolidGrowLiquid() #Change sizes of solid and liquid phases HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J elif Etotal < Eliq: #If statement for changing temp within liquid phase solid.visible=False #make sure the solid phase is invisible HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J elif Etotal < Eboil: #If statement for changing from liquid to gas ShrinkLiquid() #Change size of liquid phase MakeNewParticle() #Add a gas atom to the container ParticleMovementAndCollisions() #Make the gas particles move and collide HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J else: #Changing temperature within gas phase liquid.visible=False #make sure the liquid phase is invisible ParticleMovementAndCollisions() #Make the gas particles move and collide HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J Etotal = Etotal + dE # Increase the total energy by dE
If the particle movement is low, the matter is in the solid state.
GlowScript 2.7 VPython #COLLAPSE LINES 3, 8, 11, AND 16! These are special bundles of code, called subroutines, which help simplify the coding later in the program. def ShrinkSolidGrowLiquid():#This subroutine changes the sizes of the solid and liquid phases during melting solid.pos=solid.pos+vec(0,-(L_box/(2*ceil(m*Hfus/dE))),0) #SizeIncrement1=L_box/(2*ceil(m*Hfus/dE)) solid.radius=solid.radius-(L_box/(2*ceil(m*Hfus/dE))) liquid.pos=liquid.pos+vec(0,0.5*(L_box/(2*ceil(m*Hfus/dE))),0) liquid.size=liquid.size+vec(0,(L_box/(2*ceil(m*Hfus/dE))),0) def ShrinkLiquid():#This subroutine changes the size of the liquid phase during vaporization liquid.pos=liquid.pos+vec(0,-0.5*L_box/(2*ceil(m*Hvap/dE)),0) #SizeIncrement2=L_box/(2*ceil(m*Hvap/dE)) liquid.size=liquid.size+vec(0,-L_box/(2*ceil(m*Hvap/dE)),0) def MakeNewParticle():#This subroutine creates a new gas particle and adds it to a list of particles newparticle = sphere(pos=vector(L_box*(random()-0.5),(L_box-liquid.size.y)*(random()-0.5)+liquid.size.y/2,L_box*(random()-0.5)),radius=0.05, color=color.cyan) newparticle.mass = 1 newparticle.velocity = vector(random()-0.5,random()-0.5,random()-0.5)*2 #the coefficient of 2 is a scaling factor for visual effect listOfParticles.append(newparticle) def ParticleMovementAndCollisions(): #This subroutine moves gas particles and handles particle-wall and particle-particle collisions for particle in listOfParticles: if Etotal > Eboil: #If all the liquid has evaporated, start increasing the velocity of the gas particles particle.velocity=particle.velocity+sqrt(2*dE/particle.mass)*(particle.velocity/mag(particle.velocity))*2E-4 #Increase velocity with increasing energy. The coefficient of 2E-4 is a scaling factor for visual effect particle.pos = particle.pos + particle.velocity*0.1 #Update particle position, assume dt=0.1 if abs(particle.pos.x) >= container.length/2:#Particle-wall collision in x particle.velocity.x = - particle.velocity.x if abs(particle.pos.y) >= container.height/2 or particle.pos.y <= (liquid.size.y-L_box/2):#Particle-wall collision in y particle.velocity.y = - particle.velocity.y if abs(particle.pos.z) >= container.width/2:#Particle-wall collision in z particle.velocity.z = - particle.velocity.z for i in range(0,len(listOfParticles)):#Particle-particle collisions, loop through every particle for j in range(i+1,len(listOfParticles)):#loop through every OTHER particle diff = listOfParticles[j].pos - listOfParticles[i].pos #displacement vector between two particles distance = mag(diff) #magnitude of displacement is distance if distance <= listOfParticles[i].radius + listOfParticles[j].radius: #if particles will collide, check their next positions nextpos1 = listOfParticles[i].pos + listOfParticles[i].velocity*0.1 #assume dt=0.1 nextpos2 = listOfParticles[j].pos + listOfParticles[j].velocity*0.1 #assume dt=0.1 if mag(nextpos2 - nextpos1) < distance: #if they collide with each other, transfer momentum rhat = norm(diff) #unit vector of displacement mv1 = listOfParticles[i].mass*listOfParticles[i].velocity #momentum of first particle mv2 = listOfParticles[j].mass*listOfParticles[j].velocity #momentum of second particle transfer = 2.*dot(listOfParticles[i].mass*mv2-listOfParticles[j].mass*mv1,rhat)/(listOfParticles[i].mass+listOfParticles[j].mass)*rhat #momentum transferred listOfParticles[i].velocity = (mv1 + transfer)/listOfParticles[i].mass listOfParticles[j].velocity = (mv2 - transfer)/listOfParticles[j].mass #Define initial parameters: mass of system, inital temperature of system, initial energy of system, and length of container m = 100 #mass (g) T = 0 #Initial Temp (K) Etotal = 0 #Inital total energy input dE = 1000 #incremental energy change (J), how much energy is added to our system for each step of the program. You are advised NOT to change dE. L_box = 6 # Define the length of our container #Create our objects: container, sphere for solid phase, blue box for liquid phase, and empty list for gas particles container = box(pos=vec(0,0,0), size=vec(L_box,L_box,L_box), color=color.white, opacity=0.1) # Creates a box of length L_box solid = sphere(pos=vec(0,0,0), radius=L_box/2, color=color.white) #Creates a sphere for the solid phase liquid = box(pos=vector(0,-L_box/2,0), size=vector(L_box,0,L_box), color=color.blue, opacity=0.75, visible=False) #Creates a box for the liquid phase listOfParticles = [] #Creates an empty list of gas particles for the gas phase #Define properties of our material: heat capacities, latent heats, and transition temperatures c_s=2.108 #solid heat capacity (J/gK) Hfus=335.5 #Latent heat of fusion (J/g) c_l=4.186 #liquid heat capacity (J/gK) Hvap=2260 #Latent heat of vaporization (J/g) c_g=1.996 #gas heat capacity (J/gK) Tm=273 #Melting point (K) Tb=373 #Boiling point (K) #Calculate total energy values at different points (J) Esol=m*c_s*(Tm-T) #Energy to raise temp to melting point, i.e. max energy a solid can have Emelt=Esol+m*Hfus #Energy to raise temp AND melt all of the solid Eliq=Emelt+m*c_l*(Tb-Tm) #Energy to raise temp, AND melt, AND reach boiling point, i.e. max energy a liquid can have Eboil=Eliq+m*Hvap #Energy to reach melting point, melt, reach boiling point, and boil all the liquid #Initialize Graph Grph1 = graph(title='Temperature vs Energy', xtitle='Energy Input to System (J)', ytitle='Temperature (K)', fast=False, ymin=0, ymax=1000) #initialize our graph axes, titles, and boundaries HeatingCurve = gcurve(color=color.red, label='Heating Curve') #Prepare a data series to be plotted Efinal = 1.25*Eboil #Set the final energy to stop the program at while Etotal < Efinal: #Run loop until Energy is larger than Efinal rate(25) #Change this to make your program run faster or slower. 10-100 is recommended. if Etotal < Esol: #If statement for changing temp within solid phase T=T+dE/(m*c_s) #Calculate temperature (K) from q=mc(Delta_T) equation HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J elif Etotal < Emelt: #If statement for changing from solid to liquid liquid.visible=True #make sure the liquid phase is visible ShrinkSolidGrowLiquid() #Change sizes of solid and liquid phases HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J elif Etotal < Eliq: #If statement for changing temp within liquid phase solid.visible=False #make sure the solid phase is invisible T=T+dE/(m*c_l) #Calculate temperature (K) from q=mc(Delta_T) equation HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J elif Etotal < Eboil: #If statement for changing from liquid to gas ShrinkLiquid() #Change size of liquid phase MakeNewParticle() #Add a gas atom to the container ParticleMovementAndCollisions() #Make the gas particles move and collide HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J else: #Changing temperature within gas phase liquid.visible=False #make sure the liquid phase is invisible T=T+dE/(m*c_g) #Calculate temperature (K) from q=mc(Delta_T) equation ParticleMovementAndCollisions() #Make the gas particles move and collide HeatingCurve.plot(Etotal, T) #Plot T(K) vs E in J Etotal = Etotal + dE # Increase the total energy by dE