You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
2.9 KiB
Python
124 lines
2.9 KiB
Python
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)
|