import numpy as np from scipy.sparse import diags from scipy.stats import mstats from scipy.sparse.linalg import bicg, bicgstab, cg, dsolve #,LinearOperator, spilu, bicgstab #from scikits.umfpack import spsolve, splu import time def getDiss(k,vx,vy,vz): diss = (vx[1:,:,:]**2+vx[:-1,:,:]**2+vy[:,1:,:]**2+vy[:,:-1,:]**2+vz[:,:,1:]**2+vz[:,:,:-1]**2)/(2*k) return diss def ComputeVol(k,P,saveV): k=refina(k, P.shape[0]//k.shape[0]) Px,Py,Pz = getPfaces(k,P) vx,vy,vz = getVfaces(k,P, Px,Py, Pz) diss = getDiss(k,vx,vy,vz) if saveV==False: vy, vz= 0, 0 else: vy, vz= 0.5*(vy[:,1:,:]+vy[:,:-1,:]), 0.5*(vz[:,:,1:]+vz[:,:,:-1]) vx= 0.5*(vx[1:,:,:]+vx[:-1,:,:]) return k, diss, vx,vy,vz, Px, Py, Pz def comp_Kdiss_Kaverage(k, diss, vx, Px, Py, Pz): mgx, mgy, mgz = np.mean(Px[-1,:,:]-Px[0,:,:])/k.shape[0],np.mean(Py[:,-1,:]-Py[:,0,:])/k.shape[1],np.mean(Pz[:,:,-1]-Pz[:,:,0])/k.shape[2] kave=np.mean(vx)/mgx kdiss=np.mean(diss)/(mgx**2+mgy**2+mgz**2) return kdiss, kave def getKeff(pm,k,pbc,Nz): nx = k.shape[2] #Pasar k sin bordes de k=0 ny = k.shape[1] tz = 2*k[1,:,:]*k[0, :,:]/(k[0, :,:]+k[1,:,:]) q=((pm[0,:,:]-pm[1,:,:])*tz).sum() area=ny*nx l=Nz keff=q*l/(pbc*area) return keff,q def getPfaces(k,P): nx,ny,nz=k.shape[0],k.shape[1],k.shape[2] Px,Py,Pz= np.zeros((nx+1,ny,nz)),np.zeros((nx,ny+1,nz)),np.zeros((nx,ny,nz+1)) Px[1:-1,:,:] = (k[:-1,:,:]*P[:-1,:,:]+k[1:,:,:]*P[1:,:,:])/(k[:-1,:,:]+k[1:,:,:]) Px[0,:,:]=nx Py[:,1:-1,:] = (k[:,:-1,:]*P[:,:-1,:]+k[:,1:,:]*P[:,1:,:])/(k[:,:-1,:]+k[:,1:,:]) Py[:,0,:],Py[:,-1,:] =P[:,0,:], P[:,-1,:] Pz[:,:,1:-1] = (k[:,:,:-1]*P[:,:,:-1]+k[:,:,1:]*P[:,:,1:])/(k[:,:,:-1]+k[:,:,1:]) Pz[:,:,0],Pz[:,:,-1] =P[:,:,0], P[:,:,-1] return Px, Py, Pz def getVfaces(k,P, Px,Py, Pz): nx,ny,nz=k.shape[0],k.shape[1],k.shape[2] vx,vy,vz= np.zeros((nx+1,ny,nz)),np.zeros((nx,ny+1,nz)),np.zeros((nx,ny,nz+1)) vx[1:,:,:] = 2*k*(Px[1:,:,:]-P) #v= k*(deltaP)/(deltaX/2) vx[0,:,:] = 2*k[0,:,:]*(P[0,:,:]-Px[0,:,:]) vy[:,1:,:] = 2*k*(Py[:,1:,:]-P) vy[:,0,:] = 2*k[:,0,:]*(P[:,0,:]-Py[:,0,:]) vz[:,:,1:] = 2*k*(Pz[:,:,1:]-P) vz[:,:,0] = 2*k[:,:,0]*(P[:,:,0]-Pz[:,:,0]) return vx,vy,vz def refina(k, ref): if ref==1: return k nx,ny,nz=k.shape[0],k.shape[1],k.shape[2] krx=np.zeros((ref*nx,ny,nz)) for i in range(ref): krx[i::ref,:,:]=k k=0 krxy=np.zeros((ref*nx,ny*ref,nz)) for i in range(ref): krxy[:,i::ref,:]=krx krx=0 if nz==1: return krxy krxyz=np.zeros((ref*nx,ny*ref,nz*ref)) for i in range(ref): krxyz[:,:,i::ref]=krxy krxy=0 return krxyz def computeT(k): nx = k.shape[0] ny = k.shape[1] nz = k.shape[2] tx = np.zeros((nx+1,ny, nz)) ty = np.zeros((nx,ny+1, nz)) tz = np.zeros((nx,ny, nz+1)) tx[1:-1,:,:] = 2*k[:-1,:,:]*k[1:,:,:]/(k[:-1,:,:]+k[1:,:,:]) ty[:,1:-1,:] = 2*k[:,:-1,:]*k[:,1:,:]/(k[:,:-1,:]+k[:,1:,:]) tz[:,:,1:-1] = 2*k[:,:,:-1]*k[:,:,1:]/(k[:,:,:-1]+k[:,:,1:]) return tx, ty, tz def Rmat(k): pbc=k.shape[0] tx, ty , tz = computeT(k) tx[0,:,:],tx[-1,:,:] = 2*tx[1,:,:],2*tx[-2,:,:] rh=np.zeros((k.shape[0],k.shape[1],k.shape[2])) rh[0,:,:]=pbc*tx[0,:,:] rh=rh.reshape(-1) d=(tz[:,:,:-1]+tz[:,:,1:]+ty[:,:-1,:]+ty[:,1:,:]+tx[:-1,:,:]+tx[1:,:,:]).reshape(-1) a=(-tz[:,:,:-1].reshape(-1))[1:] #a=(tx.reshape(-1))[:-1] b=(-ty[:,1:,:].reshape(-1))[:-k.shape[2]] c=-tx[1:-1,:,:].reshape(-1) return a, b, c, d, rh def PysolveP(k, solver): a, b, c, d, rh = Rmat(k) nx, ny, nz = k.shape[0], k.shape[1],k.shape[2] offset = [-nz*ny,-nz, -1, 0, 1, nz, nz*ny] km=diags(np.array([c, b, a, d, a, b, c]), offset, format='csc') a, b, c, d = 0, 0 ,0 , 0 lu = splu(km) print(lu) p = solver(km, rh) p=p.reshape(nx, ny, nz) keff,q = getKeff(p,k,nz,nz) return keff ''' solvers=[bicg, bicgstab, cg, dsolve, spsolve] snames=['bicg', 'bicgstab',' cg',' dsolve',' spsolve'] for job in range(jobs): kff=np.load('./otrotest/'+str(job)+'/k.npy') print('************* JOB : '+str(job)+' ******************') print(' ') for i in range(len(solvers)): t0=time.time() keff=PysolveP(kff, solvers[i]) print('Solver: '+snames[i]+' time: '+str(time.time()-t0)) '''