================
Forward modeling
================
The Controlled-Source Electromagnetic (CSEM) forward kernel in **PETGEM**
implements a three-dimensional forward solver based on a high-order vector
finite element method formulated on unstructured tetrahedral meshes. This
numerical approach ensures accurate representation of complex geological
structures and enables scalable computations on parallel architectures. The
kernel is optimized for high-order polynomial basis functions, allowing
enhanced accuracy in electromagnetic field simulations while reducing the
number of unknowns compared to low-order formulations.
Workflow
--------
The typical workflow for CSEM forward modeling in **PETGEM** consists of the
following steps (the shared stages are described in :doc:`overview`):
1. Generate or import a mesh using `Gmsh `_.
2. Define the subsurface conductivity model in ``sigmas.txt``.
3. Run ``utils/preprocess.py -mode forward`` to produce the input bundle and
the parameter file.
4. Execute the CSEM kernel (``fm.csem``) to perform the forward simulation.
5. Post-process the results with the case ``postprocess.py``.
Parameter files
***************
The forward parameter file (emitted by ``utils/preprocess.py``) provides the
link between the input bundle and the kernel execution. It carries the bundle
path and the solver configuration; the polynomial order is read from the
bundle's ``/nord`` dataset, not from the parameter file. A representative
forward parameter file is:
.. code-block::
-input_filename /input.h5
-dm_mat_type is
-ksp_type fgmres
-pc_type bddc
-pc_bddc_use_deluxe_scaling 1
-pc_bddc_coarse_pc_type lu
-output_dir /
-output_filename responses
where:
- ``-input_filename``: Path to the unified input bundle (HDF5).
- ``-ksp_type`` / ``-pc_type``: PETSc Krylov solver and preconditioner. The
default is FGMRES with the BDDC preconditioner (deluxe scaling, LU coarse
solve), which converges in a handful of iterations at low to moderate order.
- ``-output_dir`` / ``-output_filename``: Directory and base name for the
computed responses.
Source file
^^^^^^^^^^^
The ``-source_filename`` file describes the transmitter configuration for
forward modeling. It starts with the operating frequency, then one row per
source with its dipole parameters. The number of sources is determined
automatically by the number of non-empty lines after the frequency line. The
format is:
.. code-block::
freq
x_pos y_pos z_pos current length dip_angle azimuth_angle
x_pos y_pos z_pos current length dip_angle azimuth_angle
...
where:
- ``freq``: Operating frequency (Hz)
- ``x_pos y_pos z_pos``: Cartesian coordinates of the dipole position (m)
- ``current``: Source current amplitude (A)
- ``length``: Dipole length (m)
- ``dip_angle``: Dipole inclination angle (degrees)
- ``azimuth_angle``: Dipole azimuth angle (degrees)
The forward source file is embedded into the bundle by the preprocessing step;
inverse modeling uses a different, multi-frequency source file (see
:doc:`inverse_modeling`).
Receiver file
^^^^^^^^^^^^^
The ``-receiver_filename`` file specifies the receiver locations as a list of
Cartesian coordinates ``(x, y, z)``, one measurement point per row.
Running PETGEM
**************
A typical command for a parallel forward execution is:
.. code-block:: bash
mpirun -n 4 build/fm.csem -options_file path_to_params_file.txt
or, equivalently, through the unified dispatcher:
.. code-block:: bash
mpirun -n 4 build/petgem modeling -options_file path_to_params_file.txt
A complete, runnable walkthrough is given in :doc:`examples`.