hyd.modify

1. vi src/cuda/Makefile

enable verbose print

38 DEFINES += -DVERBOSE_PRINT


添加printf打印MPI_Send/MPI_Recv模式

Idea: 在每个MPI_Send / MPI_Recv之前,打印sender/receiver的MPI rank

./src/pgesv/HPL_spreadN.c

159    MPI_Group                 g1, basegroup;
160    int                       ranks[1], ranks_out[1];
161    char                      hostname[50];
203                   if( ierr == MPI_SUCCESS ) {
204 //                   MPI_Comm_rank(comm,&rank);
205                      MPI_Comm_rank(MPI_COMM_WORLD, &rank);
206                      gethostname(hostname, 50);
207                      ranks[0]=IPMAP[npm1-partner];
208                      MPI_Comm_group( comm, &g1 );
209                      MPI_Comm_group( MPI_COMM_WORLD, &basegroup );
210                      MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
211                      printf("<HPL_spreadN> [%s]rank[%d] receives from left rank[%d]\n", hostname, rank, ranks_out[0]);
212                      ierr =   MPI_Recv( Mptr( U, ibuf, 0, LDU ), 1, type,
213                                         IPMAP[npm1-partner], Cmsgid, comm,
214                                         &status );
215                   }
228                      MPI_Comm_rank(MPI_COMM_WORLD, &rank);
229                      gethostname(hostname, 50);
230                      ranks[0]=IPMAP[npm1-partner];
231                      MPI_Comm_group( comm, &g1 );
232                      MPI_Comm_group( MPI_COMM_WORLD, &basegroup );
233                      MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
234                      printf("<HPL_spreadN> [%s]rank[%d] sends to left rank[%d]\n", hostname, rank, ranks_out[0]);
286                   if( ierr == MPI_SUCCESS ) {
288                      MPI_Comm_rank(MPI_COMM_WORLD, &rank);
289                      gethostname(hostname, 50);
290                      ranks[0]=IPMAP[SRCDIST+partner];
291                      MPI_Comm_group( comm, &g1 );
292                      MPI_Comm_group( MPI_COMM_WORLD, &basegroup );
293                      MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
294                      printf("<HPL_spreadN> [%s]rank[%d] receives from right rank[%d]\n", hostname, rank, ranks_out[0]);
311                   if( ierr == MPI_SUCCESS ) {
313                      MPI_Comm_rank(MPI_COMM_WORLD, &rank);
314                      gethostname(hostname, 50);
315                      ranks[0]=IPMAP[SRCDIST+partner];
316                      MPI_Comm_group( comm, &g1 );
317                      MPI_Comm_group( MPI_COMM_WORLD, &basegroup );
318                      MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
319                      printf("<HPL_spreadN> [%s]rank[%d] sends to right rank[%d]\n", hostname, rank, ranks_out[0]);
322                      ierr =   MPI_Send( Mptr( U, ibuf, 0, LDU ), 1, type, IPMAP[SRCDIST+partner], Cmsgid, comm );

./src/pgesv/HPL_rollN.c

申请变量

MPI_Group          g1, basegroup;
int                        ranks[1], ranks_out[1];
char                     hostname[50];

计算local group g1和global group  basegroup

comm = PANEL->grid->col_comm;
MPI_Comm_group( comm, &g1 );
MPI_Comm_group( MPI_COMM_WORLD, &basegroup );

在MPI_Send/MPI_Recv之前计算local rank相对应的global rank

if( ierr == MPI_SUCCESS ){
   MPI_Comm_rank(comm,&rank);
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
   gethostname(hostname, 50);
   MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
   printf("<HPL_rollN-Irecv> [%s]rank[%d] receives from rank[%d]\n", hostname, rank, ranks_out[0]);
   ierr =   MPI_Irecv( Mptr( U, ibufR, 0, LDU ), 1, type[I_RECV], partner, Cmsgid, comm, &request );
}

if( ierr == MPI_SUCCESS ){
   MPI_Comm_rank(comm,&rank);
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
   gethostname(hostname, 50);
   MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
   printf("<HPL_rollN-Send> [%s]rank[%d] sends to rank[%d]\n", hostname, rank, ranks_out[0]);  //print global rank
//   printf("<HPL_rollN-Irecv> [%s]rank[%d] sends to rank[%d]\n", hostname, rank, partner);  //only print local rank
   ierr =   MPI_Send( Mptr( U, ibufS, 0, LDU ), 1, type[I_SEND],
                      partner, Cmsgid, comm );
}

./src/comm/HPL_1ring.c

MPI_Group    g1, basegroup;
int                 ranks[1], ranks_out[1], glo_rank,loc_rank;  //glo_rank很重要,之前直接取到局部rank变量,引起计算错误
char              hostname[50];
153    if( rank == root )
154    {
155         gethostname(hostname, 50);
156         MPI_Comm_group( comm, &g1 );
157         MPI_Comm_rank(MPI_COMM_WORLD, &glo_rank);
158         ranks[0]=MModAdd1(rank, size);
159         MPI_Comm_group( MPI_COMM_WORLD, &basegroup );
160         MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
161         printf("<HPL_1ring> rank[%d] sends to rank[%d]\n", glo_rank, ranks_out[0]);
162         ierr = MPI_Send( _M_BUFF, _M_COUNT, _M_TYPE, MModAdd1( rank,
163                        size ), msgid, comm );
173          if( go != 0 )
174          {
175             MPI_Comm_rank(MPI_COMM_WORLD, &glo_rank);
176             MPI_Comm_group( comm, &g1 );
177             MPI_Comm_group( MPI_COMM_WORLD, &basegroup );
178             ranks[0]=prev;
179             MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
180             printf("<HPL_1ring> rank[%d] receives from rank[%d]\n", glo_rank, ranks_out[0]);
181             ierr = MPI_Recv( _M_BUFF, _M_COUNT, _M_TYPE, prev, msgid,
182                              comm, &PANEL->status[0] );
183             next = MModAdd1( rank, size );
184             if( ( ierr == MPI_SUCCESS ) && ( next != root ) )
185             {
186             ranks[0]=next;
187             MPI_Group_translate_ranks(g1, 1, ranks, basegroup, ranks_out);
188             printf("<HPL_1ring> rank[%d] sends to rank[%d]\n", glo_rank, ranks_out[0]);
189                ierr = MPI_Send( _M_BUFF, _M_COUNT, _M_TYPE, next,
190                                 msgid, comm );


implicit none include 'genrl.h' include 'ufiles.h' c c Declarations. integer ientry character*8 ityp1,rtit1,rtit2 c c Execution. c copyright(1:21) = ' Copyright (C) 2001' copyright(22:64) = 'Information Systems Laboratories, Inc.' if (ientry .eq. 1) then ptitle(1:12) = ' RBIC/3.3' *if -def,ngentitl ptitle(13:24) = ' ' ptitle(25:64) = 'RELAP5 Based Integrated Code' *endif *if def,titlnrc * ptitle(13:22) = '#ge_nrc' * ptitle(23:64) = 'DEVELOPMENTAL RELAP5 Based Integrated Code' *endif *if -def,titlnrc else if (ientry .eq. 2) then if (ityp1 .eq. 'newslp') then ptitle(1:12) = ' SCDAP/3.2' ptitle(25:64) = 'Severe Accident Analysis Program ' else if (ityp1 .eq. 'new') then ptitle(1:12) = ' RELAP5/3.3' ptitle(25:64) = 'Reactor Loss Of Coolant Analysis Program' else if (ityp1(1:6) .eq. 'newath') then ptitle(1:12) = ' ATHENA/3.2' ptitle(25:64) = 'Adv. Therm. Hyd. Energy Network Analyzer' endif else if (ientry .eq. 3) then if (rtit1(1:8) .eq. ' SCDAP') then ptitle(1:12) = ' SCDAP/3.2' ptitle(25:64) = 'Severe Accident Analysis Program ' else if (rtit1(1:8) .eq. ' RELAP5') then ptitle(1:12) = ' RELAP5/3.3' ptitle(25:64) = 'Reactor Loss Of Coolant Analysis Program' else if (rtit1(1:8) .eq. ' ATHENA') then ptitle(1:12) = ' ATHENA/3.2' ptitle(25:64) = 'Adv. Therm. Hyd. Energy Network Analyzer' else write (output,2001) 2001 format ('0$$$$$$$$ WARNING, program name on restart file is not r *ecognized.') endif *endif *if def,titlnrc * else * write (output,2001) *2001 format ('0$$$$$$$$ WARNING, program name on restart file is not r * *ecognized.') *endif endif return end
最新发布
03-11
<think>嗯,用户让我解释一段FORTRAN代码,特别是关于设置程序标题的部分,涉及RBIC、SCDAP、RELAP5和ATHENA的逻辑。首先,我需要回忆一下FORTRAN中如何处理字符串和变量声明。根据引用[2],FORTRAN的注释以!开头,代码中的注释可能已经解释了部分功能。用户提到的RBIC、SCDAP等可能是模块或子程序的名称,或者是某些特定库的标识。 接下来,我需要考虑FORTRAN中如何设置程序标题。通常,这可能涉及到字符串变量的声明和赋值,或者可能使用特定的子程序来输出标题信息。例如,可能有一个名为SETTITLE的子程序,用于初始化程序名称和版本号。用户提到的代码片段可能包含条件判断,根据不同的模块或参数设置不同的标题。 根据引用[1],FORTRAN中的判断语句有select case和if语句。可能在代码中,通过条件判断来确定当前使用的是哪个模块(如SCDAP或RELAP5),然后设置相应的标题。例如,使用IF语句检查某个控制变量,然后给标题变量赋值。ATHENA可能是一个独立的模块或版本,逻辑上可能有不同的处理方式。 另外,需要关注变量命名。例如,可能有一个字符型变量如PROGRAM_TITLE,通过不同的条件分支为其赋值不同的字符串。RBIC可能是一个缩写,需要结合上下文理解,比如反应堆安全分析代码的一部分。SCDAP和RELAP5是已知的核反应堆安全分析程序,可能在代码中被用作模块选择。 还要注意代码中的初始化部分,可能在主程序开始处调用设置标题的子程序,确保后续输出或日志中显示正确的程序名称和版本。此外,根据引用[3],环境配置中的编译和调试设置可能影响代码的运行,但用户主要关注逻辑部分,而不是环境配置。 需要确认代码中是否有字符拼接操作,例如将版本号或日期动态添加到标题中。FORTRAN中的字符串处理可能使用TRIM和ADJUSTL函数来调整格式。还可能存在版本控制的变量,如VERSION_NUMBER,通过条件判断选择正确的版本。 最后,用户可能想知道这些模块之间的关系,以及设置标题在整体程序中的作用。例如,不同的模块可能对应不同的物理模型,标题的设置有助于识别当前运行的配置,便于日志和结果追踪。需要将这些点整理成清晰的解释,帮助用户理解代码的功能和上下文。</think>### 解释FORTRAN代码功能及上下文 根据代码片段中提到的`RBIC`、`SCDAP`、`RELAP5`和`ATHENA`,这段代码可能用于**设置程序标题**或**模块标识**,其逻辑可能涉及以下方面: 1. **程序标题初始化** - 可能通过字符变量(如`PROGRAM_TITLE`)存储程序名称和版本号,例如: ```fortran CHARACTER(LEN=50) :: PROGRAM_TITLE PROGRAM_TITLE = "SCDAP/RELAP5 v3.2.1" ``` - 若包含`RBIC`(可能为反应堆安全分析代码的缩写)或`ATHENA`(另一种热工水力分析工具),则可能通过条件分支选择不同标题[^1]。 2. **模块选择逻辑** - 使用`IF`或`SELECT CASE`语句根据输入参数选择对应模块: ```fortran IF (MODULE_SELECT == 'SCDAP') THEN CALL SCDAP_INIT() ELSE IF (MODULE_SELECT == 'RELAP5') THEN CALL RELAP5_INIT() END IF ``` - `ATHENA`可能作为独立模块或兼容模式存在,通过特定标志(如`USE_ATHENA`)激活[^2]。 3. **版本兼容性处理** - 可能存在版本号检查逻辑,例如通过`VERSION_NUMBER`变量确保代码与依赖库(如`RBIC`)兼容: ```fortran IF (VERSION < 3.0) THEN WRITE(*,*) "Error: Requires RBIC v3.0 or higher" STOP END IF ``` ### 关键术语说明 - **SCDAP/RELAP5**: 核反应堆安全分析程序,用于模拟失水事故(LOCA)和热工水力行为。 - **ATHENA**: 热工水力分析工具,可能用于补充或替代部分RELAP5功能。 - **RBIC**: 可能指反应堆系统接口代码(Reactor Boundary Initial Conditions),用于初始化反应堆状态参数。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值