2 сент. 2012 г.

Редактируем rungms для GAMESS

Эта запись прежде всего является дополнением к записи про установку GAMESS, а не(!) про запуск. Путаница может возникнуть потому что в самом GAMESS есть скрипт rungms, и я написал для своего кластера скрипт rungms. Сейчас запись про первый:)
Небольшая особенность того, как я исправил. GAMESS-ом у меня будет считать всего один пользователь и запуск будет осуществляться на небольшом количестве процессоров <=32. Но думаю, что идея того, как это будет сделано может быть проэкстраполирована на другие случаи.
Вначале, если при конфигурации было указано, что будет использован MPI, то в rungms нужно это дело вписать

set TARGET=mpi

А также указать директорию, где будут создаваться временные файлы. Желательно указать то место, куда есть доступ у пользователей, поэтому я сделал чтобы папка scr располагалась в директории у пользователя

set SCR=/home/user/work/scr

Далее доходим до строчки setenv AUXDATA

setenv AUXDATA /share/soft/gamess/auxdata

И затем пути для всех файлов, которые начинались на ~$USER заменить на $SCR

setenv  MAKEFP $SCR/$JOB.efp
setenv   GAMMA $SCR/$JOB.gamma
setenv TRAJECT $SCR/$JOB.trj
setenv RESTART $SCR/$JOB.rst
setenv   INPUT $SCR/$JOB.F05
setenv   PUNCH $SCR/$JOB.dat
setenv  AOINTS $SCR/$JOB.F08
...

Затем вставляем строчку

set GDDIjob=true

перед set ngddi=`grep -i '^ \$GDDI' $SCR/$JOB.F05 | grep -iv 'NGROUP=0 ' | wc -l`
Если честно, не уверен, что это нужно, но, на всякий случай, пусть будет :)
Важный момент, находим строчку

if ($TARGET == sockets) then

Если у нас изначально выбрано TARGET=mpi, то начиная с этого и до конца ничего не меняем, а ищем

if ($TARGET == mpi) then

Далее находим строчки с  if ($NCPUS == 1) then и меняем все условие следующим образом:

   if ($NCPUS >= 1) then
      echo `hostname` >> $HOSTFILE
      set NNODES=1

Остальное я за комментировал, т.к. запуск я планировал осуществлять без планировщика заданий и на одном(!) узле.

#   else
#             # Parallel run gets node names from schedular's assigned list:
#      if ($SCHED == SGE) then
#         uniq $TMPDIR/machines $HOSTFILE
#         set NNODES=`wc -l $HOSTFILE`
#         set NNODES=$NNODES[1]
#      endif
#      if ($SCHED == PBS) then
#         uniq $PBS_NODEFILE $HOSTFILE
#         set NNODES=`wc -l $HOSTFILE`
#         set NNODES=$NNODES[1]
#      endif
   endif

В принципе строки

      if ($SCHED == PBS) then
         uniq $PBS_NODEFILE $HOSTFILE
         set NNODES=`wc -l $HOSTFILE`
         set NNODES=$NNODES[1]
      endif

можно и не комментировать, потому что в них все будет работать, если планируется использование планировщика типа TORQUE.
Далее переходим к строке

   case hydra:
   if ($NNODES == 1) then

Здесь все нормально, только мне пришлось сменить

@ PPN2 = $PPN + $PPN

на

set PPN2 = $PPN + $PPN

потому что при запуске появлялась ошибка @: unexpected syntax. В программировании на C# я не силен, не очень знаю что это обозначает, поэтому решил заменить таким образом. Главное, что работает, и правильно :)
Далее идем ниже и ниже, до тех пока пока не найдем

case hydra:
   set echo
   setenv I_MPI_HYDRA_ENV all
   setenv I_MPI_PERHOST $PPN2
   mpiexec.hydra -f $PROCFILE -n $NCPUS \
         /share/soft/gamess/gamess.$VERNO.x < /dev/null
   unset echo
   breaksw

Здесь просто нужно заменить путь для запуска GAMESS на нужный.
Вот, собственно и все.

Некоторые замечания.
Для того, чтобы работать можно было ни на одном узле, а на нескольких, то можно просто вручную определять NNODES и сделать несколько скриптов для rungms для различных ресурсов, или же написать более хитрые условия (если без планировщика). Если будет использован планировщик, то думаю, что NNODES будет определяться из условия запуска PBS задания, и тоже все будет нормально.