import numpy as np # import petsc4py import math import time # from mpi4py import MPI from tools.postprocessK.kperm.computeFlows import * from petsc4py import PETSc # petsc4py.init('-ksp_max_it 9999999999',comm=PETSc.COMM_SELF) from tools.postprocessK.flow import getKeff def PetscP(datadir, ref, k, saveres): # datadir='./data/'+str(job)+'/' # comm=MPI.COMM_WORLD # rank=comm.Get_rank() """ size=comm.Get_size() print(rank,size) pcomm = MPI.COMM_WORLD.Split(color=rank, key=rank) #print(new_comm.Get_rank()) #pcomm=comm.Create(newgroup) print('entro') print pcomm.Get_rank() print pcomm.Get_size() pcomm=comm rank=pcomm.rank pn=pcomm.size #PETSc.COMM_WORLD.PetscSubcommCreate(pcomm,PetscSubcomm *psubcomm) print(rank,pn) """ # Optpetsc = PETSc.Options() rank = 0 pn = 1 t0 = time.time() # comm=MPI.Comm.Create() if k.shape[2] == 1: refz = 1 else: refz = ref nz, ny, nx = k.shape[0] * ref, k.shape[1] * ref, k.shape[2] * refz n = nx * ny * nz print("algo") K = PETSc.Mat().create(comm=PETSc.COMM_SELF) print("algo2") K.setType("seqaij") print("algo3") K.setSizes(((n, None), (n, None))) # Aca igual que lo que usas arriba K.setPreallocationNNZ(nnz=(7, 4)) # Idem anterior # K = PETSc.Mat('seqaij', m=n,n=n,nz=7,comm=PETSc.COMM_WORLD) # K = PETSc.Mat('aij', ((n,None),(n,None)), nnz=(7,4),comm=PETSc.COMM_WORLD) # K = PETSc.Mat().createAIJ(((n,None),(n,None)), nnz=(7,4),comm=PETSc.COMM_WORLD) # K = PETSc.Mat().createSeqAIJ(((n,None),(n,None)), nnz=(7,4),comm=PETSc.COMM_WORLD) # K.setPreallocationNNZ(nnz=(7,4)) print("ksetup") # K.MatCreateSeqAIJ() # K=PETSc.Mat().MatCreate(PETSc.COMM_WORLD) # K = PETSc.Mat().createAIJ(((n,None),(n,None)), nnz=(7,4),comm=pcomm) K.setUp() print("entro2") R = PETSc.Vec().createSeq((n, None), comm=PETSc.COMM_SELF) # PETSc.COMM_WORLD R.setUp() print("entro2") k2, Nz, nnz2 = getKref(k, 1, 2, ref) k, Nz, nnz = getKref(k, 0, 2, ref) pbc = float(Nz) # print('entro3') K, R = firstL(K, R, k, pbc) r = (k.shape[1] - 2) * (k.shape[2] - 2) * nnz2 # start row K, R = lastL(K, R, k2, r) k2 = 0 K.assemble() R.assemble() print("entro3") ksp = PETSc.KSP() ksp.create(comm=PETSc.COMM_SELF) ksp.setFromOptions() print("entro4") P = R.copy() ksp.setType(PETSc.KSP.Type.CG) pc = PETSc.PC() pc.create(comm=PETSc.COMM_SELF) print("entro4") pc.setType(PETSc.PC.Type.JACOBI) ksp.setPC(pc) ksp.setOperators(K) ksp.setUp() t1 = time.time() ksp.solve(R, P) t2 = time.time() p = P.getArray().reshape(nz, ny, nx) if rank == 0: keff, Q = getKeff(p, k[1:-1, 1:-1, 1:-1], pbc, Nz) return keff return # Ver: A posteriori error estimates and adaptive solvers for porous media flows (Martin Vohralik)