1 #include "TransportEquation.hxx"
\r
2 #include "DiffusionEquation.hxx"
\r
6 #define PI 3.14159265
\r
8 void power_field_CoupledTransportDiffusionTest(Field & Phi){
\r
13 Mesh M = Phi.getMesh();
\r
14 int nbCells = M.getNumberOfCells();
\r
15 for (int j = 0; j < nbCells; j++) {
\r
17 Phi(j) = phi*cos(PI*(x-L/2)/(L+lambda));
\r
21 int main(int argc, char** argv)
\r
23 //Preprocessing: mesh and group creation
\r
28 cout << "Building of the diffusion mesh with "<<nx<<" cells" << endl;
\r
29 Mesh diffusionMesh(xinf,xsup,nx);
\r
30 diffusionMesh.setGroupAtPlan(xsup,0,eps,"Neumann");
\r
31 diffusionMesh.setGroupAtPlan(xinf,0,eps,"Neumann");
\r
33 cout << "Building of the transport mesh with "<<nx<<" cells" << endl;
\r
34 Mesh transportMesh(xinf,xsup,nx);
\r
35 transportMesh.setGroupAtPlan(xsup,0,eps,"Neumann");
\r
36 transportMesh.setGroupAtPlan(xinf,0,eps,"Inlet");
\r
39 // Boundary conditions
\r
40 map<string, LimitFieldDiffusion> boundaryFieldsDiffusion;
\r
41 map<string, LimitFieldTransport> boundaryFieldsTransport;
\r
43 // Boundary conditions for the solid
\r
44 LimitFieldDiffusion limitNeumann;
\r
45 limitNeumann.bcType=NeumannDiffusion;
\r
46 boundaryFieldsDiffusion["Neumann"] = limitNeumann;
\r
48 // Boundary conditions for the fluid
\r
49 LimitFieldTransport limitInlet;
\r
50 limitInlet.bcType=InletTransport;
\r
51 limitInlet.h =1.3e6;//Inlet water enthalpy
\r
52 LimitFieldTransport limitTransportNeumann;
\r
53 limitTransportNeumann.bcType=NeumannTransport;
\r
54 boundaryFieldsTransport["Inlet"] = limitInlet;
\r
55 boundaryFieldsTransport["Neumann"] = limitTransportNeumann;
\r
57 //Set the fluid transport velocity
\r
58 vector<double> transportVelocity(1,5);//Vitesse du fluide
\r
61 double cp_ur=300;//Uranium specific heat
\r
62 double rho_ur=10000;//Uranium density
\r
65 TransportEquation myTransportEquation(LiquidPhase, around155bars600KTransport,transportVelocity);
\r
66 Field fluidEnthalpy("Enthalpie", CELLS, transportMesh, 1);
\r
67 bool FECalculation=false;
\r
68 DiffusionEquation myDiffusionEquation(spaceDim,FECalculation,rho_ur, cp_ur, lambda_ur);
\r
70 Field solidTemp("Solid temperature", CELLS, diffusionMesh, 1);
\r
71 Field fluidTemp("Fluid temperature", CELLS, transportMesh, 1);
\r
73 double heatTransfertCoeff=10000;//fluid/solid heat exchange coefficient
\r
74 myTransportEquation.setHeatTransfertCoeff(heatTransfertCoeff);
\r
75 myDiffusionEquation.setHeatTransfertCoeff(heatTransfertCoeff);
\r
77 //Set heat source in the solid
\r
78 Field Phi("Heat power field", CELLS, diffusionMesh, 1);
\r
79 power_field_CoupledTransportDiffusionTest(Phi);
\r
80 myDiffusionEquation.setHeatPowerField(Phi);
\r
81 Phi.writeVTK("1DheatPowerField");
\r
83 //Initial field creation
\r
84 Vector VV_Constant(1);
\r
85 VV_Constant(0) = 623;//Rod clad temperature nucleaire
\r
87 cout << "Construction de la condition initiale " << endl;
\r
88 // generate initial condition
\r
89 myDiffusionEquation.setInitialFieldConstant(diffusionMesh,VV_Constant);
\r
92 VV_Constant(0) = 1.3e6;
\r
93 myTransportEquation.setInitialFieldConstant(transportMesh,VV_Constant);
\r
95 //set the boundary conditions
\r
96 myTransportEquation.setBoundaryFields(boundaryFieldsTransport);//Neumann and Inlet BC will be used
\r
97 myDiffusionEquation.setBoundaryFields(boundaryFieldsDiffusion);//Only Neumann BC will be used
\r
99 // set the numerical method
\r
100 myDiffusionEquation.setTimeScheme( Explicit);
\r
101 myTransportEquation.setTimeScheme( Explicit);
\r
103 // name result file
\r
104 string fluidFileName = "1DFluidEnthalpy";
\r
105 string solidFileName = "1DSolidTemperature";
\r
107 // parameters calculation
\r
108 unsigned MaxNbOfTimeStep =3;
\r
111 double maxTime = 1000000;
\r
112 double precision = 1e-6;
\r
114 myDiffusionEquation.setCFL(cfl);
\r
115 myDiffusionEquation.setPrecision(precision);
\r
116 myDiffusionEquation.setMaxNbOfTimeStep(MaxNbOfTimeStep);
\r
117 myDiffusionEquation.setTimeMax(maxTime);
\r
118 myDiffusionEquation.setFreqSave(freqSave);
\r
119 myDiffusionEquation.setFileName(solidFileName);
\r
121 myTransportEquation.setCFL(cfl);
\r
122 myTransportEquation.setPrecision(precision);
\r
123 myTransportEquation.setMaxNbOfTimeStep(MaxNbOfTimeStep);
\r
124 myTransportEquation.setTimeMax(maxTime);
\r
125 myTransportEquation.setFreqSave(freqSave);
\r
126 myTransportEquation.setFileName(fluidFileName);
\r
128 // loop on time steps
\r
129 myDiffusionEquation.initialize();
\r
130 myTransportEquation.initialize();
\r
132 double time=0,dt=0;
\r
134 bool stop=false, stop_transport=false, stop_diffusion=false; // Does the Problem want to stop (error) ?
\r
135 bool ok; // Is the time interval successfully solved ?
\r
138 while(!stop && !(myDiffusionEquation.isStationary() && myTransportEquation.isStationary()) &&time<maxTime && nbTimeStep<MaxNbOfTimeStep)
\r
140 ok=false; // Is the time interval successfully solved ?
\r
141 fluidTemp=myTransportEquation.getFluidTemperatureField();
\r
142 solidTemp=myDiffusionEquation.getRodTemperatureField();
\r
143 myDiffusionEquation.setFluidTemperatureField(fluidTemp);
\r
144 myTransportEquation.setRodTemperatureField(solidTemp);
\r
145 // Guess the next time step length
\r
146 dt=min(myDiffusionEquation.computeTimeStep(stop),myTransportEquation.computeTimeStep(stop));
\r
148 cout << "Failed computing time step "<<nbTimeStep<<", time = " << time <<", dt= "<<dt<<", stopping calculation"<< endl;
\r
151 // Loop on the time interval tries
\r
152 while (!ok && !stop )
\r
154 stop_transport=!myTransportEquation.initTimeStep(dt);
\r
155 stop_diffusion=!myDiffusionEquation.initTimeStep(dt);
\r
156 stop=stop_diffusion && stop_transport;
\r
158 // Prepare the next time step
\r
160 cout << "Failed initializing time step "<<nbTimeStep<<", time = " << time <<", dt= "<<dt<<", stopping calculation"<< endl;
\r
163 // Solve the next time step
\r
164 ok=myDiffusionEquation.solveTimeStep()&& myTransportEquation.solveTimeStep();
\r
166 if (!ok) // The resolution failed, try with a new time interval.
\r
168 myDiffusionEquation.abortTimeStep();
\r
169 myTransportEquation.abortTimeStep();
\r
170 cout << "Failed solving time step "<<nbTimeStep<<", time = " << time<<" dt= "<<dt<<", cfl= "<<cfl <<", stopping calculation"<< endl;
\r
171 stop=true; // Impossible to solve the next time step, the Problem has given up
\r
174 else // The resolution was successful, validate and go to the next time step.
\r
176 cout << "Time step = "<< nbTimeStep << ", dt = "<< dt <<", time = "<<time << endl;
\r
177 myDiffusionEquation.validateTimeStep();
\r
178 myTransportEquation.validateTimeStep();
\r
179 time=myDiffusionEquation.presentTime();
\r
184 if(myDiffusionEquation.isStationary() && myTransportEquation.isStationary())
\r
185 cout << "Stationary state reached" <<endl;
\r
186 else if(time>=maxTime)
\r
187 cout<<"Maximum time "<<maxTime<<" reached"<<endl;
\r
188 else if(nbTimeStep>=MaxNbOfTimeStep)
\r
189 cout<<"Maximum number of time steps "<<MaxNbOfTimeStep<<" reached"<<endl;
\r
191 cout<<"Error problem wants to stop!"<<endl;
\r
193 cout << "End of calculation time t= " << time << " at time step number "<< nbTimeStep << endl;
\r
195 cout << "Coupled simulation "<<fluidFileName<<" and "<<solidFileName<<" was successful !" << endl;
\r
197 cout << "Coupled simulation "<<fluidFileName<<" and "<<solidFileName<<" failed ! " << endl;
\r
199 cout << "------------ End of calculation -----------" << endl;
\r
200 myDiffusionEquation.terminate();
\r
201 myTransportEquation.terminate();
\r
203 return EXIT_SUCCESS;
\r