mirror of
https://gitlab.com/scemama/eplf
synced 2024-10-31 19:23:55 +01:00
Started to work on grid partitioning
This commit is contained in:
parent
f463cb672e
commit
472865bb69
@ -63,4 +63,5 @@ compute
|
|||||||
density logical
|
density logical
|
||||||
density_grad logical
|
density_grad logical
|
||||||
density_lapl logical
|
density_lapl logical
|
||||||
|
elf_partition logical
|
||||||
|
|
||||||
|
@ -14,6 +14,39 @@ import tempfile
|
|||||||
|
|
||||||
editor = os.getenv("EDITOR",default="vi")
|
editor = os.getenv("EDITOR",default="vi")
|
||||||
|
|
||||||
|
## Data cleaning
|
||||||
|
##################
|
||||||
|
|
||||||
|
class Cleaner(object):
|
||||||
|
def __init__(self,inp,name):
|
||||||
|
self.dir = inp.name
|
||||||
|
self.name = name.lower()
|
||||||
|
self.inp = inp
|
||||||
|
def action(self):
|
||||||
|
raise TypeError
|
||||||
|
def clean(self):
|
||||||
|
print "Removing "+self.name
|
||||||
|
self.action()
|
||||||
|
|
||||||
|
class GridDataCleaner(Cleaner):
|
||||||
|
def action(self):
|
||||||
|
os.system("rm -f %s/grid_data/%s.gz"%(self.dir,self.name) )
|
||||||
|
|
||||||
|
class AllCleaner(Cleaner):
|
||||||
|
def action(self):
|
||||||
|
os.system("rm -rf %s/grid"%(self.dir) )
|
||||||
|
os.system("rm -rf %s/grid_data"%(self.dir) )
|
||||||
|
|
||||||
|
def clear(x,inp):
|
||||||
|
d = { "all": AllCleaner,
|
||||||
|
}
|
||||||
|
if x in d.keys():
|
||||||
|
type = d[x]
|
||||||
|
else:
|
||||||
|
type = GridDataCleaner
|
||||||
|
|
||||||
|
type(inp,x.replace("_"," ")).clean()
|
||||||
|
|
||||||
## Data editing
|
## Data editing
|
||||||
###############
|
###############
|
||||||
|
|
||||||
@ -70,29 +103,29 @@ class GridEditor(Editor):
|
|||||||
self.opposite = self.inp.opposite
|
self.opposite = self.inp.opposite
|
||||||
self.step_size = self.inp.step_size
|
self.step_size = self.inp.step_size
|
||||||
self.point_num = self.inp.point_num
|
self.point_num = self.inp.point_num
|
||||||
if self.origin is None:
|
# if self.origin is None:
|
||||||
self.origin = [ 0., 0., 0. ]
|
# self.origin = [ 0., 0., 0. ]
|
||||||
for l in xrange(3):
|
# for l in xrange(3):
|
||||||
self.origin[l] = self.inp.nucl_coord[l][1]
|
# self.origin[l] = self.inp.nucl_coord[l][1]
|
||||||
for i in self.inp.nucl_coord[l]:
|
# for i in self.inp.nucl_coord[l]:
|
||||||
self.origin[l] = min(self.origin[l],i)
|
# self.origin[l] = min(self.origin[l],i)
|
||||||
self.origin[l] -= 4.
|
# self.origin[l] -= 4.
|
||||||
if self.opposite is None:
|
# if self.opposite is None:
|
||||||
self.opposite = [ 0., 0., 0. ]
|
# self.opposite = [ 0., 0., 0. ]
|
||||||
for l in xrange(3):
|
# for l in xrange(3):
|
||||||
self.opposite[l] = self.inp.nucl_coord[l][1]
|
# self.opposite[l] = self.inp.nucl_coord[l][1]
|
||||||
for i in self.inp.nucl_coord[l]:
|
# for i in self.inp.nucl_coord[l]:
|
||||||
self.opposite[l] = max(self.opposite[l],i)
|
# self.opposite[l] = max(self.opposite[l],i)
|
||||||
self.opposite[l] += 4.
|
# self.opposite[l] += 4.
|
||||||
if self.step_size is None:
|
# if self.step_size is None:
|
||||||
self.step_size = [ 0., 0., 0. ]
|
# self.step_size = [ 0., 0., 0. ]
|
||||||
for l in xrange(3):
|
# for l in xrange(3):
|
||||||
self.step_size[l] = (self.opposite[l] - self.origin[l])/float(self.point_num[l])
|
# self.step_size[l] = (self.opposite[l] - self.origin[l])/float(self.point_num[l])
|
||||||
|
|
||||||
self.inp.point_num = self.point_num
|
# self.inp.point_num = self.point_num
|
||||||
self.inp.origin = self.origin
|
# self.inp.origin = self.origin
|
||||||
self.inp.opposite = self.opposite
|
# self.inp.opposite = self.opposite
|
||||||
self.inp.step_size = self.step_size
|
# self.inp.step_size = self.step_size
|
||||||
edit_temp_file(self.inp,self.write_grid_file,self.read_grid_file)
|
edit_temp_file(self.inp,self.write_grid_file,self.read_grid_file)
|
||||||
|
|
||||||
def write_grid_file(self,file,inp):
|
def write_grid_file(self,file,inp):
|
||||||
@ -101,15 +134,27 @@ class GridEditor(Editor):
|
|||||||
print >>file, "###########################"
|
print >>file, "###########################"
|
||||||
print >>file, ""
|
print >>file, ""
|
||||||
print >>file, "# Number of points along x, y, z"
|
print >>file, "# Number of points along x, y, z"
|
||||||
|
if self.point_num is None:
|
||||||
|
print >>file, "Default"
|
||||||
|
else:
|
||||||
print >>file, "%d %d %d"%tuple(self.point_num)
|
print >>file, "%d %d %d"%tuple(self.point_num)
|
||||||
print >>file, ""
|
print >>file, ""
|
||||||
print >>file, "# Coordinates of the origin (x,y,z)"
|
print >>file, "# Coordinates of the origin (x,y,z)"
|
||||||
|
if self.origin is None:
|
||||||
|
print >>file, "Default"
|
||||||
|
else:
|
||||||
print >>file, "%f %f %f"%tuple(self.origin)
|
print >>file, "%f %f %f"%tuple(self.origin)
|
||||||
print >>file, ""
|
print >>file, ""
|
||||||
print >>file, "# Coordinates of the opposite point (x,y,z)"
|
print >>file, "# Coordinates of the opposite point (x,y,z)"
|
||||||
|
if self.opposite is None:
|
||||||
|
print >>file, "Default"
|
||||||
|
else:
|
||||||
print >>file, "%f %f %f"%tuple(self.opposite)
|
print >>file, "%f %f %f"%tuple(self.opposite)
|
||||||
print >>file, ""
|
print >>file, ""
|
||||||
print >>file, "# Step sizes (x,y,z)"
|
print >>file, "# Step sizes (x,y,z)"
|
||||||
|
if self.step_size is None:
|
||||||
|
print >>file, "Default"
|
||||||
|
else:
|
||||||
print >>file, "%f %f %f"%tuple(self.step_size)
|
print >>file, "%f %f %f"%tuple(self.step_size)
|
||||||
|
|
||||||
def read_grid_file(self,file,inp):
|
def read_grid_file(self,file,inp):
|
||||||
@ -117,16 +162,20 @@ class GridEditor(Editor):
|
|||||||
lines = filter(lambda x: len(x.strip())>0,lines)
|
lines = filter(lambda x: len(x.strip())>0,lines)
|
||||||
lines = filter(lambda x: not x.startswith("#"),lines)
|
lines = filter(lambda x: not x.startswith("#"),lines)
|
||||||
|
|
||||||
buffer = lines.pop(0).split()
|
buffer = lines.pop(0).lower().split()
|
||||||
|
if buffer[0] != "default":
|
||||||
self.inp.point_num = map(int,buffer)
|
self.inp.point_num = map(int,buffer)
|
||||||
|
|
||||||
buffer = lines.pop(0).split()
|
buffer = lines.pop(0).lower().split()
|
||||||
|
if buffer[0] != "default":
|
||||||
self.inp.origin = map(float,buffer)
|
self.inp.origin = map(float,buffer)
|
||||||
|
|
||||||
buffer = lines.pop(0).split()
|
buffer = lines.pop(0).lower().split()
|
||||||
|
if buffer[0] != "default":
|
||||||
self.inp.opposite = map(float,buffer)
|
self.inp.opposite = map(float,buffer)
|
||||||
|
|
||||||
buffer = lines.pop(0).split()
|
buffer = lines.pop(0).lower().split()
|
||||||
|
if buffer[0] != "default":
|
||||||
self.inp.step_size = self.step_size
|
self.inp.step_size = self.step_size
|
||||||
|
|
||||||
|
|
||||||
@ -150,9 +199,15 @@ def write_main_file(file,inp):
|
|||||||
print >>file, '# edit(geometry)'
|
print >>file, '# edit(geometry)'
|
||||||
print >>file, '# edit(grid_parameters)'
|
print >>file, '# edit(grid_parameters)'
|
||||||
print >>file, ""
|
print >>file, ""
|
||||||
|
compute = filter(lambda x: x.startswith("compute"),rw_data)
|
||||||
|
print >>file, "# Clear"
|
||||||
|
print >>file, "# --------------------\n"
|
||||||
|
print >>file, '# clear(all)'
|
||||||
|
for p in compute:
|
||||||
|
print >>file, '# clear(%s)'%(p[8:])
|
||||||
|
print >>file, ""
|
||||||
print >>file, "# Computation"
|
print >>file, "# Computation"
|
||||||
print >>file, "# --------------------\n"
|
print >>file, "# --------------------\n"
|
||||||
compute = filter(lambda x: x.startswith("compute"),rw_data)
|
|
||||||
compute = filter(lambda x: not x.endswith("_grad"),compute)
|
compute = filter(lambda x: not x.endswith("_grad"),compute)
|
||||||
compute = filter(lambda x: not x.endswith("_lapl"),compute)
|
compute = filter(lambda x: not x.endswith("_lapl"),compute)
|
||||||
for p in compute:
|
for p in compute:
|
||||||
@ -177,7 +232,8 @@ def read_main_file(file,inp):
|
|||||||
line = line.replace("(x) ","=True inp.compute_")
|
line = line.replace("(x) ","=True inp.compute_")
|
||||||
buffer = line.split()
|
buffer = line.split()
|
||||||
line = ' '.join([buffer[1].lower(),buffer[0]])
|
line = ' '.join([buffer[1].lower(),buffer[0]])
|
||||||
elif line.startswith("edit"):
|
elif line.startswith("edit") \
|
||||||
|
or line.startswith("clear"):
|
||||||
line = line.replace("(","('").replace(")","',inp)").lower()
|
line = line.replace("(","('").replace(")","',inp)").lower()
|
||||||
exec line
|
exec line
|
||||||
|
|
||||||
|
@ -19,5 +19,5 @@ SUBST [ X ]
|
|||||||
density;;
|
density;;
|
||||||
density_grad;;
|
density_grad;;
|
||||||
density_lapl;;
|
density_lapl;;
|
||||||
|
elf_partition;;
|
||||||
END_TEMPLATE
|
END_TEMPLATE
|
||||||
|
@ -30,6 +30,7 @@ data = [ \
|
|||||||
("compute_density" , "logical" , "" ),
|
("compute_density" , "logical" , "" ),
|
||||||
("compute_density_grad" , "logical" , "" ),
|
("compute_density_grad" , "logical" , "" ),
|
||||||
("compute_density_lapl" , "logical" , "" ),
|
("compute_density_lapl" , "logical" , "" ),
|
||||||
|
("compute_elf_partition" , "logical" , "" ),
|
||||||
("grid_data_eplf" , "real" , "(grid_x_num,grid_y_num,grid_z_num)" ),
|
("grid_data_eplf" , "real" , "(grid_x_num,grid_y_num,grid_z_num)" ),
|
||||||
("grid_data_eplf_grad" , "real" , "(grid_x_num,grid_y_num,grid_z_num,4)" ),
|
("grid_data_eplf_grad" , "real" , "(grid_x_num,grid_y_num,grid_z_num,4)" ),
|
||||||
("grid_data_eplf_lapl" , "real" , "(grid_x_num,grid_y_num,grid_z_num)" ),
|
("grid_data_eplf_lapl" , "real" , "(grid_x_num,grid_y_num,grid_z_num)" ),
|
||||||
|
@ -81,6 +81,13 @@ BEGIN_PROVIDER [ real, grid_$X, (grid_x_num,grid_y_num,grid_z_num) ]
|
|||||||
|
|
||||||
integer :: ix, iy, iz
|
integer :: ix, iy, iz
|
||||||
integer :: ibegin, iend
|
integer :: ibegin, iend
|
||||||
|
real, parameter :: UNDEFINED=123456789.123456789
|
||||||
|
|
||||||
|
grid_$X(1,1,1) = UNDEFINED
|
||||||
|
call get_grid_data_$X(grid_$X)
|
||||||
|
if (grid_$X(1,1,1) /= UNDEFINED) then
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
do iz=1,grid_z_num
|
do iz=1,grid_z_num
|
||||||
do iy=1,grid_y_num
|
do iy=1,grid_y_num
|
||||||
@ -114,60 +121,27 @@ BEGIN_PROVIDER [ real, grid_$X, (grid_x_num,grid_y_num,grid_z_num) ]
|
|||||||
enddo
|
enddo
|
||||||
|
|
||||||
IRP_IF MPI
|
IRP_IF MPI
|
||||||
! integer :: dim, ierr
|
|
||||||
! do iz=1,grid_z_num
|
|
||||||
! real :: buffer(grid_x_num*grid_y_num+1)
|
|
||||||
! icount = 0
|
|
||||||
! do iy=1,grid_y_num
|
|
||||||
! do ix=1,grid_x_num
|
|
||||||
! buffer(icount+ix) = grid_$X(ix,iy,iz)
|
|
||||||
! enddo
|
|
||||||
! icount = icount + grid_x_num
|
|
||||||
! enddo
|
|
||||||
! dim = grid_x_num * grid_y_num
|
|
||||||
! call MPI_REDUCE(buffer,grid_$X(1,1,iz),dim,mpi_real, &
|
|
||||||
! mpi_sum,0,MPI_COMM_WORLD,ierr)
|
|
||||||
! if (ierr /= MPI_SUCCESS) then
|
|
||||||
! call abrt(irp_here,'Unable to fetch buffer')
|
|
||||||
! endif
|
|
||||||
! call barrier
|
|
||||||
! enddo
|
|
||||||
|
|
||||||
! integer :: dim, ierr
|
|
||||||
! real :: buffer(grid_x_num*grid_y_num*grid_z_num)
|
|
||||||
! icount = 0
|
|
||||||
! do iz=1,grid_z_num
|
|
||||||
! do iy=1,grid_y_num
|
|
||||||
! do ix=1,grid_x_num
|
|
||||||
! buffer(icount+ix) = grid_$X(ix,iy,iz)
|
|
||||||
! enddo
|
|
||||||
! icount = icount + grid_x_num
|
|
||||||
! enddo
|
|
||||||
! enddo
|
|
||||||
! dim = grid_x_num * grid_y_num * grid_y_num
|
|
||||||
! call MPI_REDUCE(buffer,grid_$X,dim,mpi_real, &
|
|
||||||
! mpi_sum,0,MPI_COMM_WORLD,ierr)
|
|
||||||
! if (ierr /= MPI_SUCCESS) then
|
|
||||||
! call abrt(irp_here,'Unable to fetch buffer')
|
|
||||||
! endif
|
|
||||||
|
|
||||||
integer :: dim, ierr
|
integer :: dim, ierr
|
||||||
dim = grid_x_num
|
|
||||||
do iz=1,grid_z_num
|
do iz=1,grid_z_num
|
||||||
real :: buffer(grid_x_num)
|
real :: buffer(grid_x_num*grid_y_num+1)
|
||||||
|
icount = 0
|
||||||
do iy=1,grid_y_num
|
do iy=1,grid_y_num
|
||||||
do ix=1,grid_x_num
|
do ix=1,grid_x_num
|
||||||
buffer(ix) = grid_$X(ix,iy,iz)
|
buffer(icount+ix) = grid_$X(ix,iy,iz)
|
||||||
enddo
|
enddo
|
||||||
call MPI_REDUCE(buffer,grid_$X(1,iy,iz),dim,mpi_real, &
|
icount = icount + grid_x_num
|
||||||
|
enddo
|
||||||
|
dim = grid_x_num * grid_y_num
|
||||||
|
call MPI_REDUCE(buffer,grid_$X(1,1,iz),dim,mpi_real, &
|
||||||
mpi_sum,0,MPI_COMM_WORLD,ierr)
|
mpi_sum,0,MPI_COMM_WORLD,ierr)
|
||||||
if (ierr /= MPI_SUCCESS) then
|
if (ierr /= MPI_SUCCESS) then
|
||||||
call abrt(irp_here,'Unable to fetch buffer')
|
call abrt(irp_here,'Unable to fetch buffer')
|
||||||
endif
|
endif
|
||||||
call barrier
|
call barrier
|
||||||
enddo
|
enddo
|
||||||
enddo
|
|
||||||
IRP_ENDIF
|
IRP_ENDIF
|
||||||
|
call set_grid_data_$X(grid_$X)
|
||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
@ -188,6 +162,13 @@ END_PROVIDER
|
|||||||
|
|
||||||
integer :: ix, iy, iz, it
|
integer :: ix, iy, iz, it
|
||||||
integer :: ibegin, iend
|
integer :: ibegin, iend
|
||||||
|
real, parameter :: UNDEFINED=123456789.123456789
|
||||||
|
|
||||||
|
grid_$X_lapl(1,1,1) = UNDEFINED
|
||||||
|
call get_grid_data_$X_lapl(grid_$X)
|
||||||
|
if (grid_$X_lapl(1,1,1) /= UNDEFINED) then
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
do iz=1,grid_z_num
|
do iz=1,grid_z_num
|
||||||
do iy=1,grid_y_num
|
do iy=1,grid_y_num
|
||||||
@ -256,6 +237,8 @@ END_PROVIDER
|
|||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
IRP_ENDIF
|
IRP_ENDIF
|
||||||
|
call set_grid_data_$X_grad(grid_$X_grad)
|
||||||
|
call set_grid_data_$X_lapl(grid_$X_lapl)
|
||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
@ -265,3 +248,14 @@ SUBST [ X ]
|
|||||||
density;;
|
density;;
|
||||||
|
|
||||||
END_TEMPLATE
|
END_TEMPLATE
|
||||||
|
|
||||||
|
IRP_IF caca
|
||||||
|
BEGIN_PROVIDER [ integer, grid_partition_$X, (grid_x_num,grid_y_num,grid_z_num) ]
|
||||||
|
implicit none
|
||||||
|
BEGIN_DOC
|
||||||
|
! Create the topological partition of $X
|
||||||
|
END_DOC
|
||||||
|
|
||||||
|
END_PROVIDER
|
||||||
|
IRP_ENDIF
|
||||||
|
|
||||||
|
@ -3,34 +3,34 @@ program eplf
|
|||||||
provide mpi_rank
|
provide mpi_rank
|
||||||
|
|
||||||
if (comp_eplf) then
|
if (comp_eplf) then
|
||||||
call set_grid_data_eplf(grid_eplf)
|
PROVIDE grid_eplf
|
||||||
FREE grid_eplf
|
FREE grid_eplf
|
||||||
endif
|
endif
|
||||||
if (comp_eplf_grad.or.comp_eplf_lapl) then
|
if (comp_eplf_grad.or.comp_eplf_lapl) then
|
||||||
call set_grid_data_eplf_grad(grid_eplf_grad)
|
PROVIDE grid_eplf_grad
|
||||||
call set_grid_data_eplf_lapl(grid_eplf_lapl)
|
PROVIDE grid_eplf_lapl
|
||||||
FREE grid_eplf_grad
|
FREE grid_eplf_grad
|
||||||
FREE grid_eplf_lapl
|
FREE grid_eplf_lapl
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if (comp_elf) then
|
if (comp_elf) then
|
||||||
call set_grid_data_elf(grid_elf)
|
PROVIDE grid_elf
|
||||||
FREE grid_elf
|
FREE grid_elf
|
||||||
endif
|
endif
|
||||||
if (comp_elf_grad.or.comp_elf_lapl) then
|
if (comp_elf_grad.or.comp_elf_lapl) then
|
||||||
call set_grid_data_elf_grad(grid_elf_grad)
|
PROVIDE grid_elf_grad
|
||||||
call set_grid_data_elf_lapl(grid_elf_lapl)
|
PROVIDE grid_elf_lapl
|
||||||
FREE grid_elf_grad
|
FREE grid_elf_grad
|
||||||
FREE grid_elf_lapl
|
FREE grid_elf_lapl
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if (comp_density) then
|
if (comp_density) then
|
||||||
call set_grid_data_density(grid_density)
|
PROVIDE grid_density
|
||||||
FREE grid_density
|
FREE grid_density
|
||||||
endif
|
endif
|
||||||
if (comp_density_grad.or.comp_density_lapl) then
|
if (comp_density_grad.or.comp_density_lapl) then
|
||||||
call set_grid_data_density_grad(grid_density_grad)
|
PROVIDE grid_density_grad
|
||||||
call set_grid_data_density_lapl(grid_density_lapl)
|
PROVIDE grid_density_lapl
|
||||||
FREE grid_density_grad
|
FREE grid_density_grad
|
||||||
FREE grid_density_lapl
|
FREE grid_density_lapl
|
||||||
endif
|
endif
|
||||||
|
Loading…
Reference in New Issue
Block a user