| Name | Description |
|---|---|
| Interactive | Modelica description of the virtual-lab |
| viewDoublePipeHeatExchanger | Modelica description of the virtual-lab view |
| Function that compute the vertices of a square given its center position and side length | |
| Function to compute the vertices of the gas CV section | |
| Function to compute the vertices of the liquid CV section | |
| Function to compute the vertices of the inner pipe section | |
| Function to compute the vertices of the outer pipe section | |
| Function to compute the liquid color for a certain temperature | |
| Function to compute the gas color for a certain temperature |
model Interactive "Modelica description of the virtual-lab"
VirtualLabBuilder.VLabModels.VirtualLab interactive(redeclare model ViewI =
viewDoublePipeHeatExchanger, redeclare model ModelI =
PhysicalModel.DoublePipeHeatExchanger,
Tcom=1,
fileName="heatExchanger.java");
Real xsize;
equation
xsize = interactive.Model.lenPipe/9;
interactive.View.liquid.x[1,:] = drawSquare(-xsize*17/4, xsize/2);
interactive.View.liquid.x[2,:] = drawSquare(-xsize*7/2, xsize);
interactive.View.liquid.x[3,:] = drawSquare(-xsize*5/2, xsize);
interactive.View.liquid.x[4,:] = drawSquare(-xsize*3/2, xsize);
interactive.View.liquid.x[5,:] = drawSquare(-xsize/2, xsize);
interactive.View.liquid.x[6,:] = drawSquare(xsize/2, xsize);
interactive.View.liquid.x[7,:] = drawSquare(3*xsize/2, xsize);
interactive.View.liquid.x[8,:] = drawSquare(5*xsize/2, xsize);
interactive.View.liquid.x[9,:] = drawSquare(7*xsize/2, xsize);
interactive.View.liquid.x[10,:] = drawSquare((7.0/2.0+1.0/2.0+1.0/4.0)*xsize,xsize/2.0);
for i in 1:10 loop
interactive.View.liquid.y[i,:] = sectionLiquid(interactive.Model.pipeDiameter2, interactive.Model.pipeDiameter3);
end for;
interactive.View.gas.x[1,:] = drawSquare(-xsize*17/4, xsize/2);
interactive.View.gas.x[2,:] = drawSquare(-xsize*7/2, xsize);
interactive.View.gas.x[3,:] = drawSquare(-xsize*5/2, xsize);
interactive.View.gas.x[4,:] = drawSquare(-xsize*3/2, xsize);
interactive.View.gas.x[5,:] = drawSquare(-xsize/2, xsize);
interactive.View.gas.x[6,:] = drawSquare(xsize/2, xsize);
interactive.View.gas.x[7,:] = drawSquare(3*xsize/2, xsize);
interactive.View.gas.x[8,:] = drawSquare(5*xsize/2, xsize);
interactive.View.gas.x[9,:] = drawSquare(7*xsize/2, xsize);
interactive.View.gas.x[10,:] = drawSquare((7.0/2.0+1.0/2.0+1.0/4.0)*xsize,xsize/2.0);
for i in 1:10 loop
interactive.View.gas.y[i,:] = sectionGas(interactive.Model.pipeDiameter1);
end for;
interactive.View.pipe1D.x = drawSquare(0, interactive.Model.lenPipe);
interactive.View.pipe1D.y = sectionPipe1(interactive.Model.pipeDiameter1, interactive.Model.pipeDiameter2);
interactive.View.pipe1U.x = drawSquare(0, interactive.Model.lenPipe);
interactive.View.pipe1U.y = sectionPipe2(interactive.Model.pipeDiameter1, interactive.Model.pipeDiameter2, interactive.Model.pipeDiameter3);
for i in 1:10 loop
interactive.View.liquid.fillColor[i,:] = tempLiquid(interactive.Model.tempLiq[i]);
end for;
for i in 1:10 loop
interactive.View.gas.fillColor[i,:] = tempGas(interactive.Model.tempGas[i]);
end for;
//Sliders:
interactive.View.gasPressure.var = interactive.Model.gasPressure;
interactive.View.molarFractCO2.var = interactive.Model.molarFractCO2;
interactive.View.lenPipe.var = interactive.Model.lenPipe;
interactive.View.pipe1.var = interactive.Model.pipeDiameter1;
interactive.View.pipe2.var = interactive.Model.pipeDiameter2;
interactive.View.pipe3.var = interactive.Model.pipeDiameter3;
interactive.View.InTempLiq.var = interactive.Model.sourceL1Cntrl.tempFlowSP;
interactive.View.InTempGas.var = interactive.Model.sourceG1Cntrl.tempFlowSP;
interactive.View.InFlowLiq.var = interactive.Model.sourceL1Cntrl.totalMassFlowSP;
interactive.View.InFlowGas.var = interactive.Model.sourceG1Cntrl.totalMolFlowSP;
for i in 1:10 loop
interactive.View.trailh.point[i,:]= {time,interactive.Model.tempLiq[i]};
end for;
for i in 1:10 loop
interactive.View.trailg.point[i,:]= {time,interactive.Model.tempGas[i]};
end for;
for i in 1:9 loop
interactive.View.trailw.point[i,:]= {time,interactive.Model.tempWall[i]};
end for;
interactive.View.trailtempG1.point = {time, interactive.Model.tempGasFlowSourceG1};
interactive.View.trailtempL1.point = {time, interactive.Model.tempLiqFlowSourceL1};
interactive.View.trailFlowLiq.point = {time, interactive.Model.massFlowLiq[1]};
interactive.View.trailFlowGas.point = {time, interactive.Model.sourceG2.totalMolFSP};
when (interactive.View.lenPipe.event or interactive.View.pipe1.event or interactive.View.pipe2.event or interactive.View.pipe3.event) then
reinit(interactive.Model.volCntrlGas1.vessel.vesselVolume,
0.5 * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas2.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas3.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas4.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas5.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas6.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas7.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas8.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas9.vessel.vesselVolume,
interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.volCntrlGas10.vessel.vesselVolume,
0.5 * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
// El cambio en la geometria del intercambiador modifica la cantidad de agua en
// los volúmenes de control, de modo que siempre se encuentren llenos de agua
reinit(interactive.Model.volCntrlLiq1.liquid.massL[1],
0.5 * interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq2.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq3.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq4.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq5.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq6.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq7.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq8.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq9.liquid.massL[1],
interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
reinit(interactive.Model.volCntrlLiq10.liquid.massL[1],
0.5 * interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2) * interactive.Model.lenPipe / (interactive.Model.numNodes - 1) * interactive.Model.densityL[1]);
// El cambio en la geometria del intercambiador modifica la masa de los elementos de pared
reinit(interactive.Model.pipeWall1.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall2.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall3.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall4.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall5.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall6.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall7.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall8.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
reinit(interactive.Model.pipeWall9.mass,
interactive.Model.densityIntPipeWall * interactive.Model.lenPipe * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) / (interactive.Model.numNodes - 1));
// El cambio en la geometria del intercambiador modifica la conduccion de calor en la pared
reinit(interactive.Model.condHeat12.Rth,
interactive.Model.lenPipe / (interactive.Model. thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * (interactive.Model.numNodes - 1)));
reinit(interactive.Model.condHeat23.Rth,
interactive.Model.lenPipe / ( interactive.Model.thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * ( interactive.Model.numNodes - 1)));
reinit(interactive.Model.condHeat34.Rth,
interactive.Model.lenPipe / ( interactive.Model.thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * ( interactive.Model.numNodes - 1)));
reinit(interactive.Model.condHeat45.Rth,
interactive.Model.lenPipe / ( interactive.Model.thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * ( interactive.Model.numNodes - 1)));
reinit(interactive.Model.condHeat56.Rth,
interactive.Model.lenPipe / ( interactive.Model.thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * ( interactive.Model.numNodes - 1)));
reinit(interactive.Model.condHeat67.Rth,
interactive.Model.lenPipe / ( interactive.Model.thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * ( interactive.Model.numNodes - 1)));
reinit(interactive.Model.condHeat78.Rth,
interactive.Model.lenPipe / ( interactive.Model.thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * ( interactive.Model.numNodes - 1)));
reinit(interactive.Model.condHeat89.Rth,
interactive.Model.lenPipe / ( interactive.Model.thermalCondWall * interactive.Model.pi * ( (interactive.Model.pipeDiameter2/2)^ 2 - (interactive.Model.pipeDiameter1/2)^ 2) * ( interactive.Model.numNodes - 1)));
// El cambio en la geometria del intercambiador modifica la conveccion de calor liquido - pared
reinit(interactive.Model.convHeatFL1.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL2.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL3.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL4.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL5.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL6.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL7.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL8.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL9.pipeDiameter, interactive.Model.pipeDiameter2);
reinit(interactive.Model.convHeatFL1.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL2.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL3.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL4.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL5.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL6.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL7.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL8.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL9.pipeSection, interactive.Model.pi * ( (interactive.Model.pipeDiameter3/2)^ 2 - (interactive.Model.pipeDiameter2/2)^ 2));
reinit(interactive.Model.convHeatFL1.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL2.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL3.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL4.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL5.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL6.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL7.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL8.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFL9.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter2 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
// El cambio en la geometria del intercambiador modifica la conveccion de calor gas - pared
reinit(interactive.Model.convHeatFG1.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG2.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG3.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG4.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG5.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG6.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG7.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG8.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG9.pipeDiameter, interactive.Model.pipeDiameter1);
reinit(interactive.Model.convHeatFG1.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG2.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG3.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG4.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG5.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG6.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG7.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG8.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG9.pipeSection, interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2);
reinit(interactive.Model.convHeatFG1.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG2.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG3.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG4.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG5.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG6.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG7.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG8.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
reinit(interactive.Model.convHeatFG9.pipeSurfaceArea, interactive.Model.pi * interactive.Model.pipeDiameter1 * interactive.Model.lenPipe / (interactive.Model.numNodes - 1));
end when;
when interactive.View.molarFractCO2.event then
reinit(interactive.Model.sourceG2Cntrl.molFracCO2SP, interactive.View.molarFractCO2.var);
end when;
when interactive.View.InTempLiq.event then
reinit(interactive.Model.sourceL2Cntrl.tempFlowSP,interactive.View.InTempLiq.var);
end when;
when interactive.View.InFlowGas.event then
reinit(interactive.Model.pumpGCntrl.totalMolFlowSP, interactive.View.InFlowGas.var);
reinit(interactive.Model.sourceG2Cntrl.totalMolFlowSP, interactive.View.InFlowGas.var);
end when;
when interactive.View.InTempGas.event then
reinit(interactive.Model.sourceG2Cntrl.tempFlowSP, interactive.View.InTempGas.var);
end when;
when interactive.View.InFlowLiq.event then
reinit(interactive.Model.pumpLCntrl.totalMassFlowSP, interactive.View.InFlowLiq.var);
reinit(interactive.Model.sourceL2Cntrl.totalMassFlowSP, interactive.View.InFlowLiq.var);
end when;
// Numero de moles de CO2 y SO2 en los volumenes de control,
when interactive.View.molarFractCO2.event or interactive.View.gasPressure.event then
reinit(interactive.Model.volCntrlGas1.semiPerfGas.molG[1],
0.5*interactive.View.molarFractCO2.var *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas1.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas1.semiPerfGas.molG[2],
0.5*(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas1.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas2.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas2.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas2.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas2.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas3.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas3.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas3.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas3.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas4.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas4.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas4.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas4.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas5.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas5.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas5.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) *interactive.Model.perfGasConst *interactive.Model.volCntrlGas5.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas6.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas6.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas6.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas6.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas7.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas7.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas7.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas7.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas8.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas8.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas8.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas8.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas9.semiPerfGas.molG[1],interactive.View.molarFractCO2.var
*interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas9.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas9.semiPerfGas.molG[2],
(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas9.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas10.semiPerfGas.molG[1],
0.5*interactive.View.molarFractCO2.var *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas10.semiPerfGas.tempG));
reinit(interactive.Model.volCntrlGas10.semiPerfGas.molG[2],
0.5*(1-interactive.View.molarFractCO2.var) *interactive.View.gasPressure.var * interactive.Model.pi * (interactive.Model.pipeDiameter1/2)^ 2 * interactive.Model.lenPipe / ( (interactive.Model.numNodes - 1) * interactive.Model.perfGasConst *interactive.Model.volCntrlGas10.semiPerfGas.tempG));
end when;
when interactive.View.InFlowLiq.event then
LogVariable(time);
end when;
end Interactive;
model viewDoublePipeHeatExchanger
"Modelica description of the virtual-lab view"
import VirtualLabBuilder;
extends VirtualLabBuilder.VLabModels.PartialView( fileName = "heatExch.java", Tcom = 1);
VirtualLabBuilder.ViewElements.Containers.MainFrame MF(Width=535, Height=
700);
VirtualLabBuilder.ViewElements.Containers.DrawingPanel DP(
XMin=-2,
XMax=2,
YMin=-0.05,
YMax=0.05);
VirtualLabBuilder.ViewElements.Containers.Panel panelN(
position="NORTH",
nColumns=2,
LayoutPolicy="GridLayout",
nRows=3);
VirtualLabBuilder.ViewElements.Containers.Panel panelS(
nRows=3,
nColumns=2,
LayoutPolicy="GridLayout");
VirtualLabBuilder.ViewElements.Drawables.PolygonSet liquid(
fillColorp={0,0,255,255},
intFillColor=1,
N=10,
nPoints=4,
intVertexesX={1,1,1,1},
intVertexesY={1,1,1,1});
VirtualLabBuilder.ViewElements.Drawables.Polygon pipe1D(nPoints=4, fillColorp={192,192,192,255},
intVertexesX={1,1,1,1},
intVertexesY={1,1,1,1},
lineColorp={0,0,0,255},
filled="true",
closed="true");
VirtualLabBuilder.ViewElements.Drawables.Polygon pipe1U(nPoints=4, fillColorp={192,192,192,255},
intVertexesX={1,1,1,1},
intVertexesY={1,1,1,1},
lineColorp={0,0,0,255},
filled="true",
closed="true");
VirtualLabBuilder.ViewElements.InteractiveControls.Slider InTempLiq(
stringFormat="Input Temperature Liq (K)= 0",
tickNumber=9,
minimum=283,
maximum=313);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider InTempGas(
stringFormat="Input Temperature Gas (K)= 0",
tickNumber=9,
minimum=273 + 60,
maximum=273 + 140);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider InFlowLiq(
maximum=0.5,
stringFormat="Input Flow Liq (Kg/s)= 0.0",
tickNumber=9);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider InFlowGas(
maximum=0.4, stringFormat=
"Input Flow Gas (mol/s)= 0.0",
tickNumber=9);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider gasPressure(
tickFormat="0",
minimum=1e5,
maximum=10e5,
stringFormat="Gas pressure (Pa) = 00000",
tickNumber=3);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider molarFractCO2(stringFormat=
"Molar Fraction CO2 = 0.00", tickNumber=9);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider lenPipe(
minimum=0.5,
tickFormat="0.0",
maximum=2,
stringFormat="Pipe Length (m)= 0.0",
tickNumber=9);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider pipe1(
minimum=0.01,
maximum=0.02,
stringFormat="Inner diameter pipe1 (m)= 0.00",
tickNumber=9);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider pipe2(
minimum=0.021,
maximum=0.036,
stringFormat="Outer diameter pipe1 (m)= 0.00",
tickNumber=9);
VirtualLabBuilder.ViewElements.InteractiveControls.Slider pipe3(
minimum=0.036,
maximum=0.05,
stringFormat="Outer diameter pipe2 (m) = 0.00",
tickNumber=9);
VirtualLabBuilder.ViewElements.BasicElements.CheckBox checkBox(label="Show plots");
VirtualLabBuilder.ViewElements.Containers.Dialog dialog(
varName="var",
LayoutPolicy="GridLayout",
nRows=3,
nColumns=3,
xPosition=535,
Height=700,
Width=535);
VirtualLabBuilder.ViewElements.Containers.PlottingPanel PP1(
title="Liquid temperature",
titleX="time (s)",
titleY="K",
autoScaleY="false",
minY=273,
maxY=273.15 + 60);
VirtualLabBuilder.ViewElements.Containers.PlottingPanel PP2(
title="Gas temperature",
titleX="time (s)",
titleY="K",
maxY=273.15 + 140,
autoScaleY="false",
minY=273);
VirtualLabBuilder.ViewElements.Containers.PlottingPanel PP3(
title="Wall temperature",
titleX="time (s)",
titleY="K",
maxY=273.15 + 140,
autoScaleY="false",
minY=273);
VirtualLabBuilder.ViewElements.Containers.PlottingPanel PP4(
titleX="time (s)",
title="Pump temperature",
titleY="K",
maxY=273.15 + 140,
autoScaleY="false",
minY=273);
VirtualLabBuilder.ViewElements.Containers.PlottingPanel PP5(
title="Liquid flow",
titleX="time (s)",
titleY="Kg/s",
autoScaleY="false");
VirtualLabBuilder.ViewElements.Containers.PlottingPanel PP6(
titleX="time (s)",
titleY="mol/s",
maxY=0.5,
title="Gas flow",
autoScaleY="false");
VirtualLabBuilder.ViewElements.Drawables.Trail trailtempG1(
maximumPoints=1000,
lineColor={255,0,0,255},
nSkip=0);
VirtualLabBuilder.ViewElements.Drawables.Trail trailtempL1(
maximumPoints=1000,
lineColor={0,0,255,255},
nSkip=0);
VirtualLabBuilder.ViewElements.Drawables.Trail trailFlowLiq(
maximumPoints=1000,
lineColor={0,0,255,255},
nSkip=0);
VirtualLabBuilder.ViewElements.Drawables.Trail trailFlowGas(
maximumPoints=1000,
lineColor={255,0,0,255},
nSkip=0);
VirtualLabBuilder.ViewElements.Drawables.TrailSet trailh(
N_trails=10,
lineColor={0,0,255,255},
maximumPoints=1000,
nSkip=0);
VirtualLabBuilder.ViewElements.Drawables.TrailSet trailg(
N_trails=10,
lineColor={255,0,0,255},
maximumPoints=1000,
nSkip=0);
VirtualLabBuilder.ViewElements.Drawables.TrailSet trailw(
lineColor={192,192,192,255},
N_trails=9,
maximumPoints=1000,
nSkip=0);
VirtualLabBuilder.ViewElements.Drawables.PolygonSet gas(
intFillColor=1,
N=10,
nPoints=4,
intVertexesX={1,1,1,1},
intVertexesY={1,1,1,1},
fillColorp={255,0,0,255});
equation
connect(MF.pLLeft, root.cLLeft);
connect(MF.cLLeft, dialog.pLLeft);
connect(MF.cLRight, DP.pLLeft);
connect(DP.cLLeft, panelS.pLLeft);
connect(panelS.cLLeft, panelN.pLLeft);
connect(panelS.cLRight, gasPressure.pLLeft);
connect(gasPressure.cLLeft, molarFractCO2.pLLeft);
connect(lenPipe.cLLeft, pipe1.pLLeft);
connect(pipe1.cLLeft, pipe2.pLLeft);
connect(pipe2.cLLeft, pipe3.pLLeft);
connect(panelN.cLRight, InTempLiq.pLLeft);
connect(InTempLiq.cLLeft, InTempGas.pLLeft);
connect(InFlowLiq.cLLeft, InFlowGas.pLLeft);
connect(PP1.cLLeft, PP2.pLLeft);
connect(PP2.cLLeft, PP3.pLLeft);
connect(PP4.cRight, trailtempG1.pLeft);
connect(PP5.cRight, trailFlowLiq.pLeft);
connect(PP6.cRight, trailFlowGas.pLeft);
connect(PP3.cLLeft, PP4.pLLeft);
connect(PP4.cLLeft, PP5.pLLeft);
connect(PP5.cLLeft, PP6.pLLeft);
connect(dialog.cLRight, PP1.pLLeft);
connect(molarFractCO2.cLLeft, lenPipe.pLLeft);
connect(InTempGas.cLLeft, InFlowLiq.pLLeft);
connect(InFlowGas.cLLeft, checkBox.pLLeft);
connect(DP.cRight, pipe1U.pLeft);
connect(PP1.cRight, trailh.parent);
connect(PP2.cRight, trailg.parent);
connect(PP3.cRight, trailw.parent);
connect(trailtempG1.cLeft, trailtempL1.pLeft);
connect(pipe1U.cLeft, liquid.parent);
connect(liquid.child, pipe1D.pLeft);
connect(pipe1D.cLeft, gas.parent);
end viewDoublePipeHeatExchanger;
| Type | Name | Default | Description |
|---|---|---|---|
| Real | centro | ||
| Real | xsize |
| Type | Name | Description |
|---|---|---|
| Real | x[4] |
function drawSquare "Function that compute the vertices of a square given its center position and side length" output Real x[4]; input Real centro; input Real xsize; algorithm x[1] :=centro + xsize/2; x[2] :=x[1]; x[3] :=centro - xsize/2; x[4] :=x[3]; end drawSquare;
| Type | Name | Default | Description |
|---|---|---|---|
| Real | pipeDiameter1 |
| Type | Name | Description |
|---|---|---|
| Real | y[4] |
function sectionGas "Function to compute the vertices of the gas CV section" output Real y[4]; input Real pipeDiameter1; algorithm y[1] :=-pipeDiameter1/2; y[2] :=pipeDiameter1/2; y[3] :=pipeDiameter1/2; y[4] :=-pipeDiameter1/2; end sectionGas;
| Type | Name | Default | Description |
|---|---|---|---|
| Real | pipeDiameter2 | ||
| Real | pipeDiameter3 |
| Type | Name | Description |
|---|---|---|
| Real | y[4] |
function sectionLiquid "Function to compute the vertices of the liquid CV section" output Real y[4]; input Real pipeDiameter2; input Real pipeDiameter3; algorithm y[1] :=-(pipeDiameter2/2 + (pipeDiameter3 - pipeDiameter2)/2); y[2] :=pipeDiameter2/2 + (pipeDiameter3 - pipeDiameter2)/2; y[3] :=pipeDiameter2/2 + (pipeDiameter3 - pipeDiameter2)/2; y[4] :=-(pipeDiameter2/2 + (pipeDiameter3 - pipeDiameter2)/2); end sectionLiquid;
| Type | Name | Default | Description |
|---|---|---|---|
| Real | pipeDiameter1 | ||
| Real | pipeDiameter2 |
| Type | Name | Description |
|---|---|---|
| Real | y[4] |
function sectionPipe1 "Function to compute the vertices of the inner pipe section" output Real y[4]; input Real pipeDiameter1; input Real pipeDiameter2; algorithm y[1] :=-(pipeDiameter1/2 + (pipeDiameter2 - pipeDiameter1)/2); y[2] :=pipeDiameter1/2 + (pipeDiameter2 - pipeDiameter1)/2; y[3] :=pipeDiameter1/2 + (pipeDiameter2 - pipeDiameter1)/2; y[4] :=-(pipeDiameter1/2 + (pipeDiameter2 - pipeDiameter1)/2); end sectionPipe1;
| Type | Name | Default | Description |
|---|---|---|---|
| Real | pipeDiameter1 | ||
| Real | pipeDiameter2 | ||
| Real | pipeDiameter3 |
| Type | Name | Description |
|---|---|---|
| Real | y[4] |
function sectionPipe2 "Function to compute the vertices of the outer pipe section" output Real y[4]; input Real pipeDiameter1; input Real pipeDiameter2; input Real pipeDiameter3; algorithm y[1] :=-(pipeDiameter3/2 + (pipeDiameter2 - pipeDiameter1)/2); y[2] :=pipeDiameter3/2 + (pipeDiameter2 - pipeDiameter1)/2; y[3] :=pipeDiameter3/2 + (pipeDiameter2 - pipeDiameter1)/2; y[4] :=-(pipeDiameter3/2 + (pipeDiameter2 - pipeDiameter1)/2); end sectionPipe2;
| Type | Name | Default | Description |
|---|---|---|---|
| Real | p | 3 |
| Type | Name | Default | Description |
|---|---|---|---|
| Real | temp |
| Type | Name | Description |
|---|---|---|
| Real | color[4] |
function tempLiquid
"Function to compute the liquid color for a certain temperature"
output Real color[4];
input Real temp;
parameter Real p = 3;
protected
Integer j;
Boolean breakLoop;
algorithm
color[2] :=0;
color[4] :=255;
j:=0;
breakLoop :=false;
while j<9 and (breakLoop == false) loop
if ( temp<(10+273.15+j*p)) then
color[1]:=10*j;
color[3] :=255 - 25*j;
breakLoop :=true;
end if;
j :=j + 1;
end while;
if (temp>(273.15+40)) then
color[1] :=100;
color[3] :=25;
end if;
end tempLiquid;
| Type | Name | Default | Description |
|---|---|---|---|
| Real | temp |
| Type | Name | Description |
|---|---|---|
| Real | color[4] |
function tempGas
"Function to compute the gas color for a certain temperature"
output Real color[4];
input Real temp;
protected
parameter Real p = 7;
Integer j;
Boolean breakLoop;
algorithm
color[2] :=0;
color[4] :=255;
j:=0;
breakLoop :=false;
while j<9 and (breakLoop == false) loop
if ( temp<(60+273.15+j*p)) then
color[1]:=20*j+70;
color[3] :=25;
breakLoop :=true;
end if;
j :=j + 1;
end while;
if (temp>(273.15+120)) then
color[1] :=255;
color[3] :=0;
end if;
end tempGas;