最近在做一些WRF-Chem的开发工作,对源码里面的一些东西似懂非懂,借助Chatgpt增加了一些直观的认识,分享一下。
1、怎么理解WRF中的并行计算
WRF是一个用于天气和气候研究的数值模式,它需要对大量的气象数据进行处理和计算。由于气象数据的规模很大,需要非常强大的计算能力才能完成计算。因此,WRF采用了并行计算的方法,将计算任务分配给多个计算节点同时处理,以加快计算速度。
WRF的并行计算可以分为两个层面:水平并行和垂直并行。
水平并行是指将水平方向的计算任务分配给多个处理器进行处理。在WRF中,水平方向通常采用了MPI(Message Passing Interface)并行计算技术,MPI是一种消息传递库,可以在不同的计算节点之间传递消息和数据。
垂直并行是指将垂直方向的计算任务分配给多个处理器进行处理。在WRF中,垂直方向的计算通常采用了OpenMP并行计算技术,OpenMP是一种共享内存并行计算技术,可以将多个线程同时运行在同一个计算节点上。WRF的并行计算需要在编译时指定编译选项,以支持MPI和OpenMP的并行计算。在运行WRF模拟时,还需要通过设置运行参数,指定计算节点的数量和计算任务的分配方式等。
2、WRF中的Domain size:ids, ide, jds, jde, kds, kdeMemory size:ims, ime, jms, jme, kms, kmeTile size:its, ite, jts, jte, kts, kte,以及ips,ipe,jps,jpe都是什么?
在WRF中,Domain size指的是模拟的网格的范围,而Memory size指的是模拟需要的内存的范围。Tile size则是用于并行计算的,将整个模拟的网格分成若干个小网格,每个小网格就是一个Tile。
具体来说,它们的含义如下:
- • ids, ide, jds, jde, kds, kde:表示整个模拟的网格范围,即domain size。ids和jds表示起始的网格坐标,ide和jde表示终止的网格坐标,kds和kde则表示垂直方向的网格坐标。
- • ims, ime, jms, jme, kms, kme:表示整个模拟需要的内存范围,即memory size。它们通常比domain size要大一些,以便计算时可以使用一些附加的网格来处理边界条件等。
- • its, ite, jts, jte, kts, kte:表示每个Tile的网格范围。例如,its和jts表示Tile起始的网格坐标,ite和jte表示Tile终止的网格坐标,kte和kte则表示垂直方向的网格坐标。
- • ips, ipe, jps, jpe:表示每个Tile在整个模拟的网格中的位置。例如,ips和jps表示Tile左下角的网格坐标,ipe和jpe表示Tile右上角的网格坐标。
在WRF中,Tile size和Domain size的比率通常是2:1或4:1,这样可以保证每个Tile中都有足够的边界网格,以便计算时可以处理边界条件。同时,这种分块方式也有利于并行计算,因为可以将整个模拟分成若干个Tile,每个Tile可以在不同的计算节点上独立计算,从而提高计算效率。
3、WRF在实际运行中,是怎么实现its, ite, jts, jte, kts, kte并行计算的?
WRF在实际运行中通过MPI(Message Passing Interface)实现并行计算。MPI是一种用于在分布式计算机上进行通信和并行计算的标准接口。在WRF中,通过MPI将计算域分割为多个子域,每个子域由一组MPI进程负责计算。其中,its, ite, jts, jte, kts, kte参数描述了每个子域的空间范围。
WRF中的并行计算采用了一种称为“分块式”的方法。在这种方法中,每个MPI进程被分配一个块,其包含了该进程负责计算的部分计算域。每个MPI进程执行的计算步骤如下:
- • 读取输入数据,并将其在进程所负责的子域内广播;
- • 执行大气物理过程和动力学过程计算;
- • 在每个子域的边界处进行交换,以便将子域之间的数据同步;
- • 执行化学计算,将结果写入输出文件。
在每个步骤中,进程之间都需要进行通信,以便在不同的进程之间传输数据。通信的方式包括广播、归约、分发、收集等。
因为WRF采用MPI并行计算,因此可以运行在多台计算机上。每台计算机上运行多个MPI进程,这些进程在不同的计算节点之间进行通信,从而形成一个大规模的并行计算系统。
4、C语言中的指针与fortran语言中的指针有什么区别?
- • 内存模型不同:C语言的内存模型是连续的字节地址空间,而Fortran语言则支持非连续的内存分配。因此,在Fortran中,指针通常不是一个简单的地址,而是一个描述其非连续性的数据结构。
- • 指针的声明方式不同:在C语言中,指针的声明使用*,如int *p,而在Fortran中,指针的声明使用pointer关键字,如real, pointer :: p。
- • 指针的使用方式不同:在C语言中,指针可以被解引用,以便访问指向的内存地址的值,例如*p = 10。而在Fortran中,指针不能被直接解引用,必须使用关键字target和associate来实现类似的功能。也即C语言指针存储的是变量的地址(输出指针结果为地址),fortran语言中指针可视为变量的别名(输出指针结果为变量值)。若想输出地址则需要使用loc()函数。
- • 指针的生命周期不同:在C语言中,指针在变量作用域内保持有效,当指针超出作用域后,指向的内存可以被释放。而在Fortran中,指针的生命周期可以跨越多个子程序,因为它们可以被作为实参传递,并且可以被保存在堆栈或堆上的内存中。因此,在使用Fortran指针时需要更加注意内存管理的问题。