path related routines in pwtools moved to NEB dir

git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@7043 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
marsamos 2010-08-31 03:22:54 +00:00
parent 19f3b13b92
commit 5db6a4ce74
5 changed files with 695 additions and 1 deletions

View File

@ -31,13 +31,18 @@ EEOBJS=../EE/libee.a
TLDEPS=bindir mods libs liblapack libblas pw eelib TLDEPS=bindir mods libs liblapack libblas pw eelib
all : tldeps neb.x all : tldeps neb.x path_int.x
neb.x : $(NEBOBJS) libneb.a $(LIBOBJS) $(PWOBJS) $(QEMODS) neb.x : $(NEBOBJS) libneb.a $(LIBOBJS) $(PWOBJS) $(QEMODS)
$(LD) $(LDFLAGS) -o $@ \ $(LD) $(LDFLAGS) -o $@ \
$(NEBOBJS) libneb.a $(PWOBJS) $(EEOBJS) $(QEMODS) $(LIBOBJS) $(LIBS) $(NEBOBJS) libneb.a $(PWOBJS) $(EEOBJS) $(QEMODS) $(LIBOBJS) $(LIBS)
- ( cd ../bin; ln -fs ../NEB/$@ . ) - ( cd ../bin; ln -fs ../NEB/$@ . )
path_int.x : path_int.o $(PWOBJS) $(QEMODS) $(LIBOBJS)
$(LD) $(LDFLAGS) -o $@ \
path_int.o $(PWOBJS) $(QEMODS) $(LIBOBJS) $(LIBS)
- ( cd ../bin ; ln -fs ../NEB/$@ . )
libneb.a : $(NEBLIBS) libneb.a : $(NEBLIBS)
$(AR) $(ARFLAGS) $@ $? $(AR) $(ARFLAGS) $@ $?
$(RANLIB) $@ $(RANLIB) $@

View File

@ -81,6 +81,13 @@ path_base.o : path_io_routines.o
path_base.o : path_opt_routines.o path_base.o : path_opt_routines.o
path_base.o : path_reparametrisation.o path_base.o : path_reparametrisation.o
path_base.o : path_variables.o path_base.o : path_variables.o
path_int.o : ../Modules/basic_algebra_routines.o
path_int.o : ../Modules/cell_base.o
path_int.o : ../Modules/constants.o
path_int.o : ../Modules/io_files.o
path_int.o : ../Modules/kind.o
path_int.o : ../Modules/splinelib.o
path_int.o : path_formats.o
path_io_routines.o : ../Modules/basic_algebra_routines.o path_io_routines.o : ../Modules/basic_algebra_routines.o
path_io_routines.o : ../Modules/cell_base.o path_io_routines.o : ../Modules/cell_base.o
path_io_routines.o : ../Modules/constants.o path_io_routines.o : ../Modules/constants.o

359
NEB/path_int.f90 Normal file
View File

@ -0,0 +1,359 @@
!
! Copyright (C) 2004 PWSCF group
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!
!
MODULE int_global_variables
!
USE kinds, ONLY : DP
!
IMPLICIT NONE
!
INTEGER :: N, dim
INTEGER :: old_num_of_images, new_num_of_images
INTEGER :: first_image, last_image
REAL (DP), ALLOCATABLE :: old_pos(:,:), new_pos(:,:)
REAL (DP), ALLOCATABLE :: old_PES_gradient(:,:), new_PES_gradient(:,:)
INTEGER, ALLOCATABLE :: fix_atom(:)
REAL (DP), ALLOCATABLE :: old_V(:), new_V(:)
REAL (DP), ALLOCATABLE :: d_R(:)
REAL (DP), ALLOCATABLE :: a(:), b(:), c(:), d(:), F(:)
REAL (DP), ALLOCATABLE :: old_mesh(:), new_mesh(:)
REAL (DP), ALLOCATABLE :: tangent(:)
CHARACTER(LEN=256) :: old_restart_file, new_restart_file
!
END MODULE int_global_variables
!
!
PROGRAM images_interpolator
!
USE kinds, ONLY : DP
USE io_files, ONLY : iunrestart
USE constants, ONLY : eps16
USE path_formats
USE basic_algebra_routines, ONLY : norm
USE cell_base, ONLY : at, alat
USE int_global_variables
USE splinelib
!
IMPLICIT NONE
!
INTEGER :: i, j, ia
INTEGER :: istep, nstep, suspended_image
INTEGER :: ierr
REAL (DP) :: R, delta_R, x
LOGICAL :: no_interpolation
LOGICAL, EXTERNAL :: matches
CHARACTER (LEN=20) :: cell_parameters
CHARACTER (LEN=256) :: input_line
!
!
! ... the input file is read
!
READ(*,*) N
READ(*,*) old_num_of_images
READ(*,*) new_num_of_images
READ(*,*) first_image
READ(*,*) last_image
READ(*,'(A)') old_restart_file
READ(*,'(A)') new_restart_file
READ(*,*) alat
!
READ( UNIT = *, FMT = '(A)', IOSTAT = ierr ) cell_parameters
!
IF ( ierr < 0 ) THEN
!
WRITE(*,'(T2,"read_input: the card CELL_PARAMETERS not found")')
STOP
!
ELSE IF ( ierr > 0 ) THEN
!
WRITE(*,'(T2,"read_input: an error occured reading CELL_PARAMETERS")')
STOP
!
END IF
!
IF ( .NOT. matches( "CELL_PARAMETERS" , TRIM( cell_parameters ) ) ) THEN
!
WRITE(*,'(T2,"read_input: ",A," is not a valid card")') cell_parameters
STOP
!
END IF
!
READ( UNIT = *, FMT = *, IOSTAT = ierr ) at
!
IF ( ierr < 0 ) THEN
!
WRITE(*,'(T2,"read_input: lattice vectors not found")')
STOP
!
ELSE IF ( ierr > 0 ) THEN
!
WRITE(*,'(T2,"read_input: an error occured reading laccice vectors")')
WRITE(*, FMT = lattice_vectors ) at
STOP
!
END IF
!
dim = 3 * N
!
ALLOCATE( old_pos( dim, old_num_of_images ) )
ALLOCATE( old_PES_gradient( dim, old_num_of_images ) )
ALLOCATE( old_V( old_num_of_images ) )
ALLOCATE( new_pos( dim, new_num_of_images ) )
ALLOCATE( new_PES_gradient( dim, new_num_of_images ) )
ALLOCATE( new_V( new_num_of_images ) )
ALLOCATE( fix_atom( dim ) )
ALLOCATE( d_R( dim ) )
ALLOCATE( tangent( dim ) )
ALLOCATE( a( old_num_of_images - 1 ) )
ALLOCATE( b( old_num_of_images - 1 ) )
ALLOCATE( c( old_num_of_images - 1 ) )
ALLOCATE( d( old_num_of_images - 1 ) )
ALLOCATE( F( old_num_of_images ) )
ALLOCATE( old_mesh( old_num_of_images ) )
ALLOCATE( new_mesh( new_num_of_images ) )
!
! ... the old restart file is read
!
OPEN( UNIT = iunrestart, FILE = old_restart_file, STATUS = "OLD", &
ACTION = "READ" )
!
no_interpolation = .FALSE.
!
READ( UNIT = iunrestart, FMT = * ) ! RESTART INFORMATION
READ( UNIT = iunrestart, FMT = * ) istep
READ( UNIT = iunrestart, FMT = * ) nstep
READ( UNIT = iunrestart, FMT = * ) suspended_image
READ( UNIT = iunrestart, FMT = * ) ! conv_elec
!
! ... read either "ENERGIES, POSITIONS AND GRADIENTS"
!
repeat_loop: DO
!
READ( UNIT = iunrestart, FMT = '(256A)', IOSTAT = ierr ) input_line
!
IF ( matches( input_line, &
"ENERGIES, POSITIONS AND GRADIENTS" ) ) EXIT repeat_loop
!
IF ( ierr /= 0 ) THEN
!
WRITE( *, '(/,5X,"an error occured reading",A)' ) old_restart_file
!
STOP
!
END IF
!
END DO repeat_loop
!
READ( UNIT = iunrestart, FMT = * ) ! Image:
READ( UNIT = iunrestart, FMT = * ) old_V(1)
!
ia = 0
!
DO j = 1, dim, 3
!
ia = ia + 1
!
READ( UNIT = iunrestart, FMT = * ) &
old_pos(j,1), &
old_pos((j+1),1), &
old_pos((j+2),1), &
old_PES_gradient(j,1), &
old_PES_gradient((j+1),1), &
old_PES_gradient((j+2),1), &
fix_atom(j), &
fix_atom((j+1)), &
fix_atom((j+2))
!
old_PES_gradient(:,1) = old_PES_gradient(:,1) * fix_atom
!
END DO
!
DO i = 2, old_num_of_images
!
READ( UNIT = iunrestart, FMT = * ) ! Image:
READ( UNIT = iunrestart, FMT = * ) old_V(i)
!
DO j = 1, dim, 3
!
READ( UNIT = iunrestart, FMT = * ) &
old_pos(j,i), &
old_pos((j+1),i), &
old_pos((j+2),i), &
old_PES_gradient(j,i), &
old_PES_gradient((j+1),i), &
old_PES_gradient((j+2),i)
!
END DO
!
old_PES_gradient(:,i) = old_PES_gradient(:,i) * fix_atom
!
END DO
!
CLOSE( UNIT = iunrestart )
!
F = 0.D0
!
DO i = 2, ( old_num_of_images - 1 )
!
! ... tangent to the path ( normalized )
!
tangent(:) = 0.5D0 * ( ( old_pos(:,i+1) - old_pos(:,i) ) / &
norm( old_pos(:,i+1) - old_pos(:,i) ) + &
( old_pos(:,i) - old_pos(:,i-1) ) / &
norm( old_pos(:,i) - old_pos(:,i-1) ) )
!
tangent = tangent / norm( tangent )
!
F(i) = DOT_PRODUCT( - old_PES_gradient(:,i) , tangent )
!
END DO
!
old_mesh(1) = 0.D0
!
DO i = 1, ( old_num_of_images - 1 )
!
d_R = old_pos(:,(i+1)) - old_pos(:,i)
!
R = norm( d_R )
!
old_mesh(i+1) = old_mesh(i) + R
!
a(i) = 2.D0 * ( old_V(i) - old_V(i+1) ) / R**(3) - &
( F(i) + F(i+1) ) / R**(2)
!
b(i) = 3.D0 * ( old_V(i+1) - old_V(i) ) / R**(2) + &
( 2.D0 * F(i) + F(i+1) ) / R
!
c(i) = - F(i)
!
d(i) = old_V(i)
!
END DO
!
i = first_image
!
delta_R = ( old_mesh(last_image) - &
old_mesh(first_image) ) / DBLE( new_num_of_images - 1 )
!
DO j = 0, ( new_num_of_images - 1 )
!
R = old_mesh( first_image ) + DBLE(j) * delta_R
!
new_mesh(j+1) = R
!
check_index: DO
!
IF ( ( R > old_mesh(i+1) ) .AND. &
( i < ( old_num_of_images - 1 ) ) ) THEN
!
i = i + 1
!
ELSE
!
EXIT check_index
!
END IF
!
END DO check_index
!
x = R - old_mesh( i )
!
new_V(j+1) = a(i)*(x**3) + b(i)*(x**2) + c(i)*x + d(i)
!
END DO
!
new_mesh = new_mesh / old_mesh(old_num_of_images)
old_mesh = old_mesh / old_mesh(old_num_of_images)
!
CALL dosplineint( old_mesh , old_pos , new_mesh , new_pos )
!
new_PES_gradient = 0.D0
!
new_PES_gradient(:,1) = old_PES_gradient(:,1)
!
new_PES_gradient(:,new_num_of_images) = old_PES_gradient(:,old_num_of_images)
!
! ... the new restart file is written
!
OPEN( UNIT = iunrestart, FILE = new_restart_file, STATUS = "UNKNOWN", &
ACTION = "WRITE" )
!
WRITE( UNIT = iunrestart, FMT = '("RESTART INFORMATION")' )
!
! ... by default istep and nstep are set to zero
!
WRITE( UNIT = iunrestart, FMT = '(I4)' ) 0
WRITE( UNIT = iunrestart, FMT = '(I4)' ) 0
WRITE( UNIT = iunrestart, FMT = '(I4)' ) 0
WRITE( UNIT = iunrestart, FMT = '(A4)' ) 'F'
!
WRITE( UNIT = iunrestart, FMT = '("ENERGIES, POSITIONS AND GRADIENTS")' )
!
DO i = 1, new_num_of_images
!
WRITE( UNIT = iunrestart, FMT = '("Image: ",I4)' ) i
WRITE( UNIT = iunrestart, FMT = energy ) new_V(i)
!
ia = 0
!
DO j = 1, dim, 3
!
ia = ia + 1
!
IF ( i == 1 ) THEN
!
WRITE( UNIT = iunrestart, FMT = restart_first ) &
new_pos(j,i), &
new_pos((j+1),i), &
new_pos((j+2),i), &
new_PES_gradient(j,i), &
new_PES_gradient((j+1),i), &
new_PES_gradient((j+2),i), &
fix_atom(j), &
fix_atom((j+1)), &
fix_atom((j+2))
!
ELSE
!
WRITE( UNIT = iunrestart, FMT = restart_others ) &
new_pos(j,i), &
new_pos((j+1),i), &
new_pos((j+2),i), &
new_PES_gradient(j,i), &
new_PES_gradient((j+1),i), &
new_PES_gradient((j+2),i)
!
END IF
!
END DO
!
END DO
!
WRITE( UNIT = iunrestart, FMT = '("END")' )
!
CLOSE( UNIT = iunrestart )
!
IF ( ALLOCATED( old_pos ) ) DEALLOCATE( old_pos )
IF ( ALLOCATED( old_PES_gradient ) ) DEALLOCATE( old_PES_gradient )
IF ( ALLOCATED( old_V ) ) DEALLOCATE( old_V )
IF ( ALLOCATED( new_pos ) ) DEALLOCATE( new_pos )
IF ( ALLOCATED( new_PES_gradient ) ) DEALLOCATE( new_PES_gradient )
IF ( ALLOCATED( new_V ) ) DEALLOCATE( new_V )
IF ( ALLOCATED( fix_atom ) ) DEALLOCATE( fix_atom )
IF ( ALLOCATED( d_R ) ) DEALLOCATE( d_R )
IF ( ALLOCATED( tangent ) ) DEALLOCATE( tangent )
IF ( ALLOCATED( a ) ) DEALLOCATE( a )
IF ( ALLOCATED( b ) ) DEALLOCATE( b )
IF ( ALLOCATED( c ) ) DEALLOCATE( c )
IF ( ALLOCATED( d ) ) DEALLOCATE( d )
IF ( ALLOCATED( F ) ) DEALLOCATE( F )
IF ( ALLOCATED( old_mesh ) ) DEALLOCATE( old_mesh )
IF ( ALLOCATED( new_mesh ) ) DEALLOCATE( new_mesh )
!
END PROGRAM images_interpolator

191
NEB/path_int.sh Executable file
View File

@ -0,0 +1,191 @@
#!/bin/bash --noprofile
#
################################################################################
## Copyright (C) 2004 Carlo Sbraccia. ##
## This file is distributed under the terms ##
## of the GNU General Public License. ##
## See http://www.gnu.org/copyleft/gpl.txt . ##
## ##
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ##
## EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ##
## MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ##
## NONINFRINGEMENT. IN NO EVENT SHALL CARLO SBRACCIA BE LIABLE FOR ANY ##
## CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ##
## TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ##
## SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ##
################################################################################
# make sure there is no locale setting creating unneeded differences.
LC_ALL=C
export LC_ALL
#
################################################################################
## Set these variables according to your needs ##
################################################################################
#
# ... root directory of the PWscf package
#
ROOT_DIR=""
#
# ... old and new restart file name
# ... ( usually old_prefix.neb and new_prefix.neb )
#
old_restart_file=""
new_restart_file=""
#
# ... number of images of the old and of the new path
#
old_num_of_images=
new_num_of_images=
#
# ... interpolation is performed between the first_image and the last_image
# ... of the old path
#
first_image=
last_image=
#
# ... the number of atoms
#
nat=
#
# ... lattice parameter ( celldm(1) in the pw input file )
#
alat=1.D0
#
# ... interpolation is possible only in the ibrav=0 case
# ... this card is the same used in the pw input file
#
cat > CELL_PARAMETERS << EOF
CELL_PARAMETERS
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000
0.00000 0.00000 0.00000
EOF
#
# ... optional informations:
# ... needed to gereate visualization files ( xyz and axsf formats )
#
# ... put a symbol for each atomic specie that compose the system
#
list_of_atoms=""
#
# ... number of atoms of each specie
# ... (the sum of all N[i] must be equal to nat)
#
N[1]=
#
################################################################################
################################################################################
###### DO NOT MODIFY THE SCRIPT UNDER THESE LINES ######
################################################################################
################################################################################
#
GAWK=$( which gawk )
#
################################################################################
## lattice vectors for gawk scripts ##
################################################################################
a11=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==2) {printf "%12.8f", $1} }' )
a12=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==2) {printf "%12.8f", $2} }' )
a13=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==2) {printf "%12.8f", $3} }' )
a21=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==3) {printf "%12.8f", $1} }' )
a22=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==3) {printf "%12.8f", $2} }' )
a23=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==3) {printf "%12.8f", $3} }' )
a31=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==4) {printf "%12.8f", $1} }' )
a32=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==4) {printf "%12.8f", $2} }' )
a33=$( cat CELL_PARAMETERS | $GAWK '{ if (NR==4) {printf "%12.8f", $3} }' )
#
################################################################################
## the input file for the iterpolator code is generated ##
################################################################################
#
if [ ! -f ${old_restart_file} ]; then
echo "Error: file ${old_restart_file} not fount"; exit
fi
#
cat > input << EOF
${nat}
${old_num_of_images}
${new_num_of_images}
${first_image}
${last_image}
${old_restart_file}
${new_restart_file}
${alat}
EOF
#
cat CELL_PARAMETERS | $GAWK '{ if ( NR == 1 ) { print }; if ( NR > 1 ) \
{ printf " %12.8f %12.8f %12.8f\n", $1, $2, $3} }' >> input
#
#
$ROOT_DIR/bin/path_int.x < input
#
if [[ "${list_of_atoms}" != "" ]]; then
#
##############################################################################
## dynamical generation of the "from_restart_to_axfs.gawk" script ##
##############################################################################
file="from_restart_to_axsf.gawk"
cat > ${file} << EOF
BEGIN{
a_0 = 0.529177 ; count = -10000;
printf " ANIMSTEPS %3i \n", ${new_num_of_images} ;
printf " CRYSTAL \n" ;
printf " PRIMVEC \n" ;
printf " %16.10f %16.10f %16.10f \n", ${a11}*a_0, ${a12}*a_0, ${a13}*a_0;
printf " %16.10f %16.10f %16.10f \n", ${a21}*a_0, ${a22}*a_0, ${a23}*a_0;
printf " %16.10f %16.10f %16.10f \n", ${a31}*a_0, ${a32}*a_0, ${a33}*a_0;
}
{
if ( \$0 == "RESTART INFORMATIONS" ) { next; next; next }
if ( \$0 == "ENERGY, POSITIONS AND GRADIENTS" ) { next }
if ( \$0 == "VELOCITIES" ) { exit }
if ( \$1 == "Image:" ) {
count = -1 ;
printf " PRIMCOORD %3i \n", \$2 ;
printf "%4i 1 \n", ${nat} ;
}
else {
count++;
EOF
#
ref1=0
ref2=0
#
index=0
#
for atom in ${list_of_atoms}; do
#
index=$(( ${index} + 1 ))
#
ref1=$(( ${ref2} + 1 ))
ref2=$(( ${ref2} + ${N[${index}]} ))
#
echo " if ( count >= ${ref1} && count <= ${ref2} ) { " >> ${file}
echo " printf \"${atom} \"; " >> ${file}
echo " printf \" %16.10f \", \$1 * a_0 ; " >> ${file}
echo " printf \" %16.10f \", \$2 * a_0 ; " >> ${file}
echo " printf \" %16.10f \", \$3 * a_0 ; " >> ${file}
echo " printf \" %16.10f \", \$4 / a_0 ; " >> ${file}
echo " printf \" %16.10f \", \$5 / a_0 ; " >> ${file}
echo " printf \" %16.10f \", \$6 / a_0 ; " >> ${file}
echo " printf \" \\n\"; " >> ${file}
echo " } " >> ${file}
#
done
#
echo " } " >> ${file}
echo "} " >> ${file}
#
##############################################################################
#
$GAWK -f from_restart_to_axsf.gawk ${new_restart_file} > \
${new_restart_file}.axsf
#
rm -f from_restart_to_axsf.gawk
#
fi
#
echo "done"
#
rm -f input
rm -f CELL_PARAMETERS

132
NEB/path_merge.sh Executable file
View File

@ -0,0 +1,132 @@
#!/bin/bash
################################################################################
## Copyright (C) 2007 Guido Fratesi. ##
## This file is distributed under the terms ##
## of the GNU General Public License. ##
## See http://www.gnu.org/copyleft/gpl.txt . ##
## ##
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ##
## EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ##
## MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND ##
## NONINFRINGEMENT. IN NO EVENT SHALL GUIDO FRATESI BE LIABLE FOR ANY ##
## CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ##
## TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ##
## SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ##
################################################################################
# #
# Suitable for PWSCF v. 4.0, might require revisions for future releases. #
# Execute with no arguments for help. #
# #
################################################################################
function showhelp () {
cat <<EOF > /dev/stderr
USAGE: path_merge.bash file0.path n0 m0 file1.path n1 m1
merges the two path files file0.path and file1.path by taking the
images n0 to m0 from file0.path and images n1 to m1 from file file1.path.
Merged file is written to standard output.
EOF
if [ "$err" ]; then cat << EOF > /dev/stderr
* ERROR: $err
EOF
fi
exit
}
awk=`which awk`
#
# ... Parse and check input parameters
#
inpf[0]=$1 # first path file (file0.path)
imlw[0]=$2 # from this image index (n0)
imup[0]=$3 # to this image index (m0)
inpf[1]=$4 # second path file (file1.path)
imlw[1]=$5 # from this image index (n1)
imup[1]=$6 # to this image index (m1)
#
if (($#==0)); then err=""; showhelp; fi
if (($#<6)); then err="Too few arguments!"; showhelp; fi
if (($#>6)); then err="Too many arguments!"; showhelp; fi
for i in 0 1; do
if [ ! -f ${inpf[$i]} ]; then
err="File n.$i \"${inpf[$i]}\" not found!"
showhelp
fi
#
# ... Extract number of atoms
#
nat[$i]=`$awk '
($1=="Image:")&&($2==1) {n=NR};
($1=="Image:")&&($2==2) {printf NR-n-2; exit};
' ${inpf[$i]}`
#
# ... Read number of images
#
nim[$i]=`$awk '/NUMBER OF IMAGES/ {getline; printf $1; exit}' ${inpf[$i]}`
#
if ((${imlw[$i]}<1)) || ((${imlw[$i]}>${nim[$i]})) ||
((${imup[$i]}<1)) || ((${imup[$i]}>${nim[$i]})) ||
((${imup[$i]}<${imlw[$i]})) ; then
err="Check the images requested from file n.$((i+1))"
showhelp
fi
#
done
#
if ((${nat[0]}!=${nat[1]})); then
err="The number of atoms in the two path files is not the same!"
showhelp
fi
#
# ... Write the header
#
cat <<EOF
RESTART INFORMATION
0
0
0
NUMBER OF IMAGES
`printf %4i $(( ${imup[0]}-${imlw[0]}+1 + ${imup[1]}-${imlw[1]}+1 ))`
ENERGIES, POSITIONS AND GRADIENTS
EOF
#
# ... Write the images sections
#
iim=1
for i in 0 1; do
#
awk -v iim=$iim -v nat=${nat[$i]} -v imlw=${imlw[$i]} -v imup=${imup[$i]} '
#
BEGIN {HUGE=99999; nfix=-HUGE; n=-HUGE};
#
# ... Get indexes fixing coordinates
#
/ENERGIES, POSITIONS AND GRADIENTS/ {nfix=NR+2};
(NR>=nfix+1)&&(NR<=nfix+nat) {fix[NR-nfix]=sprintf("%3i%3i%3i",$7,$8,$9)};
#
# ... Write images in the range requested
#
($1=="Image:")&&($2>=imlw)&&($2<=imup) { n=NR+1;
printf("Image:%5i\n",iim); }
(NR==n)
(NR>=n+1)&&(NR<=n+nat) { for(i=1;i<=6;i++) printf("%20.12f",$i);
if(iim==1) printf("%9s",fix[NR-n]);
printf("\n"); };
(NR==n+nat) { iim++; };
' ${inpf[$i]}
#
iim=$(($iim+${imup[$i]}-${imlw[$i]}+1))
#
done