HI All, I think I run into some memory leak issues using trilinos as my solver both for serial and parallel case. The total memory goes up from initial around 300 MB to the my system memory limit (like 29 GB), and program stops. I have attached my example code below.
Somethings I am not sure if I implement it correctly: 1. in the example code, I basically solve multiple equations at the same time. I use list, and append my CellVarible together 2. Similar, I use list and append my equation together 3. Create coupled equation by looping through the list element, and solve this coupled equation. 4. During the solution step, I loop through the list element, and do updateOld() The results of the numerical calculation looks correct to me, I just have this memory issue that prevent me from going longer time steps because I run out of memory. I wonder is there any workaround/fix to this problem ? I am using the build from Anaconda repository, default trillions solver, and my OS is Ubuntu 16.04.
from fipy import * import numpy as np import matplotlib as matplotlib_plot import scipy.interpolate import resource def make2dList(rows, cols): a=[] for row in xrange(rows): a += [[0]*cols] return a mesh = Gmsh2D(''' lc = 1e-2; Point(1) = {-1, 0, 0, lc}; Point(2) = {0, 0, 0, lc}; Point(3) = {1, 0, 0, lc}; Point(4) = {0,-0.1,0,lc}; Ellipse(5) = {1,2,2,4}; Ellipse(6) = {4,2,2,3}; Line(7) = {3,2}; Line(8) = {2,1}; Circle(9) = {1,2,3}; Line Loop(9) = {6,7, 8,5}; Line Loop(10) = {-6,-5,9}; Plane Surface (11) = {9}; Plane Surface (12) = {10}; Physical Surface("top") = {11}; Physical Surface("bottom") = {12}; Physical Line("interface") = {5, 6}; ''' % locals()) Np = 3 phi =[]; for species_i in range(Np-1): species = CellVariable(mesh=mesh, hasOld = True, value=1.0/Np) phi.append(species) xFace,yFace=mesh.faceCenters Epsilon = 0.1 velocityX_Top = (1-Epsilon*Epsilon)/(Epsilon*Epsilon)*(yFace + Epsilon*np.sqrt(1-xFace*xFace)) velocityY_Top = (1-Epsilon*Epsilon)/Epsilon*(xFace*yFace)/(np.sqrt(1-xFace*xFace)) velocityX_Bottom = yFace velocityY_Bottom = -xFace velocityVector = FaceVariable(mesh=mesh, rank=1) topFaces = numerix.unique(mesh.cellFaceIDs[..., mesh.physicalCells["top"].value].flatten().filled()) bottomFaces = numerix.unique(mesh.cellFaceIDs[..., mesh.physicalCells["bottom"].value].flatten().filled()) velocityVector[0, topFaces] = velocityX_Top[..., topFaces] velocityVector[1, topFaces] = velocityY_Top[..., topFaces] velocityVector[0, bottomFaces] = velocityX_Bottom[..., bottomFaces] velocityVector[1, bottomFaces] = velocityY_Bottom[..., bottomFaces] local_shear_rate = FaceVariable(mesh=mesh, rank=1) local_shear_rate[0, topFaces] = 0. local_shear_rate[1, topFaces] = 1.0 local_shear_rate[0, bottomFaces] = 0. local_shear_rate[1, bottomFaces] = 0. # Velocity Field Plot #viewer_velocity = MatplotlibVectorViewer(vars=velocityVector,title="velocity_vector") #viewer_velocity.plot() Pe = 5. D = FaceVariable(mesh=mesh, rank=1) D[0,topFaces] = 0. D[1,topFaces] = Epsilon*Epsilon/Pe D[0,bottomFaces] = 0. D[1,bottomFaces] = 0. Lambda = make2dList(Np, Np) radius = np.linspace(0.001,0.003,num=Np) beta = 0.26 R = 0.075 c = (1-pow(Epsilon,2))/(R*pow(Epsilon,3)) for i in range(Np): for j in range(Np): Lambda[i][j] = c*beta*2.0*np.minimum(radius[i],radius[j])*np.log(radius[i]/radius[j]) coupledEqn = 0 eq = [] Segregation_Term = [0]*(Np-1) Last_Species = 1.0 for species_i in range(Np-1): print species_i for species_j in range(Np -1): Segregation_Term[species_i] = Segregation_Term[species_i] + Lambda[species_i][species_j]*phi[species_j] Last_Species = Last_Species - phi[species_j] Segregation_Term[species_i] = Segregation_Term[species_i] + Lambda[species_i][Np-1]*Last_Species eq.append(TransientTerm(var=phi[species_i]) \ + VanLeerConvectionTerm(coeff = velocityVector + Epsilon*local_shear_rate*Segregation_Term[species_i].faceValue, var=phi[species_i])\ == DiffusionTerm(coeff=D,var=phi[species_i])) phi[species_i].faceGrad.constrain([1.0/Epsilon*local_shear_rate*Pe*(phi[species_i]*Segregation_Term[species_i]).faceValue], where = mesh.facesTop | mesh.physicalFaces["interface"]) #boundary conditions at the top and bottom Last_Species = 1.0 for species_i in range(Np-1): coupledEqn = coupledEqn & eq[species_i] timeStepDuration = 1/2000. steps = 1100 k = 0 for step in range(steps): res = 1000 while res > 1e-6: res = coupledEqn.sweep(dt=timeStepDuration) print "MaxRSS:", resource.getrusage(resource.RUSAGE_SELF).ru_maxrss print res for species_i in range(Np-1): phi[species_i].updateOld() print step
_______________________________________________ fipy mailing list fipy@nist.gov http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]