## 2 Materials and Methods
### Parallel Implementation of Forward Modelling  
It is a well-known fact that geophysical inversion problems imply a very high computational burden, which exponentially increases with the size of the geological setup under study. Several strategies to accelerate geophysical inversion algorithms in very diverse computing architectures have been developed. The selection of a particular approach to parallelize an inversion scheme heavily relies in both the nature of the particular inversion algorithm to be implementedas well as the available computing architecture in which the algorithm should be executed, and the programming paradigm. With respect to the computing architecture, it is well known that a deep acquaintance of the architecture leads to a very efficient parallel solution to the problem, which in turn becomes complicated because it requires programming skills at low level and a large development (coding) time. This is the case of using CUDA C for Graphics Processing Units (GPU) or Message Passing Interface (MPI) for memory distributed architectures like clusters or Xeon Phi Co-processors [48; 52; 53]. As one of the goals of this paper is to make this research accessible to the greatest possible part of the geophysical and related communities, the acceleration of the herein presented algorithms are based on shared memory CPU-based architectures. In this sense, shared processing architectures, as multi-socket-multi-core machines, are more common each day, even in home personal computers. To increase the computing power, the trend during the last 20 years has been to increase the number of integrated cores in the same chip. This is the case, for instance, of Intel Xeon W-3175X(r), with 28 physical cores able to manage up to 56 processing threads, as well as the AMD Ryzen Threadripper 3990X(r), with 64 physical cores, able to manage 128 execution threads. These vertiginous technological advancements in shared memory architectures should be exploited to solve problems of high computational burden as those of geophysics. In this sense, it is necessary to use programming paradigms which allow the community to center the attention in the geophysical problem rather than in the low-level programming implementation of the algorithm. In this sense, OpenMP has practically become a standard for the parallel programming of Symmetric Multi-Processing (SMP) systems in order to execute a code without the necessity to write low-level instructions, as POSIX Threads (pthreads). OpenMP is a set of functions and directives for C, FORTRAN and C++, which delegates the generation of the low-level parallel instructions to the compiler. Although OpenMP alleviates the code development burden for the programmer, he is still in charge of the design of the parallel algorithm. Thus, a deficient design of the parallel strategy is prone to a deficient performance. OpenMP has benefited several geophysical problems [48; 52]. OpenMP also provides an implicit parallelism model which produces medium granularity tasks for MT applications, providing a higher computational abstraction than MPI. It is highly portable between platforms and its ease of usage allows significant parallelism with some directives inserted in the serial code, diminishing (sometimes dramatically) the development costs of parallelization [54]. In exchange of these features, OpenMP does not provide code execution speed-ups as those provided by a carefully parallel implementation of the algorithm in MPI. The inversion of potential data by the growth of bodies is an algorithm which explores different individual solutions (prisms) that gradually diminish the misfit between observed and computed data, finally yielding the best configuration of models in the search space. The main time drawback of this algorithm is that it fits just one prism per iteration. The algorithm's parallelization steps are:  
1. OpenMP performs the division of the total search space by the available processing threads.