Dear Fipy developers and users, The official parallel running way works for me, however, I would like to try an different way shown in the attached script. When running by $time mpiexec -n 4 python My_Fipy_Parallel.py, it gets stuck at time step 179 without any error message pop out, four cores are full but enough memory left. The bigger the mesh is, the sooner it will get stuck. Does any know why and how to solve this problem? Thanks.
Regards Ronghai
import fipy as fp # from fipy.solvers.scipy import LinearGMRESSolver, LinearCGSSolver, LinearPCGSolver, LinearLUSolver, LinearBicgstabSolver # from fipy.solvers.pyAMG import LinearGMRESSolver, LinearCGSSolver, LinearPCGSolver, LinearLUSolver from fipy.solvers.trilinos import LinearGMRESSolver, LinearCGSSolver, LinearPCGSolver, LinearLUSolver, LinearBicgstabSolver import numpy as np from mpi4py import MPI class Test: def __init__(self): self.nx = 300 self.ny = self.nx self.dx = 1. self.dy = 1. self.nt = 100 self.dt = 10. self.mesh = fp.PeriodicGrid2D(nx=self.nx, ny=self.ny, dx=self.dx, dy=self.dy) self.x = self.mesh.cellCenters[0] self.y = self.mesh.cellCenters[1] self.sigma = 0.1*self.nx*self.dx self.x0 = 0.5*self.nx*self.dx self.y0 = 0.5*self.ny*self.dy self.A = 100./(self.sigma*np.sqrt(2.*np.pi)) self.gauss = self.A*np.exp( -( (self.x-self.x0)**2/(2.*self.sigma**2) + (self.y-self.y0)**2/(2.*self.sigma**2) ) ) self.phi1_global =self.gauss self.phi2_global =self.gauss self.phi3_global =self.gauss self.phi4_global =self.gauss self.solver = LinearBicgstabSolver def equation1(self, (phi1_global, phi2_global, phi3_global, phi4_global)): phi1 = fp.CellVariable(mesh=self.mesh, value=phi1_global, hasOld=1) eq1 = fp.TransientTerm(var=phi1, coeff=1.) == fp.DiffusionTerm(var=phi1, coeff=1.) res = 1.e4 while res > 1.e-1: eq1.cacheMatrix() eq1.cacheRHSvector() res = eq1.sweep(dt=1, solver=self.solver()) mat = eq1.matrix vec = eq1.RHSvector phi1.updateOld() print 'mat shape = ', np.shape(mat.matrix) print 'phi1 shape = ', np.shape(phi1.value) return phi1.value def equation2(self, (phi1_global, phi2_global, phi3_global, phi4_global)): phi2 = fp.CellVariable(mesh=self.mesh, value=phi2_global, hasOld=1) eq2 = fp.TransientTerm(var=phi2, coeff=1.) == fp.DiffusionTerm(var=phi2, coeff=1.) res = 1.e4 while res > 1.e-1: res = eq2.sweep(dt=1, solver=self.solver()) phi2.updateOld() return phi2.value def equation3(self, (phi1_global, phi2_global, phi3_global, phi4_global)): phi3 = fp.CellVariable(mesh=self.mesh, value=phi3_global, hasOld=1) eq3 = fp.TransientTerm(var=phi3, coeff=1.) == fp.DiffusionTerm(var=phi3, coeff=1.) res = 1.e4 while res > 1.e-3: res = eq3.sweep(dt=1, solver=self.solver()) phi3.updateOld() return phi3.value def equation4(self, (phi1_global, phi2_global, phi3_global, phi4_global)): phi4 = fp.CellVariable(mesh=self.mesh, value=phi4_global, hasOld=1) eq4 = fp.TransientTerm(var=phi4, coeff=1.) == fp.DiffusionTerm(var=phi4, coeff=1.) res = 1.e4 while res > 1.e-3: res = eq4.sweep(dt=1, solver=self.solver()) phi4.updateOld() return phi4.value def run(self): for time_step in range(self.nt): print 'time step is:', time_step comm = MPI.COMM_WORLD rank = comm.Get_rank() if rank == 0: phi1_value = self.equation1((self.phi1_global, self.phi2_global, self.phi3_global, self.phi4_global)) self.phi1_global = phi1_value if rank == 1: phi2_value = self.equation2((self.phi1_global, self.phi2_global, self.phi3_global, self.phi4_global)) self.phi2_global = phi2_value if rank == 2: phi3_value = self.equation3((self.phi1_global, self.phi2_global, self.phi3_global, self.phi4_global)) self.phi3_global = phi3_value if rank == 3: phi4_value = self.equation4((self.phi1_global, self.phi2_global, self.phi3_global, self.phi4_global)) self.phi4_global = phi4_value comm.bcast(self.phi1_global, root=0) comm.bcast(self.phi2_global, root=1) comm.bcast(self.phi3_global, root=2) comm.bcast(self.phi4_global, root=3) if __name__ == '__main__': myclass = Test() myclass.run()
_______________________________________________ fipy mailing list fipy@nist.gov http://www.ctcms.nist.gov/fipy [ NIST internal ONLY: https://email.nist.gov/mailman/listinfo/fipy ]