运行ptmc程序的批处理脚本

1. ptmc文件设置

报错的warning, 源码的bug, 新的gcc编译器会出现warning, 编译加上-fno-align-commons可解决一个

ptmc.for:3649.50:

        call MK_SWAP (swap_pairs_flag, configbuf, exchflagbuf)          
                                                  1
Warning: Actual argument contains too few elements for dummy argument 'exchflagbuf' (300/601800) at (1)
ptmc.for:4913.23:

      common /prothyph/   iresname, hres                                
                       1
Warning: Padding of 1 bytes required before 'hres' in COMMON 'prothyph' at (1); reorder elements or use -fno-align-commons
ptmc.for:563.23:

问题不大
对于相互作用参数的文件, 格式一定要按照原来的文件格式, 不然报错, 因为Fortran代码里就是那么写的, 不够智能
残基的个数也不能只有20个, 也会报错, 加上原来的用不上的就行
都是报错后, 发现的问题. 小问题

2. shell并行执行控制

首先是简单的 & 和 wait, 后台处理和等待处理完成
不过我控制的并行的个数, 因为一次执行需要使用5个cpu核心, 并行4个差不多了
使用的方法 : 利用命名管道来做任务队列, 可百度搜索
感觉类似像锁一样, 包含在ptmcRun这个函数里, read 后面的 {} 中内容为需要并行执行的命令
具体的脚本如下, 包含所有的内容
ptmcRun.pbs

#!/bin/bash

#PBS -N ptmc

#PBS -l nodes=1:ppn=24
#PBS -j n
#PBS -e ${PBS_JOBNAME}.err
#PBS -o ${PBS_JOBNAME}.out

[[ $PBS_O_WORKDIR != "" ]] && cd $PBS_O_WORKDIR
###########################################################
# p means: Protein
function proNumAndName {
  pFileName=`ls *.pdb` && pId=${pFileName:0:4}
  atomNum=`awk '{if($1 == "ATOM") i += 1} END{print i}' $pFileName`
}

function ptmcArgsSetting {
  cp ${pId}.pdb ${wd}/mold
  sed -i -e "1s/.*/${pId}.pdb,/g; 6s/.*/${pId}_1.pdb,/g" ./mold/finfo.txt
  sed -i -e "16s/[0-9]*/${bX}/1; 17s/[0-9]*/${bY}/1; 18s/[0-9]*/${bZ}/1; \
             15s/[0-9]*/${atomNum}/1" ./mold/parainfo.dat
  sed -i -e "4s/[0-9]*/${rZ}/1" ./mold/iconfig.dat
}

function ptmcRun {
  # 创建有名管道
  rm ./fifoFile
  mkfifo ./fifoFile
  # 创建文件描述符,以可读(<)可写(>)的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性
  exec 3<> ./fifoFile
  # 删除文件, 只需要使用描述符
  rm ./fifoFile
  # 创建令牌个数, 当管道里还有令牌时可以进行计算
  for i in {1..4}; do
    # echo 每次输出一个换行符, 代表一个令牌
    echo >&3                   
  done

  for scd in ${SCD[@]};do
    for is in ${IS[@]};do
      # 读取管道内令牌
      read -u3
      {
        if [ `echo "${scd} > 0" | bc` -gt 0 ]; then 
          dflag=p.
        else
          dflag=n.
        fi
        mkdir ${wd}/${dflag}${scd}_${is}
        cp -r ${wd}/mold/* ${wd}/${dflag}${scd}_${is}
        cd ${wd}/${dflag}${scd}_${is}
        mv rspara_${dflag}dat rspara.dat
        sed -i -e "35s/.*/${scd}       ,SCD/1; 36s/.*/${is}       ,IS/1" parainfo.dat
        mpif90 ptmc.for
        mpirun -n 5 ./a.out > ptmc.out
        echo -e "1\n3\n" | gmx confrms -f1 pspdb00.pdb -f2 ${pId}.pdb -o ${pId}_ptmc.pdb
        sed '/MODEL/,/MODEL/d' ${pId}_ptmc.pdb > ${pId}_${scd}_${is}.pdb
        # 执行完成后将令牌放回
        echo >&3
      } &   # &符号执行并行
    done
  done
  wait
  # 等待循环条件全部跑完, 关闭管道读写
  exec 3<&-                       # 关闭文件描述符的读
  exec 3>&-                       # 关闭文件描述符的写
}

function ptmcAnalys {
  cd ${wd}
  pdir=$( ls | grep _ )
  mkdir -p ${wd}/analys/data ${wd}/analys/pdb
  for dir in ${pdir[@]}; do
    cd ${wd}/${dir}
    cp histpornt00.dat ${wd}/analys/data/${dir}-UOP.dat
    cp ${pId}_${dir:2}.pdb ${wd}/analys/pdb/

    cd ${wd}/analys/data
    echo -e "\n[[ ${dir:2} ]]" >> total.dat
    echo -e "Frame     Cos    Probability   Total_Energy   Vdw_Ene     Coulomb_Ene" > r_${dir}.dat
    awk '{ if ($2 > 1) printf("%5d%10.4f%10.3f%16.3f%12.3f%14.3f\n", \
         NR, $1, $2, $3, $4, $5)}' ${dir}-UOP.dat >> r_${dir}.dat
    cat r_${dir}.dat >> total.dat
  done
}

###########################################################

SCD=(0.001 -0.001)
IS=(0.01 0.03 0.05 0.1 0.3)

bX=100
bY=100
bZ=100
rZ=50

wd=$PWD

proNumAndName
ptmcArgsSetting
ptmcRun
ptmcAnalys