最好的超算中心提交任务方法

前言

其实这里就是把我常用的脚本提交上来。通常来说科学计算的流程是这样的: 本地coding ==> 本地测试 ==> 上超算试跑 ==> 大规模运算求解。主要的目的就是为了节约机时同时便于查找错误。

所以我这里的程序主要包括的是提交和后期处理两部分。

这是我个人最喜欢的使用超算中心的方法,当然就你个人的情况可能需要有针对性的修改。

提交任务

编译任务

我使用gcc

主要的文件分成source和run两个目录,run目录按照时间分类同时在实验记录本上记录这样非常方便查找。

1
2
3
4
5
6
7
8
#!/bin/sh
prog="chanel8.2"
source="chanel8.2.c"
date="20150601"
cd ~/YourUserNameXXX/source/
gcc -o ${prog} ${source}  -lm
cp ${prog} ../RUN/${date}/
exit

提交任务

深圳超算中心本身有一个提交任务的run.sh脚本这个每一个任务都必须有一个以方便超算中心分配资源。

我的run.sh如下:

1
2
3
4
#!/bin/sh
APP_NAME=intelk_small
NP=1
RUN="chanel8.2"

然后提交任务的命令如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
Possibility="attractive24-48-p0.55"
date="20150601"
prog="chanel8.2"
source="chanel8.2.c"

mkdir ~/YourUserNameXX/RUN/${date}/${Possibility}

for i in $( seq 1 30  )
do
   mkdir ~/YourUserNameXXX/RUN/${date}/${Possibility}/no${i}
   cd ~/YourUserNameXXX/RUN/${date}/${Possibility}/no${i}
   cp ~/YourUserNameXXX/RUN/${date}/${prog} ~/YourUserNameXXX/RUN/${date}/run.sh .
   chmod +x run.sh
   bsub run.sh
   sleep 1
   echo "Done${i}"
done

这个脚本的作用就是提交任务的,分别指定分配的计算目录同时拷贝文件进入,然后提交任务。提交完成后停止1s方便超算中心后台分配任务这样不太容易出错,因为北京和深圳的网络会有延时。所以为了抵消这个影响停止1s。

数据处理

有一个主控的bash文件来实现一个命令处理完全部数据的目标。

  1. 验证计算的完整性,通过log文件实现
  2. 顺便生成所有需要做平均各个指标文件路径文件
  3. 用R语言来统计结果
  4. 需要作图的使用gnuplot输出

主控文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#! /bin/bash 
#测试所有的10个200万运算成功
#标志为log.txt文件最后的记录为360001
#同时在每个子目录循环的时候记录文件路径方便第二步处理数据
count=0
path=`pwd`
Uflux="/flux.txt"
Uvelocity="/velocity.txt"
Udensity="/density.txt"

find $path -mindepth 1 -type d | while read dir
do 
    var=`tail -n 1 $dir/log.txt`
    #echo $var
    if [ $var -eq 360001 ]
        then
            #echo "right"
            let count++
        else
            echo $dir
    fi

    echo $count

    url="$dir$Uflux"
    echo $url >> fluxurl.txt
    url="$dir$Uvelocity"
    echo $url >> velocityurl.txt
    url="$dir$Udensity"
    echo $url >> densityurl.txt
    Dflux=`awk '{print $12}' $dir/output*`
    echo $Dflux >> jet.txt
done

#调用程序合并10次的结果并且统计平均值输出
#去除掉y=0,1,2部分数据,这部分数据受到边界处珠子的影响不准确
Rscript $path/datapro.R $path

#调用gnuplot画图

#画密度场
gnuplot density.gnu
#画速度场
gnuplot vector.gnu
#计算同样的x位置所有y位置的x方向速度之和,验证连续性条件
gnuplot XFluxOverWholeY.gnu
#A的浓度梯度
gnuplot gradA.gnu
#B的浓度梯度
gnuplot gradB.gnu
#绘制 同一个x下不同y方向的层流大小分布,Y方向是否均一变化
gnuplot YfluxDistrobutionOverDifferentX.gnu
#y方向的层流大小,低Re系数下层流明显
gnuplot YfluxOverWholeX.gnu
#测试缺失的流量去向
gnuplot checkmissingflux.gnu

echo "Done"

##R文件数据处理

使用R语言做大规模数据处理,主要的理由:

  1. 可以方便的使用各种函数
  2. 比较方便处理和输出同时可以进行很好的探究性先验研究
  3. 比较熟悉R事实上Python也是完全可以的

值得注意的是这里的文件路径输入和读取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
Args <- commandArgs()
#绘制流场
Vecurl<-paste(Args[6],"/velocityurl.txt",sep ="")

#Vecurl="/home/iphyer/Chanel/Data/attractive12-24/p/attractive12-24-p0.65/velocityurl.txt"
con <- file(Vecurl, "r")
line=readLines(con,n=1)
#print(line)
#line="/home/iphyer/Chanel/p0.85/no5/velocity.txt"
vector1<-read.table(line,fill = TRUE,col.names=c("i","x","y","vx","vy","n"))
line=readLines(con,n=1)
i=1
while( length(line) != 0 ) {
  #print(line)
  vector2<-read.table(line,fill = TRUE,col.names=c("i","x","y","vx","vy","n"))
  #tail(vector2)
  vector1$vx<-vector1$vx+vector2$vx
  vector1$vy<-vector1$vy+vector2$vy
  vector1$n<-vector1$n+vector2$n
  # print('Velocity Done')
  line=readLines(con,n=1)
  i=i+1
}

vector1$vx<-1.*vector1$vx/i
vector1$vy<-1.*vector1$vy/i
vector1$n<-1.*vector1$n/i
subvec<-subset(vector1,vector1$y>=3)
write.table(subvec,"velcoity.txt",,sep ="\t",col.names=F,row.names=F)
close(con)

#统计流场1
b<-numeric(108)
c<-numeric(108)
flux<-data.frame(vector1$x,vector1$y,vector1$vx*vector1$n)
j=1
for (i in 1:108){
  a<-subset(flux,flux$vector1.x==j)
  b[j]<-j
  c[j]<-sum(a$vector1.vx...vector1.n)
  j=j+1
}
#plot(b,c)
continuity=data.frame(b,c)
#write.table(continuity,"flux.txt",sep ="\t",col.names=F,row.names=F)
AllFlux<-sum(c)/108
print('Flux1:')
print(AllFlux)

#=====================================================================================================================
#解决Y方向流量不守恒问题
#=====================================================================================================================
flux3<-subset(vector1,vector1$y==3)
fluxy3<-data.frame(flux3$x,flux3$vy*flux3$n)
#plot(fluxy3)
write.table(fluxy3,"fluxy3.txt",,sep ="\t",col.names=F,row.names=F)
#====================================================================================================================
#统计流场2
Fluxurl<-paste(Args[6],"/fluxurl.txt",sep ="")
#Fluxurl="/home/iphyer/Chanel/Data/attractive12-24/p/attractive12-24-p0.65/fluxurl.txt"
con <- file(Fluxurl, "r")
line=readLines(con,n=1)
#print(line)
flux1<-read.table(line,col.names=c("i","x","y","flux"))
flux1$flux<-1.0*flux1$flux
line=readLines(con,n=1)
i=1
while( length(line) != 0 ) {
  #print(line)
  flux2<-read.table(line,col.names=c("i","x","y","flux"))
  flux2$flux<-1.0*flux2$flux
  flux1$flux<-flux1$flux+flux2$flux
  #print('Flux Done')
  line=readLines(con,n=1)
  i=i+1
}
#print(i)
flux1$flux<-1.*flux1$flux/i

write.table(flux1,"flux.txt",sep ="\t",col.names=F,row.names=F)

#计算同样的x位置所有y位置的x方向速度之和,验证连续性条件
b<-numeric(108)
cGT3<-numeric(108)
cWhole<-numeric(108)
j=1
for (i in 1:108){
  a<-subset(flux1,flux1$x==j)
  aGT3<-subset(a,a$y>=3)
  b[j]<-j
  cGT3[j]<-sum(aGT3$flux)
  cWhole[j]<-sum(a$flux)
  j=j+1
}

continuityGT3<-data.frame(b,cGT3)
write.table(continuityGT3,"XfluxOverGT3Y.txt",sep ="\t",col.names=F,row.names=F)
continuity<-data.frame(b,cWhole)
write.table(continuity,"XfluxOverWholeY.txt",sep ="\t",col.names=F,row.names=F)
AllFlux<-sum(cWhole)/108
print('Flux2:')
print(AllFlux)
close(con)

#============================================================================================
#y方向的层流大小,低Re系数下层流明显
#============================================================================================
b<-numeric(14)
c<-numeric(14)
j=1
for (i in 1:14){
  a<-subset(flux1,flux1$y==j+2)
  a<-subset(a,a$y>=3)
  b[j]<-j+2
  c[j]<-sum(a$flux)
  j=j+1
}
continuity=data.frame(b,c)
write.table(continuity,"YfluxOverWholeX.txt",sep ="\t",col.names=F,row.names=F)

#============================================================================================
#挑选最大流量的那一层其实就是最低一层代表该设置条件下的流动优势,为了减少误差,同时计入珠子左侧的影响、
#考虑到平流效应已经被证实,所以使用y=3的这一层代表驱动的动力层
#============================================================================================
maxflux<-continuity[1,2]
print("Max Bottom layer of Flux:")
print(maxflux)
#============================================================================================
#同一个x下不同y方向的层流大小分布,Y方向是否均一变化
#============================================================================================
#============================================================
#统计不同x处的y方向流量分布

a<-subset(flux1,flux1$x==29.0)
a<-subset(a,a$y>=3)
b<-data.frame(a$y,a$flux)
colnames(b)<-c("y","29")
xcor<-c(32.0,35.0,38.0,41.0,44.0,47.0,50.0,53.0)
for (i in xcor){
  j<-i
  a<-subset(flux1,flux1$x==j)
  a<-subset(a,a$y>=3)
  b<-cbind(b,a$flux)
  colnames(b)[length(colnames(b))]<-i
}

write.table(b,"YfluxDistrobutionOverDifferentX.txt",sep ="\t",col.names=T,row.names=F)


#===============================================================================================================
#处理最严格意义上对于流量的积分
#===============================================================================================================
jet<-read.table("jet.txt",header=F)
meanjet<-1.0*sum(jet)/(ncol(jet)*nrow(jet))
print(meanjet)
Ntimes<-1600000*0.1
netflux<-meanjet/Ntimes
print("netflux definition:")
print(netflux)

#===============================================================================================================
#统计A和B粒子的密度分布
#===============================================================================================================

Densityurl<-paste(Args[6],"/densityurl.txt",sep ="")
con <- file(Densityurl, "r")
line=readLines(con,n=1)
#print(line)
den1<-read.table(line,col.names=c("x","y","denA","denB"))
line=readLines(con,n=1)
i=1
while( length(line) != 0 ) {
  #print(line)
  den2<-read.table(line,col.names=c("x","y","denA","denB"))
  den1$denA<-den1$denA+den2$denA
  den1$denB<-den1$denB+den2$denB
  #print('Density Done')
  line=readLines(con,n=1)
  i=i+1
}
den1$denA<-1.*den1$denA/i
den1$denB<-1.*den1$denB/i

subvec<-subset(den1,den1$y>=3)
write.table(subvec,"density.txt",sep ="\t",col.names=F,row.names=F)
close(con)
#===============================================================================================================
#处理梯度场问题,使用中心差分算法
#===============================================================================================================

denALL<-read.table("density.txt",col.names=c("x","y","denA","denB"))

gradBx<-data.frame(gBx=numeric(0))

#舍弃第一层,很难定义和计算
for(i in 1:length(denALL$x)){
  if(i>=217){

    if( i%%216==1 ){
      temp<-denALL[i+1,4]-denALL[i+215,4]
      gradBx<-rbind(gradBx,temp)
    }
    else if( i%%216==0 ){
      temp<-denALL[i-215,4]-denALL[i-1,4]
      gradBx<-rbind(gradBx,temp)
    }
    else{
      temp<-denALL[i+1,4]-denALL[i-1,4]
      gradBx<-rbind(gradBx,temp)
    }

  }
  else{
    temp<-0
    gradBx<-rbind(gradBx,temp)
  }

}

gradBy<-data.frame(gBy=numeric(0))

for(i in 1:length(denALL$x)){
  if( i<=216 ){
    temp<-0#denALL[i+216,4]/0.5
    gradBy<-rbind(gradBy,temp)
  }
  else if( i>= 5617 ){
    temp<-0
    gradBy<-rbind(gradBy,temp)
  }
  else{
    temp<-denALL[i+261,4]-denALL[i-216,4]
    gradBy<-rbind(gradBy,temp)
  }
}

gradB<-data.frame(denALL$x,denALL$y,gradBx,gradBy)

write.table(gradB,"gradB.txt",col.names=F,row.names=F)

#============================================================================================
#A粒子梯度场图
#============================================================================================

denALL<-read.table("density.txt",col.names=c("x","y","denA","denB"))

gradAx<-data.frame(gAx=numeric(0))

#舍弃第一层,很难定义和计算
for(i in 1:length(denALL$x)){
  if(i>=217){

    if( i%%216==1 ){
      temp<-denALL[i+1,3]-denALL[i+215,3]
      gradAx<-rbind(gradAx,temp)
    }
    else if( i%%216==0 ){
      temp<-denALL[i-215,3]-denALL[i-1,3]
      gradAx<-rbind(gradAx,temp)
    }
    else{
      temp<-denALL[i+1,3]-denALL[i-1,3]
      gradAx<-rbind(gradAx,temp)
    }

  }
  else{
    temp<-0
    gradAx<-rbind(gradAx,temp)
  }

}

gradAy<-data.frame(gAy=numeric(0))

for(i in 1:length(denALL$x)){
  if( i<=216 ){
    temp<-0#denALL[i+216,4]/0.5
    gradAy<-rbind(gradAy,temp)
  }
  else if( i>= 5617 ){
    temp<-0
    gradAy<-rbind(gradAy,temp)
  }
  else{
    temp<-denALL[i+261,3]-denALL[i-216,3]
    gradAy<-rbind(gradAy,temp)
  }
}

gradA<-data.frame(denALL$x,denALL$y,gradAx,gradAy)

write.table(gradA,"gradA.txt",col.names=F,row.names=F)

#============================================================================================
#A与B粒子的浓度比图
#============================================================================================
ratioBtoA<-data.frame(denALL$x,denALL$y,denALL$denB/denALL$denA)
write.table(ratioBtoA,"ratioBtoA.txt",col.names=F,row.names=F)

gnuplot画图

就来一个画浓度场图的gnu文件吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/gnuplot
#
# Interpolating a heat map
#
# AUTHOR: Hagen Wierstorf
# VERSION: gnuplot 4.6 patchlevel 0

reset

# wxt
#set xterm jpeg size 216,16 #enhanced font 'Verdana,10' persist
# png
#set terminal pngcairo size 1080,160 enhanced font 'Verdana,10'
#set output 'density-B.png'

set terminal postscript eps size 108,18 enhanced font "Arial-Bold,100"


set border linewidth 0
unset key
#set colorbox
#unset tics
set colorbox horiz user origin .1,.06 size .8,.04

set cbtics
set grid cbtics

set format cb "%.1f"

#set palette grey
# palette
# set path of config snippets
#set loadpath '/home/iphyer/.config/gnuplot/'
#load 'ylrd.pal'
set palette negative defined ( \
    2 '#d73027',\
    3 '#f46d43',\
    4 '#fdae61',\
    5 '#fee090',\
    6 '#E6F598',\
    7 '#ABDDA4',\
    8 '#66C2A5',\
    9 '#3288BD' )

set yrange [3:16]
set xrange [0:108]
#set pm3d  
#splot "file"
set dgrid3d
set pm3d map
set size ratio -1


set output 'densityB.eps'
plot 'density.txt' u 1:2:4 with image
set output


set output 'densityA.eps'
plot 'density.txt' u 1:2:3 with image
set output

set output 'ratioBtoA.eps'
plot 'ratioBtoA.txt' u 1:2:3 with image
set output

结果

最后放一个结果图吧,漂亮一点

tu1

tu2

希望这些脚本可以帮助到大家!

欢迎留言讨论。

Comments

Comments