7 #===============================================================================================================================
8 # Name : Finite Elements simulation of the 2D heat equation -\triangle T = f with Neumann boundary condition
9 # Author : Michaƫl Ndjinga
10 # Copyright : CEA Saclay 2021
11 #================================================================================================================================
14 def DiffusionEquation_2DSpherical(FECalculation, fileName):
16 """ Description : Test solving the diffusion of the temperature T in a solid (default is Uranium).
17 Equation : Thermal diffusion equation \rho cp dT/dt-\lambda\Delta T=\Phi + \lambda_{sf} (T_{fluid}-T)
18 Heat capacity, density, and conductivity of the solid MUST be defined
19 The solid may be extra refrigerated by a fluid with transfer coefficient using functions setFluidTemperature and setHeatTransfertCoeff
20 The solid may receive some extra heat power due to nuclear fissions using function setHeatSource
22 #Space dimension of the problem
25 # Mandatory physical values
26 solid_specific_heat=300# specific heat capacity, default value 300
27 solid_density=10000# density, default value 10000
28 solid_conductivity=5# conductivity, default value 5
30 myProblem = solverlab.DiffusionEquation(spaceDim,FECalculation,solid_density,solid_specific_heat,solid_conductivity);
32 # Definition of field support parameter
34 supportOfField=solverlab.NODES
36 supportOfField=solverlab.CELLS
38 # Set the mesh and initial data
39 initial_data_inputfile="../resources/BoxWithMeshWithTriangularCells";
40 initial_data_fieldName="Temperature";
41 print("Loading unstructured mesh and initial data", " in file ", initial_data_inputfile )
42 initial_data_time_iteration=0# default value is 0
43 initial_data_time_sub_iteration=0# default value is 0
44 initial_data_time_meshLevel=0# default value is 0
45 myProblem.setInitialField(initial_data_inputfile, initial_data_fieldName, initial_data_time_iteration, initial_data_time_sub_iteration, initial_data_time_meshLevel, supportOfField)
47 #### Optional physical values (default value is zero) : fluid temperature field, heat transfert coefficient, heat power field
48 # Loading and setting fluid temperature field
49 fluid_temperature_inputfile="../resources/BoxWithMeshWithTriangularCells";
50 fluid_temperature_fieldName="Fluid temperature field";
51 fluid_temperature_time_iteration=0# default value is 0
52 fluid_temperature_time_sub_iteration=0# default value is 0
53 fluid_temperature_meshLevel=0# default value is 0
54 print("Loading field :", fluid_temperature_fieldName, " in file ", fluid_temperature_inputfile)
55 fluidTemperatureField=solverlab.Field(fluid_temperature_inputfile, supportOfField, fluid_temperature_fieldName, fluid_temperature_time_iteration, fluid_temperature_time_sub_iteration, fluid_temperature_meshLevel)
56 myProblem.setFluidTemperatureField(fluidTemperatureField)
57 # Setting heat transfert coefficient
58 heatTransfertCoeff=1000.;#fluid/solid exchange coefficient, default value is 0
59 myProblem.setHeatTransfertCoeff(heatTransfertCoeff);
60 # Loading heat power field
61 heat_power_inputfile="../resources/BoxWithMeshWithTriangularCells";
62 heat_power_fieldName="Heat power field";
63 heat_power_time_iteration=0# default value is 0
64 heat_power_time_sub_iteration=0# default value is 0
65 heat_power_meshLevel=0# default value is 0
66 print("Loading field :", heat_power_fieldName, " in file ", heat_power_inputfile)
67 heatPowerField=solverlab.Field(heat_power_inputfile, supportOfField, heat_power_fieldName, heat_power_time_iteration, heat_power_time_sub_iteration, heat_power_meshLevel)
68 myProblem.setHeatPowerField(heatPowerField)
70 # the boundary conditions :
72 boundaryNodeGroupNames=myProblem.getMesh().getNameOfNodeGroups()
73 print(len(boundaryNodeGroupNames), " Boundary Node Group detected : ", boundaryNodeGroupNames)
75 boundaryFaceGroupNames=myProblem.getMesh().getNameOfFaceGroups()
76 print(len(boundaryFaceGroupNames), " Boundary Face Group detected : ", boundaryFaceGroupNames)
78 myProblem.setNeumannBoundaryCondition("GAUCHE");
79 myProblem.setNeumannBoundaryCondition("DROITE");
80 myProblem.setNeumannBoundaryCondition("HAUT");
81 myProblem.setNeumannBoundaryCondition("BAS");
83 # set the numerical method
84 myProblem.setTimeScheme( solverlab.Explicit);
85 max_nb_its_lin_solver = 50
86 myProblem.setLinearSolver(solverlab.GMRES, solverlab.ILU, max_nb_its_lin_solver );
88 # computation parameters
89 MaxNbOfTimeStep = 3 ;# default value is 10
90 freqSave = 1;# default value is 1
91 cfl = 0.95;# default value is 1
92 maxTime = 100000000;# default value is 10
93 precision = 1e-6;# default value is 1e-6
94 result_directory="."# default value = current directory
96 myProblem.setCFL(cfl);
97 myProblem.setPrecision(precision);
98 myProblem.setMaxNbOfTimeStep(MaxNbOfTimeStep);
99 myProblem.setTimeMax(maxTime);
100 myProblem.setFreqSave(freqSave);
101 myProblem.setFileName(fileName);
102 myProblem.setResultDirectory(result_directory)
103 myProblem.setSaveFileFormat(solverlab.MED)#default value is solverlab.VTK
106 myProblem.initialize();
107 print("Running python test "+ fileName );
109 ok = myProblem.run();
111 print( "Python simulation " + fileName + " is successful !" );
114 print( "Python simulation " + fileName + " failed ! " );
117 print( "------------ End of simulation !!! -----------" );
119 myProblem.terminate();
122 if __name__ == """__main__""":
123 if len(sys.argv) >1 :
124 FECalculation = bool(int(sys.argv[1]))
125 # name of result file
127 fileName = "2DSpherical_FE";# default value is ""
129 fileName = "2DSpherical_FV";# default value is ""
130 DiffusionEquation_2DSpherical(FECalculation, fileName)
132 raise ValueError("DiffusionEquation_2DSpherical : missing one argument")