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;